dockerfile中ENTRYPOINT与CMD的结合
很多人不理解 cmd 和 entrypoint
通过一个很简单的实验帮你理解 有条件的和我一起
实验室一 dockerfile 和docker run 优先级????
- 新建一个docker-compose
version: '3'
services:
alpine:
container_name: alpine
build:
context: env
dockerfile: dockerfile
- 同一目录下新建一个 env/dockerfile
FROM alpine:latest
CMD ping localhost
- docker-compose up 可以看到 ping 本容器
docker run cmd
- 修改 docker-compose.yml
version: '3'
services:
alpine:
container_name: alpine
build:
context: env
dockerfile: dockerfile
command: /bin/sh -c "ping baidu.com"
- docker-compose up 可以看到 ping baidu.com
结论一
-
当dockerfile 和docker run 同时指定cmd 参数时 run 会覆盖 dockerfile
-
同理 当dockerfile 和docker run 同时指定entrypoint 参数时 run 会覆盖 dockerfile
-
其实可以看到 docker run 时候直接将 dockerfile cmd 转成了 /bin/sh -c "ping baidu.com"
实验室二 shell 和executable 区别???
-
cmd 和 entrypoint 有两种形式
-
shell 模式 顾名思义就是用 shell执行 例如 /bin/sh -c "ping baidu.com"
-
executable模式 就是直接用户二进制执行 例如 /bin/ping "ping baidu.com"
-
既然dockerfile 和 dockerfile 效果一样的我们使用原始镜像 不用dockerfile
version: '3'
services:
alpine:
container_name: alpine
image: alpine:latest
command: /bin/sh -c "ping localhost"
- 使用docker ps 每个人的镜像ID 不一样
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76c2ada23272 alpine "/bin/sh" 48 minutes ago Up 48 minutes angry_satoshi
% docker exec 76c2 ps -f
PID USER TIME COMMAND
1 root 0:00 /bin/sh
13 root 0:00 ps -f
- 可以看到 1 号进程变成 /bin/sh
- shell 是不会将信号转发给 ping 命令的 因此不能优雅的停止应用的 比如: 我们通知app 之前需要做一些清理工作
- 修改一下 docker-compose
version: '3'
services:
alpine:
container_name: alpine
image: alpine:latest
command: ["/bin/ping","localhost"]
结论二
- cmd 和 entrypoint的 shell 和exec模式中,只有 exec 会转发信号
试验三 cmd 和 entrypoint组合使用 优先级????
- docker-compose
version: '3'
services:
alpine:
container_name: alpine
image: alpine:latest
command: ["-c","3"]
entrypoint: ["/bin/ping","localhost"]
- docker-compse up
结论三
- cmd 和 entrypoint组合使用 cmd 只能作为附加参数使用
题外话 : 为啥的我容器停了???
- 因为docker 本质也是一个进程 必须有个守护进程 init 也就是1号进程用一直白痴进程不结束
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16527961.html