Я всегда предполагал, что параметр конфигурации службы команда в файле docker-compose эквивалентен CMD в файле Docker. Но, похоже, есть разница относительно формы оболочки против формы exec . При использовании docker-compose команды, заданные в форме оболочки , не запускаются в оболочке.
Например, у меня есть этот Dockerfile, который использует shell 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
Согласно документу, пинг выполняется в оболочке:
$ 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 не запускается в оболочке!
$ 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.