所以我正在通过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运行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创建的另一个容器运行web python manage.py migrate,需要手动停止。 / p>
我的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/
答案 0 :(得分:30)
您已经注意到了这个问题。使用$regis = $this->pdo->query('call user_regis(a,a,a,a,a)');
if($regis->fetchColumn > 0){ echo "hai" ; }
时,会创建一个新容器。
运行第一个命令(makemigrations)时,会创建一个新容器,运行makemigrations,并将迁移文件写入(新)容器的文件系统。
运行第二个命令(migrate)时,会创建另一个新容器。迁移运行了,但它没有任何关系。那是因为迁移文件不可用 - 它们是用不同的容器写的。
您可以通过多种方式解决此问题。
首先,您可以执行已经执行的操作,但请使用docker-compose run
代替docker-compose exec
。
run
docker-compose exec web python manage.py makemigrations
docker-compose exec web python manage.py migrate
将使用已经运行的容器,而不是创建新容器。
另一种选择是在服务器启动之前使用入口点脚本并在那里运行迁移。如果您希望事情更加自动化,那么这就是您的选择。
Dockerfile:
exec
entrypoint.sh:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
docker-compose.yml(在'web'下):
#!/bin/sh
python manage.py makemigrations
python manage.py migrate
exec "$@"
在这种情况下,当容器启动时,入口点脚本将运行,处理您的迁移,然后切换到entrypoint: /entrypoint.sh
(在本例中为Django command
)。
正如您所注意到的,新容器仍在运行。这通常是意料之外的,因为你用一个应该退出的命令(而不是保持运行)覆盖了命令。但是,在docker-compose.yml中,您指定了runserver
。因此,他们将反复运行迁移命令,每次命令退出时重新启动。
答案 1 :(得分:1)
这个 awnser 是对 Dan Lowe 和 Rexcirus 回应的补充。
为了在 de CodeBuild e Fargate 期间运行良好,我做了一些更改:
文件:
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
现在一切正常。
答案 2 :(得分:0)
Dan Lowe给出了一个很好的答案,但是入口点脚本对我不起作用。问题是某些“ makemigrations”需要输入,例如“ yes” /“ no”。
您可以用以下方法补充Dan Lowe的答案:
python manage.py makemigrations --noinput
代替
python manage.py makemigrations
(这至少适用于简单的“是” /“否”问题)
答案 3 :(得分:0)
import {sm} from './media';