Docker ENTRYPOINT和Kubernetes容器规范COMMAND的区别是什么?

144
Dockerfile有一个参数用于指定ENTRYPOINT,而在编写Kubernetes部署YAML文件时,容器规范的COMMAND中也有一个参数。
我无法弄清楚它们之间的区别以及如何使用每个参数?
4个回答

219

Kubernetes提供了多个选项来使用这些命令:

当您在Kubernetes .yaml文件中覆盖默认的Entrypoint和Cmd时,以下规则适用:

  • 如果您未为容器提供command或args,则使用定义在Docker镜像中的默认值。
  • 如果您仅为容器提供args,则使用在Docker镜像中定义的默认Entrypoint运行,并带有您提供的args。
  • 如果您为容器提供command,则仅使用提供的command。忽略Docker镜像中定义的默认EntryPoint和默认Cmd。将使用提供的args运行您的command(如果没有提供任何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/


112

关键差别在于术语。Kubernetes 认为 Docker 用来定义容器接口的术语很笨拙,因此他们使用不同但有重叠的术语。由于 Kubernetes 编排的绝大多数容器都是Docker,因此存在混淆。

具体而言,Docker 的 entrypoints 是 Kubernetes 命令,而 Docker 命令则是 Kubernetes args,如此处所示。

-------------------------------------------------------------------------------------
| 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使用它们也是正确的,只要你翻译这些术语。关键是要理解两个系统中镜像和运行规范之间的相互作用,并在谈到另一个系统时翻译术语。


25
在 Docker 中使用 Cmd,而在 Kubernetes 中使用 command,这两者是不同的东西,选择这种方式确实不太好。 - NeverEndingQueue

16

基本上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字段对应于某些容器运行时的entrypoint。 请参阅下面的

您可以访问注链接(K8s文档),以更好地了解此命令如何覆盖K8s ENTRYPOINT。


13

YAML文件中的COMMAND会覆盖Docker文件中ENTRYPOINT的任何指定内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接