Docker中的RUN CMD和ENTRYPOINT
总结下Docker中的RUN CMD和ENTRYPOINT区别
命令 | 用途 | 备注 |
---|---|---|
RUN | 执行命令并创建新的镜像层 | 在当前镜像的顶部执行命令,并通过创建新的镜像层,经常用于安装软件包,Dockerfile 中常常包含多个 RUN 指令 |
CMD | 设置容器启动后默认执行的命令及其参数 | 此命令会在容器启动且 docker run 没有指定其他命令时运行(CMD 能够被 docker run 后面跟的命令行参数替换) |
ENTRYPOINT | 配置容器启动时运行的命令 | 让容器以应用程序或者服务的形式运行 |
RUN
RUN 指令通常用于安装应用和软件包。
RUN 在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile 中常常包含多个 RUN 指令。
RUN 有两种格式:
- Shell 格式:
RUN
- Exec 格式:
RUN ["executable", "param1", "param2"]
下面是使用 RUN 安装多个包的例子:
RUN apt-get update && apt-get install -y \ |
注意:apt-get update 和 apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 apt-get install 在单独的 RUN 中执行,则会使用 apt-get update 创建的镜像层,而这一层可能是很久以前缓存的。
CMD
CMD 指令允许用户指定容器的默认执行的命令。
此命令会在容器启动且 docker run 没有指定其他命令时运行。
- 如果
docker run
指定了其他命令,CMD 指定的默认命令将被忽略。 - 如果
Dockerfile
中有多个 CMD 指令,只有最后一个 CMD 有效。
CMD 有三种格式:
- Exec 格式:
CMD ["executable","param1","param2"]
这是 CMD 的推荐格式。
2.CMD ["param1","param2"]
为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式。 - Shell 格式:
CMD command param1 param2
Exec 和 Shell 格式前面已经介绍过了。
第二种格式 CMD ["param1","param2"]
要与 Exec 格式 的 ENTRYPOINT 指令配合使用,其用途是为 ENTRYPOINT 设置默认的参数。我们将在后面讨论 ENTRYPOINT 时举例说明。
下面看看 CMD 是如何工作的。Dockerfile 片段如下:
CMD echo "Hello world" |
运行容器 docker run -it [image]
将输出:Hello world
但当后面加上一个命令,比如 docker run -it [image] /bin/bash
,CMD 会被忽略掉,命令 bash 将被执行:
ENTRYPOINT
ENTRYPOINT
指令可让容器以应用程序或者服务的形式运行。
ENTRYPOINT
看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT
不会被忽略,一定会被执行,即使运行 docker run
时指定了其他命令。
ENTRYPOINT
有两种格式:
- Exec 格式:
ENTRYPOINT ["executable", "param1", "param2"]
这是 ENTRYPOINT 的推荐格式。 - Shell 格式:
ENTRYPOINT command param1 param2
在为ENTRYPOINT
选择格式时必须小心,因为这两种格式的效果差别很大。
Exec 格式
ENTRYPOINT
的 Exec
格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。
ENTRYPOINT
中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。
比如下面的 Dockerfile 片段:
ENTRYPOINT ["/bin/echo", "Hello"] |
当容器通过 docker run -it [image]
启动时,输出为:Hello world
而如果通过 docker run -it [image] CloudMan
启动,则输出为:Hello CloudMan
Shell 格式
ENTRYPOINT
的 Shell
格式会忽略任何CMD
或docker run
提供的参数。