目录

Docker-ENTRYPOINT笔记

概述

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

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

/docker-entrypoint%E7%AC%94%E8%AE%B0/img.png

ENTRYPOINT

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

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

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

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

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

总结

实践中,ENTRYPOINT 并不会经常被覆盖,但是如果镜像文件中指定了 ENTRYPOINT,那么一定程度上,会让你的镜像更 flexible,或者说更容易使用。举个 Spark 官方提供的 Dockerfile 为例,最后也是使用了 ENTRYPOINT,那么他的灵活性体现在哪里呢?我运行镜像的时候,可以通过 --entrypoint 来覆盖默认的 ENTRYPOINT 命令,比如我想看看镜像里的文件的时候,可以这么干。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 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
警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。