Dockerfile有一个参数用于指定ENTRYPOINT,而在编写Kubernetes部署YAML文件时,容器规范的COMMAND中也有一个参数。
我无法弄清楚它们之间的区别以及如何使用每个参数?
我无法弄清楚它们之间的区别以及如何使用每个参数?
Kubernetes提供了多个选项来使用这些命令:
当您在Kubernetes .yaml文件中覆盖默认的Entrypoint和Cmd时,以下规则适用:
这里是一个例子:
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/
关键差别在于术语。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使用它们也是正确的,只要你翻译这些术语。关键是要理解两个系统中镜像和运行规范之间的相互作用,并在谈到另一个系统时翻译术语。
基本上COMMAND可以覆盖docker ENTRYPOINT中提到的内容。
简单示例:
要覆盖dockerfile ENTRYPOINT,只需将这些字段添加到您的K8s模板中(查看command和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
K8s文档:
command字段对应于某些容器运行时的entrypoint。 请参阅下面的注。
您可以访问注链接(K8s文档),以更好地了解此命令如何覆盖K8s ENTRYPOINT。
YAML文件中的COMMAND会覆盖Docker文件中ENTRYPOINT的任何指定内容。
Cmd
,而在 Kubernetes 中使用command
,这两者是不同的东西,选择这种方式确实不太好。 - NeverEndingQueue