Форма оболочки вызовет командную оболочку и выполнит обычную обработку команд, которую обычно обрабатывает оболочка (например, подстановка переменных среды, таких как $HOME
). Форма exe c не делает этого.
Это тесно связано с директивой SHELL
.
В Dockerfile может быть несколько команд SHELL
, но только одна CMD
. CMD
используется для указания того, что контейнер должен запускаться при запуске. Директива SHELL
перезапишет оболочку по умолчанию, которая используется в форме оболочки различных команд (RUN
, CMD
, ENTRYPOINT
).
Использование этого Dockerfile иллюстрирует это лучше, чем я мог бы объяснить:
FROM python:3.6
RUN echo $PATH
SHELL ["/bin/bash" ,"-c"]
RUN echo $PATH
RUN ["echo", "$PATH"]
COPY run.sh /run.sh
ENTRYPOINT ["/run.sh"]
Приведет к этому при запуске docker build
:
$ docker build .
Sending build context to Docker daemon 5.12kB
Step 1/7 : FROM python:3.6
---> 5bf410ee7bb2
Step 2/7 : RUN echo $PATH
---> Running in 3a08d7c4450c
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Removing intermediate container 3a08d7c4450c
---> 85b4da5d8e5d
Step 3/7 : SHELL ["/bin/bash" ,"-c"]
---> Running in da1b90ac14f2
Removing intermediate container da1b90ac14f2
---> ed747f0862a6
Step 4/7 : RUN echo $PATH
---> Running in 5c6a86e133ff
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Removing intermediate container 5c6a86e133ff
---> 8ec42f23d390
Step 5/7 : RUN ["echo", "$PATH"]
---> Running in cc0650a6d8e8
$PATH
Removing intermediate container cc0650a6d8e8
---> 8b11432adb3a
Step 6/7 : COPY run.sh /run.sh
---> a168c58738e7
Step 7/7 : ENTRYPOINT ["/run.sh"]
---> Running in f9e28048d139
Removing intermediate container f9e28048d139
---> d20920ea562c
Successfully built d20920ea562c
Обратите внимание, что когда он запускал команды режима оболочки (используя оболочку по умолчанию и bash), $ PATH был расширен, но не при запуске в режиме exe c.