Django在Docker容器中运行:makemigrations和migrate看不到app';s型号发射
我让Django在Docker容器中运行。我的Docker文件的CMD只运行一个脚本launch.sh,其中包含以下命令:Django在Docker容器中运行:makemigrations和migrate看不到app';s型号发射,django,docker,migrate,makemigrations,Django,Docker,Migrate,Makemigrations,我让Django在Docker容器中运行。我的Docker文件的CMD只运行一个脚本launch.sh,其中包含以下命令: python manage.py makemigrations --no-input --verbosity 1 python manage.py migrate --no-input --verbosity 1 因此,这些命令在Django项目上进行迁移,然后在容器启动时执行迁移(如果有)。这与特定项目级迁移的预期效果相同 但是,不可避免地,只进行项目级迁移——也就是说
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应用程序Dokerfile以查看
WORKDIR
# In my case it is /app
WORKDIR /app
并更改launch.sh文件
更新
这取决于您将launch.sh
文件复制到
容器
如果您在/app
目录中复制了Django应用程序的所有文件
COPY . /app
然后将launch.sh文件复制到它之外,就像
COPY ./<path to launch file>/launch.sh /launch.sh
但是,如果您将launch.sh复制到/app/
中作为
COPY ./<path to launch file>/launch.sh /app/launch.sh
现在,当您使用docker exec-it运行命令时,它将运行
在工作目录中查找manage.py文件
我也有同样的问题。 我想在你的Django应用程序目录中一定有一个
migrations/\uuuu init\uuuu.py
。
确保已将其复制到容器中。
我的解决方案是在中更改一行。Dockrignore:
app/migrations/*
toapp/migrations/0*
我应该声明我正在使用Django 2.0、Python 3和最新版本的Docker。另一条可能相关的信息:我的Django项目不在Docker容器中。相反,它存在于本地文件系统中,并在启动时通过Docker运行选项装入容器中。谢谢!我可以试一下,但是:1)它没有解释为什么在同一位置的容器中手动执行相同的命令时会起作用;2)我不必改变我的项目结构来实现这一点,因为它非常标准:my manage.py与我的项目和我的应用程序位于同一个父目录中,这些命令应该可以找到项目范围内的所有迁移。@CarlF.Hostetter check update部分,希望这有助于您也可以发布您的DockerFile
# should prepend `/app/`
python /app/manage.py migrate --noinput
COPY ./<path to launch file>/launch.sh /app/launch.sh
python manage.py migrate --noinput