Docker镜像运行不正确的命令

时间:2019-05-23 22:14:37

标签: docker

什么会导致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 imagesdocker 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。

1 个答案:

答案 0 :(得分:2)

没有在Dockerfile中定义的命令(CMD),您将从FROM映像获取上游值。撰写文件具有一些用于生成映像的设置,但是大多数值都定义了如何运行映像。当直接运行映像而没有撰写文件(docker vs docker-compose)时,您不会获得在撰写文件中定义的运行时设置,仅将Dockerfile设置烘焙到映像中。

解决方法是使用撰写文件,或在Dockerfile中定义CMD,例如:

CMD ./myscript.py --no-wait --traceback