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号进程用一直白痴进程不结束
posted @ 2022-07-28 11:16  vx_guanchaoguo0  阅读(329)  评论(0编辑  收藏  举报