[英]Dockerized django container not producing local migrations file
我是 docker 的初学者; 这是我用它建立的第一个项目,并不特别知道我在做什么。 如果有人能给我一些建议,让我知道从 dockerized django 应用程序迁移到本地存储的最佳方法,我将不胜感激
我有一个本地 django 项目设置,文件结构如下:
Project
.docker
-Dockerfile
project
-data
-models
- __init__.py
- user.py
- test.py
-migrations
- 0001_initial.py
- 0002_user_role.py
...
settings.py
...
manage.py
Makefile
docker-compose.yml
...
在当前 state 中,test.py model 的迁移尚未运行; 所以我尝试使用docker-compose exec main python manage.py makemigrations
来这样做。 这成功返回以下内容:
Migrations for 'data':
project/data/migrations/0003_test.py
- Create model Test
但没有产生本地文件。 但是,如果我探索容器的文件系统,我可以看到该文件存在于容器本身上。
运行以下命令后:
docker-compose exec main python manage.py migrate
我收到:
Running migrations:
No migrations to apply.
Your models in app(s): 'data' have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
我的印象是,即使这没有创建本地文件,它至少会在容器上运行迁移。
无论如何,我的意图是,当我运行docker-compose exec main python manage.py makemigrations
时,它将文件本地存储在project/data/migrations
文件夹中,然后我只是手动运行migrate
。 我找不到太多关于如何执行此操作的文档; 我看到的唯一一篇建议绑定安装的帖子( Migrations files not created in dockerized Django )我试图通过将以下内容添加到我的docker-compose
文件中:
volumes:
- type: bind
source: ./data/migrations
target: /var/lib/migrations_test
但我一直在努力让它工作,从这里开始,我不知道如何使用 docker-compose 通过这个卷运行命令,我怀疑这是否是一个好主意,因为我在某处读到使用绑定不是最佳实践坐骑。
docker-compose.yml
文件如下所示:
version: '3.7'
x-common-variables: &common-variables
ENV: 'DEV'
DJANGO_SETTINGS_MODULE: 'project.settings'
DATABASE_NAME: 'postgres'
DATABASE_USER: 'postgres'
DATABASE_PASSWORD: 'postgres'
DATABASE_HOST: 'postgres'
CELERY_BROKER_URLS: 'redis://redis:6379/0'
volumes:
postgres:
services:
main:
command:
python manage.py runserver 0.0.0.0:8000
build:
context: ./
dockerfile: .docker/Dockerfile
target: main
environment:
<<: *common-variables
ports:
- '8000:8000'
env_file:
- dev.env
networks:
- default
postgres:
image: postgres:13.6
volumes:
- postgres:/var/lib/postgresql/data
ports:
- '25432:5432'
environment:
POSTGRES_PASSWORD: 'postgres'
command: postgres -c log_min_messages=INFO -c log_statement=all
wait_for_dependencies:
image: dadarek/wait-for-dependencies
environment:
SLEEP_LENGTH: '0.5'
redis:
image: redis:latest
ports:
- '16379:6379'
worker:
build:
context: .
dockerfile: .docker/Dockerfile
target: main
command: celery -A project worker -l INFO
environment:
<<: *common-variables
volumes:
- .:/code/delegated
env_file:
- dev.env
networks:
- default
beat:
build:
context: .
dockerfile: .docker/Dockerfile
target: main
command: celery -A project beat -l INFO
environment:
<<: *common-variables
volumes:
- .:/code/delegated
env_file:
- dev.env
networks:
- default
networks:
default:
Makefile:
build: pre-run
build:
docker-compose build --pull
dev-deps: pre-run
dev-deps:
docker-compose up -d postgres redis
docker-compose run --rm wait_for_dependencies postgres:5432 redis:6379
migrate: pre-run
migrate:
docker-compose run --rm main python manage.py migrate
setup: build dev-deps migrate
up: dev-deps
docker-compose up -d main
Dockerfile:
FROM python:3.10.2 as main
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
RUN mkdir -p /code
WORKDIR /code
ADD . ./
RUN useradd -m -s /bin/bash app
RUN chown -R app:app .
USER app
EXPOSE 8000
volumes:
- type: bind
source: C:\dev\Project
target: /code/
这会在我的Project
文件夹中创建一个空目录; 名为C:\dev\Project\project
但应用程序没有运行,因为它找不到manage.py
文件...我认为这是因为它在父目录Project
中并再次尝试:
volumes: - type: bind source: C:\dev\Project target: /code/
但是出现了同样的问题。 为什么要创建空目录? 确定它应该只是将现有目录与容器目录绑定吗? 同样使用这种方法,我是否需要更改我的Dockerfile
以不首先将代码库复制到容器中,而是将其挂载到容器中?
我设法通过将以下内容添加到我的 docker 撰写中的“主要”服务来修复它:
volumes:
- .:/code:delegated
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.