• K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系


    写在前面


    • 前几天被问到,这里整理笔记
    • 之前也没怎么注意这个问题
    • 理解不足小伙伴帮忙指正

    曾以为老去是很遥远的事,突然发现年轻是很久以前的事了。时光好不经用,抬眼已是半生,所谓的中年危机,真正让人焦虑的不是孤单、不是贫穷、更不是衰老,而是人到中年你才发现,你从来没有按照自己喜欢的方式活过,这烟火人间,事事值得、事事与遗憾,该用多懂事的理智,去压抑住心中的不甘与难过。 ——余华《活着》


    K8s Pod中的 command、args 的配置会覆盖 DockerfileENTRYPOINTCMD 指令, 具体 command 命令代替 ENTRYPOINT命令行args 代替 CMD 的参数。但是 并不是说 他们是一个等价的覆盖关系。

    具体的问题具体分析,这里我们准备一个镜像做简单测试

    ┌──[root@vms100.liruilongs.github.io]-[~/docker]
    └─$docker build -t liruilong/my-busybox:latest -<<EOF
    > FROM busybox:latest
    > ENTRYPOINT ["printenv"]
    > CMD ["HOSTNAME", "KUBERNETES_PORT"]
    > EOF
    Sending build context to Docker daemon  2.048kB
    Step 1/3 : FROM busybox:latest
     ---> beae173ccac6
    Step 2/3 : ENTRYPOINT ["printenv"]
     ---> Using cache
     ---> 490cf6028e36
    Step 3/3 : CMD ["HOSTNAME", "KUBERNETES_PORT"]
     ---> Using cache
     ---> 497b83a63aad
    Successfully built 497b83a63aad
    Successfully tagged liruilong/my-busybox:latest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    上面的 Dockerfile 基础镜像使用 busybox:latest, 添加了 CMDENTRYPOINT 指令 ,构建好的镜像上传 hub.docker 仓库。

    ┌──[root@vms100.liruilongs.github.io]-[~]
    └─$docker login
    Authenticating with existing credentials...
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    ┌──[root@vms100.liruilongs.github.io]-[~/docker]
    └─$docker push liruilong/my-busybox:latest
    The push refers to repository [docker.io/liruilong/my-busybox]
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    然后我们使用 kubectl 做下具体的测试,对应四种情况。

    commandargs 均没有指定,这种情况会使用 Dockerfile 的配置的 ENTRYPOINTCMD

    ┌──[root@vms100.liruilongs.github.io]-[~/ansible/commm_args]
    └─$kubectl run demo  --image liruilong/my-busybox -n demo
    pod/demo created
    
    • 1
    • 2
    • 3
    ┌──[root@vms100.liruilongs.github.io]-[~/ansible/commm_args]
    └─$kubectl logs demo -n demo
    demo
    tcp://10.96.0.1:443
    
    • 1
    • 2
    • 3
    • 4

    直接使用的 Dockerfile 中的配置

    ENTRYPOINT ["printenv"]
    CMD ["HOSTNAME", "KUBERNETES_PORT"]
    
    • 1
    • 2

    commandargs 都指定了,那么 Dockerfile 的配置 ENTRYPOINTCMD 被忽略,执行 command 并追加上 args 参数。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: demo
      name: demo
      namespace: demo
    spec:
      containers:
      - command:
        - echo
        args:
        - "山河已无恙"
        image: liruilong/my-busybox
        imagePullPolicy: Always
        name: demo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    通过日志可以看到覆盖了 Dockerfile 中的配置

    ┌──[root@vms100.liruilongs.github.io]-[~/docker]
    └─$kubectl apply  -f demo.yaml
    pod/demo created
    ┌──[root@vms100.liruilongs.github.io]-[~/docker]
    └─$kubectl logs demo -n demo
    山河已无恙
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    command 没有指定,指定了 args,那么 Dockerfile 中配置的 ENTRYPOINT 的命令行会被执行,CMD 会被 args 中填写的参数覆盖, 追加到 ENTRYPOINT 中。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: demo
      name: demo
      namespace: demo
    spec:
      containers:
      - args:
        - PATH
        image: liruilong/my-busybox
        imagePullPolicy: Always
        name: demo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    CMD 指令被覆盖

    ┌──[root@vms100.liruilongs.github.io]-[~/docker]
    └─$kubectl logs demo -n demo
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
    • 1
    • 2
    • 3

    command 指定, args 没有指定,那么 Dockerfile 默认的 ENTRYPOINT 配置会被忽略,执行输入的 command,同时 Dockerfile 中的 CMD 也会被忽略。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: demo
      name: demo
      namespace: demo
    spec:
      containers:
      - command:
        - echo
        - 山河已无恙
        - 活着
        image: liruilong/my-busybox
        imagePullPolicy: Always
        name: demo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这个有些特殊,需要注意下,只指定了command ,但是 entrypoint 被覆盖 ,cmd 被忽略

    ┌──[root@vms100.liruilongs.github.io]-[~/docker]
    └─$kubectl logs demo -n demo
    山河已无恙 活着
    
    • 1
    • 2
    • 3

    指定的 CMD 并没有拼到后面

    CMD ["HOSTNAME", "KUBERNETES_PORT"]
    
    • 1

    博文部分内容参考

    © 文中涉及参考链接内容版权归原作者所有,如有侵权请告知。


    https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/define-command-argument-container/#notes


    © 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

  • 相关阅读:
    MySQL—一条查询SQL语句的完整执行流程
    程序员副业收入之如何使用 API 建立收入流
    【高等数学基础进阶】不定积分-part2
    Node.js中child_process模块概要
    二叉树的中序遍历
    第九章 spring 事务和定时任务
    tkinter中如何隐藏/去掉最大化窗口
    Vue(八)——Vuex
    背八股文的都是什么水平
    金九银十躺平证!全靠这份2022阿里扫地僧分享的Java面试小册,轻松拿捏
  • 原文地址:https://blog.csdn.net/sanhewuyang/article/details/133966519