编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Dockerfile: ENTRYPOINT vs CMD一

wxchong 2025-04-09 21:33:31 开源技术 11 ℃ 0 评论

当查看Dockerfile 里面使用到的指令时候,有几个可能一开始就显得多余(或者说至少部分重叠)。我们已经讲解了ADD 和 COPY区别。现在我们在看看Dockerfile: ENTRYPOINT vs CMD。

ENTRYPOINT和CMD 都可以让你指定镜像的启动命令。但是它们之间有些微妙的区别。很多次,你要选择一个或另一个,但他们也可以一起使用。我们一起来看看这些问题。

ENTRYPOINT or CMD

基本上,当容器从镜像中启动时候,这两个命令都可以让你识别哪些可执行文件需要运行。事实上,如果你想要你的镜像可运行的(不需要额外的docker run 命令 行参数),你必须指定 ENTRYPOINT 或者CMD。

试着运行一个没有声明ENTRYPOINT 或者 CMD的镜像就会产生错误:

$ docker run alpine

FATA[0000] Error response from daemon: No command specified

许多Docker hub 上的Linux发行版本基础镜像会使用一个shell 比如/bin/sh 或者 /bin/bash作为CMD执行命令。这意味着任何运行这些镜像的人都会默认进入到一个交互的shell(当然,假设他们使用-i和-t 标签)

这对于通常使用是有意义的。但是你或许想要为你的镜像选择一个更加明确的CMD 或者 ENTRYPOINT。

覆盖

你的Dockerfile 中指定的ENTRYPOINT or CMD 作为默认的可执行命令。但是,用户可以选择在运行时覆盖这些值。

比如,看看下面的Dockerfile

FROM ubuntu:trusty

CMD ping localhost

如果我们build 这个镜像,并且运行它我们会看到下面的输出:

$ docker run -t demo

PING localhost (127.0.0.1) 56(84) bytes of data.

64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.051 ms

64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.038 ms

^C

--- localhost ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 999ms

rtt min/avg/max/mdev = 0.026/0.032/0.039/0.008 ms

你可以看到当容器启动时候,ping 命令自动运行。但是我们可以在启动容器时候,通过在镜像名字后面指定一个 参数来覆盖默认CMD。

$ docker run demo hostname

6c1573c0d4c0

这个案例中,hostname 会执行。

默认的ENTRYPOINT 可以同样得被覆盖。但是需要使用--entrypoint标签:

$ docker run --entrypoint hostname demo

075a2fa95ab7

考虑到CMD更容易被覆盖,推荐Dockerfile 中使用CMD。比如,你有一个Ruby镜像,将要默认(CMD irb)启动一个交互的irb 会话,但是你也想要给用户选择启动一个专用的Ruby 脚本。

未完待续

。。。。。。


。。。。。。

每天三分钟,知识效率高。轻文章,更高效。

欢迎关注同名微信公众账号DevOps24h。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表