一、介绍
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/
发表评论 取消回复