我是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上看到我的应用程序
答案 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对CMD
,ENTRYPOINT
和RUN
命令的JSON数组形式非常挑剔。如果没有将某些内容解析为JSON数组,它将默默地退回到将其视为普通命令的方式,该命令将隐式包装在/bin/sh -c '...'
调用中。那就是您在这里看到的。
如果您将Dockerfile编辑为在CMD
行中用双引号引起来并重建映像,那么您会看到
$ docker run --rm 58114fa1fdb4
python manage.py runserver 0.0.0.0:8000
,如果您实际上COPY
进行了编码,请使用Python基本图像,然后删除该调试echo
,这就是您要执行的命令。