首页 > 解决方案 > Django/Docker:未检测到迁移且未应用

问题描述

堆栈:Django/Docker/Docker-compose/Postgresql(不在容器中)

我进行了修改,包括模型更新、保存并推送到我的远程 Gitlab 存储库。

然后,我从 preprod 服务器上的 Gitlab 存储库中提取了修改,我可以看到服务器上有修改后的版本。

但是当我停止并重新启动容器时,它不会检测到任何更改并且不会应用迁移。我还检查了,该entrypoint.preprod.sh文件包含makemigrationsandmigrate命令。

我尝试过重建它docker-compose build然后运行它,但它不再起作用了。

我尝试直接连接到我的容器 ( docker exec -it web sh) 但未makemigrations检测到,因此未应用迁移。

我一定错过了什么,但是什么?

docker-compose-preprod.yml

version: '3.7'

services:
    web:
        restart: always
        container_name: virage_web
        build: 
            context: ./app
            dockerfile: Dockerfile.preprod
        restart: always
        command: gunicorn core.wsgi:application --bind 0.0.0.0:8000
        volumes:
            - app_volume:/usr/src/app
            - static_volume:/usr/src/app/static
            - media_volume:/usr/src/app/media
        expose:
            - 8000
        env_file:
            - ./.env.preprod
        entrypoint: [ "/usr/src/app/entrypoint.preprod.sh" ]
        depends_on:
            - redis
        healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:8000/"]
            interval: 30s
            timeout: 10s
            retries: 50
            
    redis:
        container_name: virage_redis
        image: "redis:alpine"

    celery:
        container_name: virage_celery
        build: 
            context: ./app
            dockerfile: Dockerfile.preprod
        command: celery -A core worker -l info
        volumes:
            - app_volume:/usr/src/app
        env_file:
            - ./.env.preprod
        depends_on:
            - web
            - redis

    celery-beat:
        container_name: virage_celery-beat
        build: 
            context: ./app
            dockerfile: Dockerfile.preprod
        command: celery -A core beat -l info
        volumes:
            - app_volume:/usr/src/app
        env_file:
            - ./.env.preprod
        depends_on:
            - web
            - redis           
  
    nginx:
        container_name: virage_nginx
        build: ./nginx
        restart: always
        volumes:
            - static_volume:/usr/src/app/static
            - media_volume:/usr/src/app/media
        ports:
            - 1350:80
        depends_on:
            - web


volumes:
    static_volume:
    media_volume:
    app_volume:

Dockerfile.preprod

# Pull the official base image
FROM python:3.8.3-alpine

# Set a work directory
WORKDIR /usr/src/app

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install psycopg2 dependencies
RUN apk update && apk add postgresql-dev gcc g++ python3-dev musl-dev

RUN apk --update add libxml2-dev libxslt-dev libffi-dev musl-dev libgcc openssl-dev curl postgresql-client
RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev nano
RUN pip3 install psycopg2 psycopg2-binary

# install xgettext for i18n
RUN apk add gettext

# Install dependencies
COPY requirements/ requirements/
RUN pip install --upgrade pip && pip install -r requirements/preprod.txt

# Copy the entrypoint.sh file
COPY entrypoint.preprod.sh .

# Copy the initdata sql file
COPY initdata.preprod.sql .

# Copy the project's files
COPY . .
RUN chmod +x entrypoint.preprod.sh

入口点.preprod.sh

#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

# python manage.py flush --no-input
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --no-input
python manage.py makemessages -l fr
python manage.py compilemessages



exec "$@"

标签: djangodockerdocker-compose

解决方案


推荐阅读