我不知道什么时候应该使用CMD vs RUN。例如,要执行bash/shell命令(即ls -la),我总是使用CMD,或者有一种情况下我会使用RUN?试图理解这两个类似Dockerfile指令的最佳实践。


当前回答

RUN是一个映像构建步骤,运行命令后容器的状态将被提交给容器映像。Dockerfile可以有许多RUN步骤,这些步骤层层叠加在一起构建映像。

CMD是容器在启动构建的映像时默认执行的命令。Dockerfile将只使用最终定义的CMD。当使用docker命令$image $other_command启动容器时,可以覆盖CMD。

ENTRYPOINT也与CMD密切相关,可以修改容器从映像启动的方式。

其他回答

RUN:可以有很多,在构建过程中使用,例如安装多个库

CMD:只能有1,这是你的执行起点(例如["npm", "start"], ["node", "app.js"])

RUN是一个映像构建步骤,运行命令后容器的状态将被提交给容器映像。Dockerfile可以有许多RUN步骤,这些步骤层层叠加在一起构建映像。

CMD是容器在启动构建的映像时默认执行的命令。Dockerfile将只使用最终定义的CMD。当使用docker命令$image $other_command启动容器时,可以覆盖CMD。

ENTRYPOINT也与CMD密切相关,可以修改容器从映像启动的方式。

RUN -安装Python,你的容器现在已经将Python烧录到它的映像中 CMD - python hello.py,运行您最喜欢的脚本

运行命令: 当我们构建映像时,RUN命令基本上会执行默认命令。它还将提交下一步的图像更改。

可以有多个RUN命令,以帮助构建新映像的过程。

CMD命令: CMD命令将为新容器设置默认命令。这将不会在构建时执行。

如果docker文件有超过1个CMD命令,那么除了最后一个命令外,其他命令都将被忽略。因为这个命令不会执行任何东西,只是设置默认命令。

在RUN和CMD上已经有足够的答案。我只想就ENTRYPOINT补充几句话。CMD参数可以被命令行参数覆盖,而ENTRYPOINT参数总是被使用。

这篇文章是一个很好的信息来源。