Joh*_*ohn 72 django docker docker-compose
我已经按照Docker站点上的Django Quick Start说明严格设置了Docker Django/PostgreSQL应用程序.
我第一次运行Django的manage.py migrate,使用该命令sudo docker-compose run web python manage.py migrate,它按预期工作.数据库是在Docker PostgreSQL容器内构建的.
Django应用程序本身的更改同样反映在Docker Django容器中,我保存它们的那一刻.这很棒!
但是如果我然后在Django中更改模型,并尝试更新Postgres数据库以匹配模型,则不会检测到任何更改,因此无论我运行多少次makemigrations或migrate再次运行都不会发生迁移.
基本上,每次我更改Django模型时,我都必须删除Docker容器(使用sudo docker-compose rm)并重新启动新的迁移.
我仍然试图让我的头围绕Docker,并且有很多我不明白它是如何工作的,但是这个让我疯狂.为什么不迁移看到我的更改?我究竟做错了什么?
Lou*_*iro 70
您只需登录正在运行的docker容器并运行命令即可.
docker-compose build -f path/to/docker-compose.ymldocker-compose up -f path/to/docker-compose.ymldocker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fcc49196a84 ex_nginx "nginx -g 'daemon off" 3 days ago Up 32 seconds 0.0.0.0:80->80/tcp, 443/tcp ex_nginx_1
66175bfd6ae6 ex_webapp "/docker-entrypoint.s" 3 days ago Up 32 seconds 0.0.0.0:32768->8000/tcp ex_webapp_1
# postgres docker container ...
Run Code Online (Sandbox Code Playgroud)
docker exec -t -i 66175bfd6ae6 bash
Run Code Online (Sandbox Code Playgroud)
现在您已登录,然后转到右侧文件夹: cd path/to/django_app
现在,每次编辑模型时,都要在容器中运行:python manage.py makemigrations和python manage.py migrate
我还建议您使用docker-entrypoint为您的django docker容器文件自动运行:
这是一个例子(docker-entrypoint.sh):
#!/bin/bash
# Collect static files
echo "Collect static files"
python manage.py collectstatic --noinput
# Apply database migrations
echo "Apply database migrations"
python manage.py migrate
# Start server
echo "Starting server"
python manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)
Sal*_*Din 41
我用这些方法:
services:
web:
build: .
image: uzman
command: python manage.py runserver 0.0.0.0:8000
ports:
- "3000:3000"
- "8000:8000"
volumes:
- .:/code
depends_on:
- migration
- db
migration:
image: uzman
command: python manage.py migrate --noinput
volumes:
- .:/code
depends_on:
- db
Run Code Online (Sandbox Code Playgroud)
使用docker我们制作的层次结构,服务迁移在设置数据库之后和运行主服务之前运行.现在,当您运行服务时,docker将在运行服务器之前运行迁移; 看看migration服务器应用于与Web服务器相同的映像,这意味着所有迁移都将从您的项目中获取,从而避免出现问题.
你可以通过这种方式避免使用入口点或其他任何东西.
小智 32
您可以使用docker-entrypoint.sh或更新的解决方案将是您的多个评论docker-compose.yml
version: '3.7'
services:
web:
build: ./
command: >
sh -c "python manage.py collectstatic --noinput &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- ./:/usr/src/app/
ports:
- 8000:8000
env_file:
- ./.env
depends_on:
- postgres
postgres:
image: postgres:13.0-alpine
ports:
- 5432:5432
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
Run Code Online (Sandbox Code Playgroud)
Oli*_*haw 24
线程有点旧.但到目前为止还没有列出另一种方法.
让你的堆栈运行,然后启动一次性docker-compose运行命令.例如
#assume django in container named web
docker-compose run web python3 manage.py migrate
Run Code Online (Sandbox Code Playgroud)
https://docs.docker.com/compose/reference/run/
Sup*_*ova 16
您可以使用docker exec命令
docker exec -it container_id python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
如果你有这样的东西 docker-compose.yml
version: "3.7"
services:
app:
build:
context: .
dockerfile: docker/app/Dockerfile
ports:
- 8000:8000
volumes:
- ./:/usr/src/app
depends_on:
- db
db:
image: postgres
restart: always
environment:
POSTGRES_USER: docker
POSTGRES_PASSWORD: docker
POSTGRES_DB: docker
Run Code Online (Sandbox Code Playgroud)
然后你可以简单地运行...
~$ docker-compose exec app python manage.py makemigrations
~$ docker-compose exec app python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
使用 docker exec,我收到以下错误:
AppRegistryNotReady("Models aren't loaded yet.")
Run Code Online (Sandbox Code Playgroud)
所以我改用这个命令:
docker-compose -f local.yml run django python manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41472 次 |
| 最近记录: |