一、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 loose@docker.com #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 loose@docker.com #CMD指令 CMD ["by entrypoint"]
构建后,镜像为:
启动容器,手动执行entrypoint:
再次启动容器,指定CMD参数:
总结:
可以使用--entrypoint="xx"外部指定ENTRYPOINT指令参数;
同时,在外部指定ENTRYPOINT指令参数时CMD参数也必须在外部启动容器时指定。