docker的entrypoint的override关系

这篇文章分析一下Dockerfile当中override的关系。我们首先写一个Dockerfile

FROM alpine
RUN echo "echo 'Hello, world'" > /tmp/run.sh
ENTRYPOINT sh /tmp/run.sh

把它build成叫做foo的image:

此时使用这个image创建一个container并运行:

$ docker run -it foo sh
Hello, world

可以看到entrypoint当中定义的脚本生效了。此时再写一个dockerfile使用foo这个image:

FROM foo
RUN echo "echo 'Hello, world2'" > /tmp/run2.sh
ENTRYPOINT sh /tmp/run2.sh

这个dockerfile是继承了foo的image,并且自己又定义了一个ENTRYPOINT,为run2.sh。那么我们build这个image,然后用这个image创建并运行container,它的entrypoint脚本会运行自己的,还是继承的foo的呢?实际实验过程如下:

可以看到它运行的是自己的image的entrypoint脚本run2.sh。所以说image自己的entrypoint设定会override它的parent的entrypoint脚本。那么我们把当前image的entrypoint取消掉呢?还是做实验试试看:

上面是取消了这个dockerfile的entrypoint。然后重新build并运行:

可以看到它会使用parent image的entrypoint脚本了。以上就是entrypoint脚本的继承关系。此外,我们还可以再运行时指定entry point:

具体可以参考这篇文档:

以上就是对docker的entrypoint的一个说明。