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

时间:2019-09-07 19:03:36

标签: django docker dockerfile

我是docker的新手,我试图为Django应用程序创建一个Image。 我已经使用以下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>

我无法在本地主机上访问该应用程序:8000

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您需要在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,这就是您要执行的命令。