所以我通过docker-compose部署了django,postgress和nginx容器,我有一个问题,我似乎无法解决。
为了解决我的Django应用程序中的以下错误,我知道我必须运行Django迁移。
docker@postgres ERROR: relation "accounts_myprofile" does not exist
在尝试运行迁移时,我尝试了:
docker-compose run web python manage.py makemigrations
docker-compose run web python manage.py migrate
它返回以下内容:
Migrations for 'accounts':
accounts/migrations/0001_initial.py:
- Create model Entry
- Create model MyProfile
Running migrations:
No migrations to apply.
我只能从Django容器中成功迁移,例如:
docker exec -i -t 6dc97c6a305c /bin/bash
python manage.py makemigrations
python manage.py migrate
虽然我已经解决了这个问题,但我仍然不明白为什么通过docker-compose运行迁移实际上不会迁移任何东西。我希望有人能在这件事上给我指出正确的方向。
另外,我不知道这是否是相关的问题,但当我运行docker-compose run web命令时,它们似乎正在创建新的容器,除非我手动停止它们,否则不会关闭它们,docker-compose stop不会删除它们。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7bb3c7106d1 accounts_web "python manage.py che" 4 hours ago Restarting (0) 41 minutes ago 8000/tcp accounts_web_run_62
ee19ca6cdf49 accounts_web "python manage.py mig" 4 hours ago Restarting (0) 43 minutes ago 8000/tcp accounts_web_run_60
2d87ee35de3a accounts_web "python manage.py mak" 4 hours ago Restarting (0) 43 minutes ago 8000/tcp accounts_web_run_59
1c6143c13097 accounts_web "python manage.py mig" 4 hours ago Restarting (1) 44 minutes ago 8000/tcp accounts_web_run_58
6dc97c6a305c b1cb7debb103 "python manage.py run" 3 days ago Up 4 hours 8000/tcp accounts_web_1
注意: Docker-compose stop将在底部正确地停止容器(这是应该的),但通过docker-compose run web python manage.py migrate创建的其他容器将需要手动停止。
我的docker-compose
web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app
- /usr/src/app/static
env_file: .env
environment:
DEBUG: 'true'
command: python manage.py runserver 0.0.0.0:8000
postgres:
restart: always
image: kartoza/postgis:9.4-2.1
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data/
发布于 2017-01-03 13:18:06
docker-compose run创建新容器
你已经注意到这个问题了。使用docker-compose run
时,会创建一个新容器。
当您运行第一个命令( makemigrations )时,将创建一个新容器,运行makemigrations,并将迁移文件写入(新)容器的文件系统。
当您运行第二个命令(migrate)时,将创建另一个新容器。迁移运行了,但它与此无关。这是因为迁移文件不可用-它们是在与这个新容器不同的容器中编写的。
你可以用几种方法来解决这个问题。
使用docker-compose exec
首先,你可以做你已经做过的事情,但是使用docker-compose exec
而不是run
。
docker-compose exec web python manage.py makemigrations
docker-compose exec web python manage.py migrate
exec
将使用已经运行的容器,而不是创建新的容器。
使用入口点脚本
另一种选择是使用入口点脚本并在服务器启动之前在那里运行迁移。如果你想让事情变得更加自动化,这就是你要走的路。
Dockerfile:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
entrypoint.sh:
#!/bin/sh
python manage.py makemigrations
python manage.py migrate
exec "$@"
docker-compose.yml (在‘web’下):
entrypoint: /entrypoint.sh
在此场景中,当容器启动时,入口点脚本将运行,处理迁移,然后移交给command
(在本例中为Django runserver
)。
新的容器永远循环
正如您所注意到的,新的容器将继续运行。这通常是意想不到的,因为您用应该退出(而不是继续运行)的命令覆盖了该命令。但是,在docker-compose.yml中,您指定了restart: always
。因此,它们将一遍又一遍地运行迁移命令,每次命令退出时都会重新启动。
发布于 2019-09-21 00:59:15
Dan Lowe给了一个非常好的回答,但是入口点脚本对我不起作用。问题是,一些"makemigrations“期望你的输入,例如"yes"/"no”。
你可以用以下语句来补充Dan Lowe的回答:
python manage.py makemigrations --noinput
而不是
python manage.py makemigrations
(这至少适用于简单的“是”/“否”问题)
发布于 2021-02-04 02:19:31
这个awnser是对Dan Lowe和Rexcirus回答的补充。
为了在de CodeBuild e Fargate期间很好地工作,我做了一些更改:
Dockefile:
COPY ./docker/entrypoint.sh /usr/local/bin/
COPY ./docker/entrypoint.sh /${projectName}/
# backwards compat
RUN ln -s usr/local/bin/entrypoint.sh /
ENTRYPOINT ["entrypoint.sh"]
CMD ["entrypoint.sh"]
./docker/entrypoint.sh
#!/bin/sh
python manage.py makemigrations --noinput
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
现在一切运行正常。
https://stackoverflow.com/questions/41435014
复制相似问题