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+ 小伙伴加入学习 ,欢迎点击围观

Dockerfile 常用指令汇总 Dockerfile 常用指令汇总

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 来自:北京市 联通

可以看到,这次成功了。

Dockerfile 常用指令汇总 Dockerfile 常用指令汇总