Docker django仅在我指定命令时运行

Docker django仅在我指定命令时运行,django,docker,dockerfile,Django,Docker,Dockerfile,我是docker的新手,我试图为我的Django应用程序创建一个映像。 我使用以下Dockerfile创建了该图像 FROM python:3.6-slim-buster WORKDIR /app COPY . /app RUN pip install -r Requirements.txt EXPOSE 8000 ENTRYPOINT ["python", "manage.py"] CMD ["runserver", '0.0.0.0:8000'] 问题是当我使用 docke

我是docker的新手,我试图为我的Django应用程序创建一个映像。 我使用以下Dockerfile创建了该图像


FROM python:3.6-slim-buster

WORKDIR /app

COPY . /app

RUN pip install -r Requirements.txt

EXPOSE 8000

ENTRYPOINT ["python", "manage.py"]

CMD ["runserver", '0.0.0.0:8000']

问题是当我使用
docker-run-p 8000:8000

我无法访问本地主机中的应用程序:8000

但是如果我使用命令运行容器
docker run-p 8000:8000 runserver 0.0.0.0:8000


我可以在localhost:8000中看到我的应用程序,我认为您只能使用Entrypoint命令。
尝试:

FROM python:3.6-slim-buster

WORKDIR /app

COPY . /app

RUN pip install -r Requirements.txt

EXPOSE 8000

ENTRYPOINT ["python", "manage.py", "runserver", "0.0.0.0:8000"]

或者,您可以使用该行编写脚本文件(entrypoint.sh)。也许您可以在同一个文件中运行makemigrations和migrations。

您需要将
CMD
行中的单引号更改为双引号

让我们使用这个简化的Dockerfile:

FROM alpine
ENTRYPOINT ["echo", "python", "manage.py"]
CMD ["runserver", '0.0.0.0:8000']
现在构建并运行它:

$ docker build .
...
Successfully built 24d598ae4182
$ docker run --rm 24d598ae4182
python manage.py /bin/sh -c ["runserver", '0.0.0.0:8000']
Docker对
CMD
ENTRYPOINT
RUN
命令的JSON数组形式非常挑剔。如果某个东西没有解析为JSON数组,它将悄悄地退回到将其作为普通命令处理,这将隐式地包装在
/bin/sh-c'…'
调用中。这就是你在这里看到的

如果您编辑我的Dockerfile,使其在
CMD
行中有双引号,然后重新生成图像,您将看到

$ docker run --rm 58114fa1fdb4
python manage.py runserver 0.0.0.0:8000

如果你真的
复制
代码,使用Python基本映像,并删除调试
echo
,那就是你想要执行的命令。

如果你运行第一个命令会发生什么?(您是否从Django收到任何错误消息或输出?)。将
CMD
中的单引号更改为双引号是否有帮助?@DavidMaze没有错误,容器运行,但我无法访问应用程序。更改为双引号或单引号没有任何区别。谢谢,这很有效。你能解释一下为什么这个方法有效而我的方法无效吗?是的,你可以在这里看到cmd和entrypoint之间的区别。您可以使用其中之一,这取决于您是否需要在exec命令上运行。您的代码和我的代码之间的区别在于,我只使用一行,命令和参数作为字符串数组。代码在下一行执行两个命令:python manage.py和runserver ip:port