执行时机
RUN:镜像构建阶段。每个RUN相当于打开一个终端执行一次命令,执行完成后关闭,所以RUN不能用来执行单独的临时配置命令,如:
RUN export LANG=C
以上写法就是错误的,因为“export LANG=C”是进行临时配置,关闭当前终端这个配置就会失效。
CMD:容器启动阶段。
执行次数
RUN:有多少个RUN就执行多少次,每一个RUN相当于一个镜像层。 CMD:每个Dockerfile只有最后一个CMD生效,容器启动时可以被命令行参数覆盖,例如输入命令:
Docker run -it mylinux:latest id
则命令“id”会覆盖生成镜像mylinux:latest所用的Dockerfile中CMD所指定的命令。
执行目的
RUN:执行命令并修改镜像,执行结果会打包进镜像层。
CMD:为容器启指定默认启动命令,仅在容器启动时执行。