关于docker:Dockerfile中RUN和CMD之间的区别

Difference between RUN and CMD in a Dockerfile

我对何时应该使用CMDRUN感到困惑。 例如,要执行bash / shell命令(即ls -la),我将始终使用CMD,或者是否存在使用RUN的情况? 试图了解有关这两个类似的Dockerfile指令的最佳实践。


RUN是映像构建步骤,RUN命令后的容器状态将提交给Docker映像。一个Dockerfile可以具有许多RUN步骤,这些步骤彼此叠加以构建映像。

CMD是启动构建映像时容器默认执行的命令。一个Dockerfile只能有一个CMD。使用docker run $image $other_command启动容器时,可以覆盖CMD

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


RUN-在构建Docker映像时触发命令。

CMD-在启动创建的docker映像时触发命令。


我发现本文对理解它们之间的区别非常有帮助:

跑 -
RUN指令允许您安装应用程序和软件包
所需的。它在当前图像的顶部执行任何命令
并通过提交结果来创建一个新层。通常你会发现
Dockerfile中有多个RUN指令。

CMD-
CMD指令可让您设置默认命令,该命令为
仅在运行容器而不指定命令时执行。
如果Docker容器使用命令运行,则默认命令为
忽略了。如果Dockerfile具有多个CMD指令,则除最后一条以外的所有指令
CMD指令将被忽略。


运行-安装Python,您的容器现在已将python刻录到其映像中

CMD-python hello.py,运行您喜欢的脚本


RUN命令:
在构建映像时,RUN命令基本上将执行默认命令。它还将提交图像更改以进行下一步。

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

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

如果docker文件具有多个1个CMD命令,则除最后一个命令外,所有其他命令都将被忽略。由于此命令将不执行任何操作,而只是设置默认命令。


Note: Don’t confuse RUN with CMD. RUN actually runs a command and
commits the result; CMD does not execute anything at build time, but
specifies the intended command for the image.

来自docker文件参考

https://docs.docker.com/engine/reference/builder/#cmd