Форма оболочки в файле docker-compose не вызывает командную оболочку? - PullRequest
0 голосов
/ 12 сентября 2018

Я всегда предполагал, что параметр конфигурации службы команда в файле 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.

1 Ответ

0 голосов
/ 12 сентября 2018

Да, это ожидаемое поведение, потому что, когда вы упоминаете "CMD ping google.de -c 9999999" в Dockerfile, докер добавляет / bin / sh -c в качестве выполнения по умолчанию и путь для этого выполнения "/ bin / sh"который является первым аргументом в CMD для проверки, проверьте его в команде проверки docker

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

Если вы добавите «ping google.de -c 9999999» в команду docker-compose, путь выполнения изменится на «ping ", который является первым аргументом в команде

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

Команда в docker-compose не добавляет" / bin / sh -c "в качестве выполнения по умолчанию, потому что docker-compose оборачивается над докеромизображение и переопределяет весь CMD в Dockerfile (который включает в себя «/ bin / sh -c» в CMD).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...