网站首页 > 开源技术 正文
当查看Dockerfile 里面使用到的指令时候,有几个可能一开始就显得多余(或者说至少部分重叠)。我们已经讲解了ADD 和 COPY区别。现在我们在看看Dockerfile: ENTRYPOINT vs CMD。
ENTRYPOINT和CMD 都可以让你指定镜像的启动命令。但是它们之间有些微妙的区别。很多次,你要选择一个或另一个,但他们也可以一起使用。我们一起来看看这些问题。
ENTRYPOINT or CMD
基本上,当容器从镜像中启动时候,这两个命令都可以让你识别哪些可执行文件需要运行。事实上,如果你想要你的镜像可运行的(不需要额外的docker run 命令 行参数),你必须指定 ENTRYPOINT 或者CMD。
试着运行一个没有声明ENTRYPOINT 或者 CMD的镜像就会产生错误:
$ docker run alpineFATA[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:trustyCMD ping localhost
如果我们build 这个镜像,并且运行它我们会看到下面的输出:
$ docker run -t demoPING 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 hostname6c1573c0d4c0
这个案例中,hostname 会执行。
默认的ENTRYPOINT 可以同样得被覆盖。但是需要使用--entrypoint标签:
$ docker run --entrypoint hostname demo075a2fa95ab7
考虑到CMD更容易被覆盖,推荐Dockerfile 中使用CMD。比如,你有一个Ruby镜像,将要默认(CMD irb)启动一个交互的irb 会话,但是你也想要给用户选择启动一个专用的Ruby 脚本。
未完待续
。。。。。。
。。。。。。
每天三分钟,知识效率高。轻文章,更高效。
欢迎关注同名微信公众账号DevOps24h。
猜你喜欢
- 2025-04-09 docker容器安装与部署,常用命令、容器卷、dockerfile,详细教程
- 2025-04-09 pytorch的一个最简单的cpp扩展(pytorch cdist)
- 2025-04-09 如何编译.Net 6 Runtime源码(编译framework)
- 2025-04-09 微软Windows 11将改版BSOD、强制登录账号才能安装
- 2025-04-09 windows环境下配置sphinx输出html文档
- 2025-04-09 超详细windows安装配置WSL2(ubuntu20.04)步骤
- 2025-04-09 微软Win11预览版隐藏特性:新增配置答疑区域
- 2025-04-09 本想搞清楚ESM和CJS模块的转换问题,没想到写完我的问题更多了
- 2025-04-09 微软Win11预览版隐藏特性:开始菜单右键新增左 / 右移动选项
- 2025-04-09 怎样使用Swift创建命令行脚本(1)(swift操作)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)