什么会导致Docker映像不运行其docker-compose.yaml文件中指定的命令?
我有一个类似Dockerfile的文件:
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir -p /code
WORKDIR /code
COPY ./pip-requirements.txt pip-requirements.txt
COPY ./code /code/
RUN pip install --trusted-host pypi.python.org -r pip-requirements.txt
还有一个docker-compose.yaml文件,如:
version: '3'
services:
worker:
container_name: myworker
image: registry.gitlab.com/mygitlabuser/mygitlabproject:latest
network_mode: host
build:
context: .
dockerfile: Dockerfile
command: ./myscript.py --no-wait --traceback
如果我使用以下方法在本地构建并运行此程序:
docker-compose -f docker-compose.yaml up
脚本运行了几分钟,我得到了预期的输出。运行docker ps -a
显示按预期方式创建了一个名为“ myworker”的容器。
我现在想通过下载并在远程服务器上运行该映像,将该映像上传到存储库,并将其部署到生产环境中。
我用以下方法重建图像:
docker-compose -f docker-compose.yaml build
,然后使用:
docker login registry.gitlab.com
docker push registry.gitlab.com/myuser/myproject:latest
此操作成功,我确认新图像已存在于我的gitlab图像存储库中。
然后我登录生产服务器并使用以下命令下载图像:
docker login registry.gitlab.com
docker pull registry.gitlab.com/myuser/myproject:latest
再次,此操作通过docker报告成功:
Status: Downloaded newer image for registry.gitlab.com/myuser/myproject:latest
运行docker images
和docker ps -a
不会显示任何现有图像或容器。
但是,这是很奇怪的地方。如果然后尝试使用以下命令运行此图像:
docker run registry.gitlab.com/myuser/myproject:latest
似乎什么都没有发生。运行docker ps -a
将显示一个带有命令“ python2”的容器,并且名称“ gracious_snyder”已创建,与我的图像不匹配。它还说,该容器在发射后立即退出。运行docker logs gracious_snyder
不会显示任何内容。
这是怎么回事?为什么我的图像没有运行正确的命令?几乎就像它忽略了我的docker-compose.yaml文件中的所有参数,并恢复为基本python2.7图像中的默认值一样,但是我不知道为什么会这样,因为我是使用docker-compose来构建该图像的在本地运行良好。
我正在运行Docker版本18.09.6,在本地和远程主机上均构建481bc77,而docker-compose版本1.11.1,在我的本地主机上构建7c5d5e4。
答案 0 :(得分:2)
没有在Dockerfile中定义的命令(CMD),您将从FROM映像获取上游值。撰写文件具有一些用于生成映像的设置,但是大多数值都定义了如何运行映像。当直接运行映像而没有撰写文件(docker vs docker-compose)时,您不会获得在撰写文件中定义的运行时设置,仅将Dockerfile设置烘焙到映像中。
解决方法是使用撰写文件,或在Dockerfile中定义CMD,例如:
CMD ./myscript.py --no-wait --traceback