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

tus*_*oyd 30 containers docker kubernetes dockerfile

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

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

Ber*_*sal 43

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

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

  • 如果不为Container提供命令或args,则使用Docker镜像中定义的默认值.
  • 如果为Container提供命令但没有args,则仅使用提供的命令.默认的EntryPoint和Docker镜像中定义的默认Cmd将被忽略.
  • 如果仅为Container提供args,则Docker镜像中定义的默认入口点将与您提供的args一起运行.
  • 如果提供命令和args,则忽略Docker镜像中定义的默认入口点和默认Cmd.您的命令与您的args一起运行.

这是一个例子:

Dockerfile:

FROM alpine:latest
COPY "executable_file" /
ENTRYPOINT [ "./executable_file" ]
Run Code Online (Sandbox Code Playgroud)

Kubernetes yaml文件:

 spec:
    containers:
      - name: container_name
        image: image_name
        args: ["arg1", "arg2", "arg3"]
Run Code Online (Sandbox Code Playgroud)

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


Mer*_*ury 18

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

简单的例子:

要覆盖 dockerfile ENTRYPOINT,只需将这些字段添加到您的 K8s 模板中(查看命令args

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
Run Code Online (Sandbox Code Playgroud)

K8s文档:

命令字段对应于某些容器运行时中的入口点。请参阅下面的注释

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


bil*_*ohi 15

关键的区别在于术语.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                  |
-------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

  • 当两者都是不同的时候,Docker的`Cmd`和Kubernetes的`command`确实是一个坏选择 (3认同)

Ank*_*ari 7

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