繁体   English   中英

Dockerized django 容器不生成本地迁移文件

[英]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

根据diptangsu-goswami的回复跟进

我尝试添加以下内容:
 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM