Docker ENTRYPOINT和Kubernetes容器spec COMMAND之间的区别?

时间:2017-06-01 20:15:38

标签: docker containers kubernetes dockerfile

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

我无法弄清楚有什么区别以及如何使用它们?

4 个答案:

答案 0 :(得分:34)

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

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

  • 如果您没有为Container提供命令或参数,则为默认值 使用Docker镜像中定义的。
  • 如果您为Container提供命令但没有args,则只提供 提供的命令被使用。默认的EntryPoint和默认的Cmd 在Docker镜像中定义的内容将被忽略。
  • 如果只提供Container的args,则为默认的Entrypoint 在Docker镜像中定义的是使用您提供的args运行的。
  • 如果你提供命令和args,则默认的Entrypoint和 默认的Docker镜像中定义的Cmd将被忽略。你的命令是 与你的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/

答案 1 :(得分:11)

关键区别在于术语。 Kubernetes认为Docker用来定义接口的术语 容器很笨拙,所以他们使用了不同的重叠术语。由于绝大多数容器Kubernetes的管弦乐队都是Docker,因此存在很多混乱。

具体来说,docker入口点是kubernetes命令,docker命令是kubernetes args,如下所示:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes

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

答案 2 :(得分:2)

基本上 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)

答案 3 :(得分:1)

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