CMD 与 ENTRYPOINT 的区别

一、介绍

Dockerfile 中可以使用 CMD 与 ENTRYPOINT 指令来运行容器中的应用程序。这两个指令很容易混淆,但它们有着不同的作用和目的。

二、CMD

CMD 的作用是为容器提供默认的命令或程序,它可以被 Dockerfile 中的其他指令覆盖(如 RUN)。CMD 可以被用户在容器启动时指定的命令覆盖,这是因为 docker run 命令参数中的命令会替代 Dockerfile 中的 CMD 指令。

一般使用 CMD 命令来定义一个容器的默认进程。如果 Dockerfile 中有多个 CMD 命令,只有最后一个 CMD 命令会生效。

下面是一些 CMD 指令的示例:

# 默认执行 /bin/sh -c "echo 'hello world'"

CMD ["echo", "hello world"]

# 默认执行 nginx -g "daemon off;"

CMD ["nginx", "-g", "daemon off;"]

# 默认执行 sh

CMD []

三、ENTRYPOINT

ENTRYPOINT 的作用是在容器启动时运行指定的命令或程序,而不是在 Dockerfile 中给容器提供一个默认命令。ENTRYPOINT 可以在启动容器的时候被覆盖,但是在覆盖后的命令后面仍然可以传递参数。

指定 ENTRYPOINT 有两种方法,一种是使用一般的格式,如:

ENTRYPOINT ["executable", "param1", "param2"]

另一种是使用 shell 格式,如:

ENTRYPOINT command param1 param2

在 Dockerfile 中只能使用其中一种,不能使用两种格式。

下面是一些 ENTRYPOINT 指令的示例:

# 使用可执行文件作为 ENTRYPOINT

ENTRYPOINT ["/bin/echo"]

# 使用 shell 格式作为 ENTRYPOINT

ENTRYPOINT echo

# ENTRYPOINT 和 CMD 组合使用

ENTRYPOINT ["mysqld"]

CMD ["--datadir=/var/lib/mysql", "--user=mysql"]

四、区别

CMD 和 ENTRYPOINT 的区别可以总结为以下几点:

1. CMD 可以被覆盖,而 ENTRYPOINT 不可以被完全覆盖,但可以在命令后传递参数。

2. CMD 可以在 Dockerfile 中出现多次,但只有最后一个 CMD 命令会生效,而 ENTRYPOINT 只能出现一次。

3. CMD 是为容器提供默认命令或程序,而 ENTRYPOINT 是在容器启动时运行指定的命令或程序。

4. 在 Dockerfile 中定义多个 CMD 指令,后面的会替换前面的。

5. 如果 Dockerfile 包含多个 ENTRYPOINT 命令,则只有最后一个命令会生效。

5、案例说明

1. 使用 CMD 命令的案例

FROM nginx

CMD ["nginx", "-g", "daemon off;"]

这个 Dockerfile 构建的镜像中包含的默认命令是 nginx -g daemon off;,也就是启动 nginx 服务器并且不以 daemon 的方式运行。当使用 docker run 命令来运行这个容器时,可以不指定命令,这时 CMD 指令定义的默认命令会被执行。

2. 使用 ENTRYPOINT 命令的案例

FROM ubuntu

ENTRYPOINT ["sleep"]

CMD ["10"]

这个 Dockerfile 构建的镜像中包含的默认命令是 sleep 10,也就是启动容器并睡眠 10 秒钟。当使用 docker run 命令来运行这个容器时,如果指定了一个新的命令,比如 docker run mycontainer echo hello world,那么这个新命令会被添加到 ENTRYPOINT 后面,就会变成 sleep 10 echo hello world,容器将会睡眠 10 秒钟,然后输出 hello world。

参考文献:

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

https://docs.docker.com/engine/reference/builder/#entrypoint 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(110) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部