Dockerfile ENTRYPOINT 入口点
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观
ENTRYPOINT
的功能和 CMD 一样,都用于指定容器启动程序以及参数,格式如下:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
注意:如果 Dockerfile 中存在多个 ENTRYPOINT 指令,仅最后一个生效。
ENTRYPOINT 和 CMD 的不同之处
对于 CMD
指令, 执行 docker run
命令如果有传递参数,这些参数是可以覆盖 Dockerfile 中的CMD
指令参数,但是对于 ENTRYPOINT
来说,这些参数会被传递给 ENTRYPOINT
,而不是覆盖。
如果想覆盖 Dockerfile 中
ENTRYPOINT
参数,需要在执行docker run
命令时使用--entrypoint
选项。
接下来,举例一个场景,让我们更容易理解 ENTRYPOINT
的应用场景:
ENTRYPOINT 应用场景
假设我们需要一个打印当前公网 IP 的镜像,那么可以先用 CMD
来实现, Dockerfile 文件如下:
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
CMD [ "curl", "-s", "http://myip.ipip.net" ]
然后,执行 docker build -t myip .
来构建镜像,如果需要打印当前公网 IP,只需要执行:
$ docker run myip
当前 IP:61.148.226.66 来自:北京市 联通
这么看起来好像可以直接把镜像当做命令使用了,不过是命令总有参数,如果我们希望加参数呢?
比如从上面的 CMD
中可以看到实质的命令是 curl
,如果我们希望显示 HTTP 头信息,就需要加上 -i
参数。那么我们可以直接加 -i
参数给 docker run myip
么?
$ docker run myip -i
会报如下错误:
docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"-i\\\": executable file not found in $PATH\"\n".
上面已经说到,docker run
传递的参数会替换 CMD
的默认值 ,因此这里的 -i
替换了原来的 CMD
,而不是添加在原来的 curl -s http://myip.ipip.net
后面, 而 -i
根本不是命令,所以自然找不到报错。
那么如果希望支持 -i
这参数,我们就必须重新完整的输入这个命令:
$ docker run myip curl -s http://myip.ipip.net -i
这显然不是一个优雅的解决方案,这个时候 ENTRYPOINT
就上场了, 因为它可以传递参数,而不是覆盖。现在我们重新用 ENTRYPOINT
来实现这个镜像:
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://myip.ipip.net" ]
这次我们再来尝试直接使用 docker run myip -i
:
$ docker run myip
当前 IP:61.148.226.66 来自:北京市 联通
$ docker run myip -i
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Tue, 22 Nov 2016 05:12:40 GMT
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.24-1~dotdeb+7.1
X-Cache: MISS from cache-2
X-Cache-Lookup: MISS from cache-2:80
X-Cache: MISS from proxy-2_6
Transfer-Encoding: chunked
Via: 1.1 cache-2:80, 1.1 proxy-2_6:8006
Connection: keep-alive
当前 IP:61.148.226.66 来自:北京市 联通
可以看到,这次成功了。