0

我让 Django 在 Docker 容器中运行。我的 Docker 文件的 CMD 只运行一个脚本,launch.sh,其中包括以下命令:

python manage.py makemigrations --no-input --verbosity 1
python manage.py migrate --no-input --verbosity 1

因此,这些命令在我的 Django 项目上进行迁移,然后在我的容器启动时执行迁移(如果有的话)。这适用于特定的项目级迁移。

然而,不可避免的是,进行了项目级别的迁移——也就是说,从未进行过应用级别的迁移,因此也从未执行过。但是,如果我登录到容器(使用 docker exec -it ... bash)并手动执行相同的迁移命令,则会进行应用程序级别的迁移。

谷歌搜索和对我的代码的众多变体并没有为这种行为或任何修复提供任何解释,所以我很难过。

有任何想法吗?

PS这是我的项目和应用程序结构:

/django/
    project/
    app/
    static/
    manage.py

此外,我尝试在我的脚本中连续两次执行相同的命令集,并连续运行相同的命令集,但将我的应用程序指定为目标选项,但这些尝试仍然产生相同的结果:只有项目迁移是制作的,而不是应用程序迁移。

如被问及,这是我的 Dockerfile:

FROM python:3-slim
ENV PYTHONUNBUFFERED 1 
ADD django-requirements.pip . 
RUN pip install --upgrade pip && \ 
    pip install --no-cache-dir -r django-requirements.pip 
WORKDIR / 
ADD launch.sh . 
CMD ./launch.sh 

我的 Django 项目在启动时安装在 /django,并且在运行迁移命令之前,我的启动脚本 CD 到 /django。

4

2 回答 2

1

检查您的 Django 应用程序 DockerfileWORKDIR

# In my case it is /app
WORKDIR /app

并更改您的 launch.sh文件

# manage.py will be inside working dir 
python /app/manage.py migrate --noinput

更新

这取决于您launch.sh在容器内复制文件的位置。

如果您在/appdir中复制了 Django 应用程序的所有文件

COPY . /app

并将您的launch.sh文件复制到它之外

COPY ./<path to launch file>/launch.sh /launch.sh

然后在launch.sh中你必须使用manage.py作为

# should prepend `/app/` 
python /app/manage.py migrate --noinput 

但是如果你把launch.sh里面复制/app/了。

COPY ./<path to launch file>/launch.sh /app/launch.sh

然后您可以像传统方式一样使用 migrate 命令

python manage.py migrate --noinput 

现在,当您使用docker exec -it container-id运行命令时,它会在工作目录中运行并找到manage.py文件。

于 2018-05-04T18:25:56.360 回答
0

我有完全相同的问题。我认为您的 Django 应用程序目录中必须有一个migrations/__init__.py。确保将其复制到容器中。我的解决方案是将 .dockerignore: 中的一行更改 app/migrations/*app/migrations/0*.

于 2018-08-30T09:40:45.767 回答