我总是假设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。
这是预期的行为,因为当你在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)。