什么会导致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,build 481bc77,在我的本地主机上运行docker-compose版本1.11.1,build 7c5d5e4。
发布于 2019-05-24 06:54:12
如果您的Dockerfile中没有定义命令(CMD),您将从from镜像中获取上行值。compose文件有一些用于构建映像的设置,但大多数值都定义了如何运行映像。在没有合成文件(docker vs docker- compose )的情况下直接运行图像时,不会获得合成文件中定义的运行时设置,只会获得烘焙到图像中的Dockerfile设置。
修复方法是使用您的撰写文件,或者在Dockerfile中定义CMD,如下所示:
CMD ./myscript.py --no-wait --tracebackhttps://stackoverflow.com/questions/56283572
复制相似问题