【问题标题】:Docker django runs only if I specify the commandDocker django 仅在我指定命令时运行
【发布时间】:2019-09-07 19:03:36
【问题描述】:

我是 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 <image-tag>

我无法在我的 localhost:8000 中访问应用程序

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

我可以在 localhost:8000 中看到我的应用程序

【问题讨论】:

  • 如果你运行第一个命令会发生什么? (您是否从 Django 收到任何错误消息或输出?)。将CMD中的单引号改为双引号有帮助吗?
  • @DavidMaze 没有错误,容器运行但我无法访问该应用程序。更改为双引号或单引号没有区别。

标签: django docker dockerfile


【解决方案1】:

我认为您只能使用 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。

【讨论】:

  • 谢谢,这行得通。你能解释一下为什么这行得通而我的方法不行吗?
  • 是的,你可以在这里看到goinbigdata.com/docker-run-vs-cmd-vs-entrypoint cmd和entrypoint的区别。您可以使用其中之一,这取决于您是否需要在 exec 命令上运行。你的代码和我的代码之间的区别在于我只使用了一行,命令和参数作为字符串数组。您的代码在下一行执行两个命令,python manage.py 和 runserver ip:port
【解决方案2】:

您需要将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 对 CMDENTRYPOINTRUN 命令的 JSON 数组形式非常挑剔。如果某些东西没有被解析为 JSON 数组,它将默默地退回到将其视为普通命令,这将被隐式包装在 /bin/sh -c '...' 调用中。这就是你在这里看到的。

如果您编辑我的 Dockerfile 以在 CMD 行中添加双引号并重建映像,那么您会看到

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

如果你真的在 COPY 中编码,使用 Python 基础镜像,并删除调试 echo,这就是你要执行的命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多