Docker ENTRYPOINT 和 Kubernetes 容器规范命令之间的区别?

Posted

技术标签:

【中文标题】Docker ENTRYPOINT 和 Kubernetes 容器规范命令之间的区别?【英文标题】:Difference between Docker ENTRYPOINT and Kubernetes container spec COMMAND? 【发布时间】:2017-11-03 02:57:29 【问题描述】:

Dockerfile 有一个 ENTRYPOINT 参数,在编写 Kubernetes 部署 YAML 文件时,容器规范中有一个 COMMAND 参数。

我不知道有什么区别以及如何使用它们?

【问题讨论】:

【参考方案1】:

Kubernetes 为我们提供了如何使用这些命令的多种选择:

当您覆盖 Kubernetes .yaml 文件中的默认入口点和 Cmd 时,这些规则适用:

如果您不为容器提供命令或参数,则使用默认值 使用 Docker 映像中定义的内容。 如果只为容器提供参数,则默认入口点 Docker 映像中定义的参数使用您提供的参数运行。 如果您为容器提供命令,则只有 使用提供的命令。默认入口点和默认 Cmd Docker 映像中定义的内容将被忽略。你的命令是 使用提供的 args 运行(如果没有提供,则不提供 args)。

这是一个例子:

Dockerfile:

FROM alpine:latest
COPY "executable_file" /
ENTRYPOINT [ "./executable_file" ]

Kubernetes yaml 文件:

 spec:
    containers:
      - name: container_name
        image: image_name
        args: ["arg1", "arg2", "arg3"]

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

【讨论】:

【参考方案2】:

主要区别在于术语。 Kubernetes 认为 Docker 用来定义接口的术语 容器很尴尬,因此他们使用了不同的、重叠的术语。由于 Kubernetes 编排的绝大多数容器都是 Docker,因此混乱比比皆是。

具体来说,docker entrypoints 是 kubernetes 命令,docker commands 是 kubernetes args,如 here 所示。

-------------------------------------------------------------------------------------
| Description                           | Docker field name | Kubernetes field name |
-------------------------------------------------------------------------------------
| The command run by the container      | Entrypoint        | command               |
| The arguments passed to the command   | Cmd               | args                  |
-------------------------------------------------------------------------------------

@Berk 对 Kubernetes 如何使用这些运行时选项的描述是正确的,但对于 docker run 如何使用它们也是正确的,只要您翻译这些术语即可。关键是要了解任一系统中图像和运行规范之间的相互作用,并在谈到另一个时翻译术语。

【讨论】:

Cmd 代表 Docker 和 command 代表 Kubernetes,当两者是不同的东西时,这真的是一个糟糕的选择【参考方案3】:

YAML 文件中的 COMMAND 会覆盖 docker 文件中 ENTRYPOINT 中提到的任何内容。

【讨论】:

【参考方案4】:

基本上 COMMAND 可以覆盖 docker ENTRYPOINT 中提到的内容

简单示例:

要覆盖 dockerfile ENTRYPOINT,只需将这些字段添加到您的 K8s 模板(查看 commandargs):

apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["/bin/sh"]
    args: ["-c", "printenv; #OR WHATEVER COMMAND YOU WANT"]
  restartPolicy: OnFailure

K8s 文档:

command 字段对应于某些容器运行时的入口点。 参考下方Notes。

您可以输入 Notes 链接(K8s 文档以更好地了解此命令如何覆盖 K8s ENTRYPOINT)

【讨论】:

以上是关于Docker ENTRYPOINT 和 Kubernetes 容器规范命令之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

docker CMD ENTRYPOINT 区别

Docker ENTRYPOINT 和 Kubernetes 容器规范命令之间的区别?

Docker“docker-entrypoint-initdb.d”脚本未执行

docker使用entrypoint执行时报permission denied错误

Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

ENTRYPOINT/CMD process 入口点进程是什么?Docker容器Dockerfile entrypoint.sh文件作用,为什么在脚本开头要执行source ~/.bashrc?