Django在Docker容器中运行:makemigrations和migrate在启动时看不到应用程序的模型

问题描述 投票:0回答:2

我让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)并手动执行相同的迁移命令,则会进行应用程序级别的迁移并执行。

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

有任何想法吗?

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

/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,然后再运行迁移命令。

django docker migrate makemigrations
2个回答
1
投票

检查你的Django应用程序Dockerfile以获取qazxsw poi

WORKDIR

并更改您的launch.sh文件

# In my case it is /app
WORKDIR /app

UPDATE

这取决于您在容器内复制# manage.py will be inside working dir python /app/manage.py migrate --noinput 文件的位置。

如果您在launch.sh目录中复制了Django应用程序的所有文件

/app

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

COPY . /app

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

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

但是如果你将# should prepend `/app/` python /app/manage.py migrate --noinput 中的launch.sh复制为。

/app/

然后您可以使用migrate命令作为传统方式

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

现在当你使用docker exec -it python manage.py migrate --noinput 运行命令时,它在内部工作DIR中运行并找到manage.py文件。


0
投票

我有完全相同的问题。我认为你的Django app dir必须有一个container-id。确保将其复制到容器中。我的解决方案是将.dockerignore:migrations/__init__.py中的一行更改为app/migrations/*

© www.soinside.com 2019 - 2024. All rights reserved.