1 Overview

Docker 中 ENTRYPOINT 一直是个容易混淆的概念,今天浏览了一下官网,简单总结一下。官网的参考链接如下。

https://docs.docker.com/search/?q=entrypoint

image_1dg93lijh8v59ueu337fbfgop.png-240.8kB

2 ENTRYPOINT

在 Dockerfile 中,ENTRYPOINT 是作为容器运行的命令存在的,但是他是非必须的,原因是除了可以在 Dockerfile 中填写 ENTRYPOINT,你还可以写 CMD,甚至同时使用两者。

如果指定了 ENTRYPOINT,大部分的 Docker 镜像都定义了 ENTRYPOINT,即使不写,你依然可以从你的 base 镜像中获取到 ENTRYPOINT,前提当然是 base 镜像有定义。另外,就算你的 Dockerfile 定义了 ENTRYPOINT,你还可以通过命令行的模式,在启动容器的时候提供 --entrypoint 选项来覆盖。下面的例子的含义是,通过 --entrypoint 来覆盖 Dockerfile 里定义的 ENTRYPOINT,然后给 CMD 命令传入 -l /tmp 的命令。

$ docker run --entrypoint=/bin/ls ubuntu -l /tmp
---结果---
total 0

以上例子,你可以想象成你定义的 Dockerfile 是这样的。

FROM  ubuntu
ENTRYPOINT ["/bin/ls"]
CMD ["-l", "/tmp"]

3 Summary

实践中,ENTRYPOINT 并不会经常被覆盖,但是如果镜像文件中指定了 ENTRYPOINT,那么一定程度上,会让你的镜像更 flexible,或者说更容易使用。

举个 Spark 官方提供的 Dockerfile 为例,最后也是使用了 ENTRYPOINT,那么他的灵活性体现在哪里呢?

我运行镜像的时候,可以通过 --entrypoint 来覆盖默认的 ENTRYPOINT 命令,比如我想看看镜像里的文件的时候,可以这么干。

$ docker run --entrypoint=/bin/ls spark:tenc-spark -l /opt/spark
---结果---
total 40
-rw-r--r--    1 root     root             0 Jul 21 01:57 RELEASE
drwxr-xr-x    2 root     root          4096 Jul 21 01:57 bin
drwxr-xr-x    2 root     root          4096 Jul 21 01:57 conf
drwxr-xr-x    5 root     root          4096 Jul 21 01:57 data
drwxr-xr-x    4 root     root          4096 Jul 21 01:57 examples
drwxr-xr-x    2 root     root         12288 Jul 21 01:57 jars
drwxr-xr-x    2 root     root          4096 Jul 21 01:57 sbin
drwxr-xr-x    2 root     root          4096 Jul 21 01:57 tests
drwxr-xr-x    2 root     root          4096 Jul 21 01:57 work-dir
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐