首页 文章

docker-compose文件中的Shell表单不会调用命令shell?

提问于
浏览
0

我一直假设docker-compose文件中的服务配置参数command等同于Dockerfile中的CMD . 但是壳形式与执行形式似乎存在差异 . 使用docker-compose时,shell形式的命令不会在shell中运行 .

例如,我有这个Dockerfile,它使用shell形式:

FROM debian
CMD ping google.de -c 9999999

我构建并运行图像:

$ docker build -f Dockerfile.shell-ping-debian -t test-image-shell-ping-debian .
$ docker run -ti test-image-shell-ping-debian

根据该文档,ping在shell中执行:

$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS               NAMES
51344da31794        test-image-shell-ping-debian   "/bin/sh -c 'ping go…"   49 seconds ago      Up 48 seconds                           quirky_bohr
$ docker top 51344da31794
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                21478               21460               0                   10:10               pts/0               00:00:00            /bin/sh -c ping google.de -c 9999999
root                21524               21478               0                   10:10               pts/0               00:00:00            ping google.de -c 9999999

现在,我在docker-compose文件中做同样的事情 .

version: '3.3'

services:
  shell-service:
    image: debian
    command: ping google.de -c 9999999

我再次构建并运行:

$ docker-compose build
$ docker-compose up

但在这种情况下,ping命令不在shell中运行!

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
7fdcf4fc27db        debian              "ping google.de -c 9…"   13 minutes ago      Up 6 seconds                            execvsshell_shell-service_1
$ docker top 7fdcf4fc27db
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                22618               22597               0                   10:15               ?                   00:00:00            ping google.de -c 9999999

这是预期的行为吗?

我正在使用Docker 17.12和Docker-Compose 1.18.0 .

1 回答

  • 0

    这是预期的行为,因为当你在Dockerfile中提到“CMD ping google.de -c 9999999”时,docker将/ bin / sh -c添加为默认执行和执行路径“/ bin / sh”,这是CMD中的第一个参数用于验证在docker inspect命令中检查它

    "Path": "/bin/sh",
        "Args": [
            "-c",
            "ping google.de -c 9999999"
        ],
    

    如果在docker-compose命令中添加“ping google.de -c 9999999”,则执行路径将更改为“ping”,这是命令中的第一个参数

    "Path": "ping",
        "Args": [
            "google.de",
            "-c",
            "9999999"
        ],
    

    docker-compose中的命令不会将“/ bin / sh -c”添加为默认执行,因为docker-compose包裹在docker镜像上方并覆盖Dockerfile中的整个CMD(其中包含“/ bin / sh -c”) CMD) .

相关问题