9.dockerfile之ENTRYPOINT指令

一、ENTRYPOINT说明


entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部

每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效

当定义了entrypoint以后,CMD只能够作为参数进行传递

二、ENTRYPOINT指令优先级


ENTRYPOINT 指令和CMD类似,也是用来指定容器启动时执行的命令,但ENTRYPOINT指令的优先级更高:

1.启动容器命令不包含参数

假设dockerfile同时存在ENTRYPOINT指令和CMD指令,那么容器启动时先执行ENTRYPOINT指令再执行CMD指令;

2.启动容器命令包含参数

假设dockerfile同时存在ENTRYPOINT指令和CMD指令,那么容器启动时先执行ENTRYPOINT指令再执行CMD指令,同时dockerfile内的CMD指令被覆盖;

我们编写个dockerfile来验证上面两种情况:

#Base image
FROM centos

#MAINTAINER,this dockerfile creater
MAINTAINER [email protected]

#entrypoint指令,配合下方的CMD指令内容在容器启动时输出:entrypoint and cmd
ENTRYPOINT ["echo"]

#CMD指令
CMD ["entrypoint and cmd"]

构建镜像:

查看镜像:

测试上方的条件1,根据镜像启动容器,启动命令不携带参数:

测试结果:的确是entrypoint指令先执行,如果没有先执行,是无法输出CMD指令参数的!

测试上方的条件2,根据镜像启动容器,启动命令携带参数,验证是否dockerfile文件内的CMD参数被覆盖:

测试结果:dockerfile文件内的CMD参数被覆盖,并且启动容器参数一样是在entrypoint指令后执行。

三、ENTRYPOINT在启动容器时动态替换


 我们还可以在docker run命令中通过 --entrypoint 覆盖dockerfile文件中的ENTRYPOINT参数,我们先修改下dockerfile,然后再构建镜像,最后通过启动命令来指定entrypoint指令参数:

#Base image
FROM centos

#MAINTAINER,this dockerfile creater
MAINTAINER [email protected]

#CMD指令
CMD ["by entrypoint"]

构建后,镜像为:

启动容器,手动执行entrypoint:

再次启动容器,指定CMD参数:

总结:

可以使用--entrypoint="xx"外部指定ENTRYPOINT指令参数;

同时,在外部指定ENTRYPOINT指令参数时CMD参数也必须在外部启动容器时指定。

猜你喜欢

转载自www.cnblogs.com/Json1208/p/8974164.html