Dockerfile中CMD和ENTRYPOINT的区别
CMD和ENTRYPOINT的功能看起来比较类似,但是两者还是存在一些区别。
容器启动命令的构成
我们可以通过docker ps
查看容器的启动信息
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
可以通过COMMAND
字段查看到容器的启动命令为/app/web
实际上COMMAND由ENTRYPOINT+CMD
构成
我们在docker run
后默认跟随的参数为CMD
的部分,如果要修改ENTRYPOINT
需要显式增加--entrypoint
参数
1 | docker run --entrypoint ls helloworld -a |
可以看到启动命令被更改
通过Dockerfile配置启动命令
ENTRYPOINT和CMD除了可以在启动时配置以外,我们还可以在Dockerfile中配置,但是命令行的优先级是大于Dockerfile
的
配置的方式有两种
1 | FROM alpine |
我们运行上述镜像,可以发现启动命令为ls -a
,我们可以通过命令行替换ENTRYPOINT或者CMD部分
1 | docker run helloworld -l |
可以发现启动命令为ls -l
,ENTRYPOINT的替换就不再演示
第二种和第一种类似,主要是说明exec和Shell执行方式的区别
1 | FROM alpine |
如果我们执行上面的镜像,我们会发现启动命令变成了/bin/sh -c ls -a
也就说如果我们不使用[]
,那么docker会用/bin/sh -c
的方式执行,也就是shell执行,但是如果加上[],会通过exec系统调用执行,在大多数情况下,推荐使用第一种,也就是exec方式
结合使用CMD和ENTRYPOINT
可以发现ENTRYPOINT通常指定核心命令,也是我们不希望用户修改的部分,而CMD则通常配置成参数部分,合理配合这两个部分可以让Docker镜像更加灵活
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 jking の 博客!