Dockerfile - best practices说
在哪种情况下应使用 shell 形式?
最佳答案
Shell形式将调用命令Shell并执行该Shell通常处理的常规命令处理(例如替换环境变量$HOME
)。 exec表单不会那样做。
这与SHELL
指令密切相关。
Dockerfile中可以有多个SHELL
命令,但只有一个CMD
。 CMD
用于指定容器启动时应运行的内容。 SHELL
指令将覆盖各种命令(RUN
,CMD
,ENTRYPOINT
)的shell形式使用的默认shell。
使用此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
请注意,当它运行shell模式命令(同时使用默认的shell和bash)时,$ PATH已扩展,但在使用exec模式运行时未扩展。
关于docker - Docker CMD-什么时候应该使用 shell 形式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60530319/