问题
我是 Docker 的初学者;这是我用它建立的第一个项目,我并不特别知道我在做什么。如果有人能给予我一些建议,我会非常感激什么是最好的方法来获得从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
...
在当前状态下,www.example.com模型的迁移test.py尚未运行;所以我尝试使用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:
生成文件:
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
停靠文件:
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
根据diptangsu-goswami的回复进行跟进
我尝试添加以下内容:
volumes:
- type: bind
source: C:\dev\Project\project
target: /code/
这将在我的Project
文件夹中创建一个空目录;名为C:\dev\Project\project
,但应用程序无法运行,因为它找不到manage.py
文件...我认为这是因为它位于父目录Project
中,并使用以下命令重试:
volumes:
- type: bind
source: C:\dev\Project
target: /code/
但是同样的问题发生了。为什么它创建了一个空目录?它应该只是把现有目录和容器目录绑定在一起吗?同样使用这个方法,我是否需要改变我的Dockerfile
,一开始不把代码库复制到容器中,而只是把它挂载在容器上?
1条答案
按热度按时间c86crjj01#
我设法修复它添加以下到我的'主'服务在我的docker组成: