Разве две формы `command` docker comppose ведут себя по-разному? - PullRequest
1 голос
/ 21 апреля 2020

В Dockerfile мы можем указать CMD в одной из трех различных форм:

...

  • CMD ["executable","param1","param2"] ( exe c форма, это предпочтительная форма)
  • CMD ["param1","param2"] ( в качестве параметров по умолчанию для ENTRYPOINT )
  • CMD command param1 param2 ( shell form)

...

Если вы используете форму оболочки CMD, тогда <command> будет выполняться в /bin/sh -c:

FROM ubuntu
CMD echo "This is a test." | wc -

Если вы хотите запустить <command> без оболочки, вы должны express команду как массив JSON и указать полный путь к исполняемому файлу. Эта форма массива является предпочтительным форматом CMD. Любые дополнительные параметры должны быть индивидуально выражены в виде строк в массиве:

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

Источник

In docker -составить мы также можем использовать две различные формы для его command:

...

Переопределить команду по умолчанию.

command: bundle exec thin -p 3000

Команда также может быть списком, аналогично dockerfile:

command: ["bundle", "exec", "thin", "-p", "3000"]

Источник

Выполните эти две разные формы в docker -compose ведут себя так же, как формы exe c и shell в Dockerfile do?

1 Ответ

1 голос
/ 21 апреля 2020

Нет, они не делают. docker -compose command всегда использует эквивалент формы Dockerfile exe c. Это можно легко увидеть с помощью быстрой демонстрации:

Dockerfile с shell обрабатывает символы оболочки форм:

FROM alpine:3.11.5
CMD echo foo && echo bar
$ docker run example
foo
bar

Dockerfile с exe c* Форма 1013 * не обрабатывает оболочку:

FROM alpine:3.11.5
CMD ["echo", "foo", "&&", "echo", "bar"]
$ docker run example
foo && echo bar

docker Первая команда формы -compose не выполняет обработку оболочки:

version: "3.7"

services:
  example:
    image: alpine:3.11.5
    command: echo foo && echo bar
$ docker-compose up
Starting example_example_1 ... done
Attaching to example_example_1
example_1  | foo && echo bar
example_example_1 exited with code 0

И вторая форма команды docker -compose также не указана:

version: "3.7"

services:
  example:
    image: alpine:3.11.5
    command: ["echo", "foo", "&&", "echo", "bar"]
$ docker-compose up
Starting example_example_1 ... done
Attaching to example_example_1
example_1  | foo && echo bar
example_example_1 exited with code 0


Итак, если вы хотите обработку оболочки в docker -compose он должен быть явно включен, передав команду sh -c:

version: "3.7"

services:
  example:
    image: alpine:3.11.5
    command: sh -c "echo foo && echo bar"
$ docker-compose up
Starting example_example_1 ... done
Attaching to example_example_1
example_1  | foo
example_1  | bar
example_example_1 exited with code 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...