Docker CMD-什么时候应该使用shell表单?

Docker CMD-什么时候应该使用shell表单?,docker,dockerfile,Docker,Dockerfile,说 CMD几乎总是以CMD[executable]的形式使用, 参数1,参数2…] 在哪种情况下应该使用shell形式?几乎从不;如果需要一个shell命令,只需调用带有括号格式CMD[bash,myscript.sh]的脚本即可。shell形式的问题在于它打破了关机状态:几乎从不;如果需要一个shell命令,只需调用带有括号格式CMD[bash,myscript.sh]的脚本即可。shell表单的问题在于它打破了关机状态:对于CMD,仅当您需要仅在shell中提供的功能时才需要shell表单-

CMD几乎总是以CMD[executable]的形式使用, 参数1,参数2…]


在哪种情况下应该使用shell形式?

几乎从不;如果需要一个shell命令,只需调用带有括号格式CMD[bash,myscript.sh]的脚本即可。shell形式的问题在于它打破了关机状态:

几乎从不;如果需要一个shell命令,只需调用带有括号格式CMD[bash,myscript.sh]的脚本即可。shell表单的问题在于它打破了关机状态:

对于CMD,仅当您需要仅在shell中提供的功能时才需要shell表单-如果您的CMD包含环境变量引用$ARG、多个命令a和b、管道| tee…,或重定向2>&1。如果您有这样一个特别复杂的CMD,那么最好将其移动到shell脚本中,您可以在Docker之外独立测试该脚本,并使用默认CMD调用该脚本

RUN技术上也有同样的考虑。但是,在同一个运行指令中运行多个命令是很常见的,这需要shell形式。几乎我见过的每一条跑步路线都使用shell形式

入口点应始终是JSON数组形式。请记住,入口点作为参数传递命令;如果使用shell表单,则会有效地忽略这些参数。同样,如果需要在入口点中执行复杂的操作,包括exec$@来运行命令,请将其拆分为单独的shell脚本,并使用JSON数组语法调用它。

对于CMD,只有在需要仅在shell中提供的功能时才需要shell表单-如果CMD包含环境变量引用$ARG,多个命令a和b、管道| T…,或重定向2>&1。如果您有这样一个特别复杂的CMD,那么最好将其移动到shell脚本中,您可以在Docker之外独立测试该脚本,并使用默认CMD调用该脚本

RUN技术上也有同样的考虑。但是,在同一个运行指令中运行多个命令是很常见的,这需要shell形式。几乎我见过的每一条跑步路线都使用shell形式


入口点应始终是JSON数组形式。请记住,入口点作为参数传递命令;如果使用shell表单,则会有效地忽略这些参数。同样,如果您需要在入口点中执行复杂的操作,包括exec$@来运行该命令,请将其拆分为单独的shell脚本,并使用JSON数组语法调用它。

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时将导致以下情况:


请注意,当它同时使用默认shell和bash运行shell模式命令时,扩展了$PATH,但在使用exec模式运行时没有扩展。

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时将导致以下情况:

请注意,当它使用默认shell和bash运行shell模式命令时,扩展了$PATH,但在使用exec模式运行时没有扩展