停靠的django容器不生成本地迁移文件

inkz8wg9  于 2022-12-14  发布在  Go
关注(0)|答案(1)|浏览(130)

问题

我是 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,一开始不把代码库复制到容器中,而只是把它挂载在容器上?

c86crjj0

c86crjj01#

我设法修复它添加以下到我的'主'服务在我的docker组成:

volumes:
      - .:/code:delegated

相关问题