kubernetes - kubectl run --command vs -- arguments
问题描述
我对以下命令有点困惑:
kubectl run busybox --image=busybox --restart=Never -o yaml --dry-run -- /bin/sh -c 'echo hello;sleep 3600'
YAML:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: busybox
name: busybox
spec:
containers:
- args:
- /bin/sh
- -c
- echo hello;sleep 3600
image: busybox
name: busybox
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}
我知道如果我们不指定参数--command
,那么后面的参数--
将被视为参数。
但我想知道,/bin/sh -c "echo hello;sleep 3600"
在发生争执时如何工作?根据 Kubernetes 文档(https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes),如果我们在 POD 中仅指定参数,则 docker EntryPoint 将用作入口点命令。因此,将在 docker 映像中执行的结果命令将是Docker EntryPoint + kubectl arguments
.
由于 Busybox DockerFile 不包含任何入口点(https://github.com/docker-library/busybox/blob/master/musl/Dockerfile),因此仅使用 kubectl 命令中指定的参数,因此命令看起来像:
/bin/sh -c 'echo hello;sleep 3600'
如果我们指定--command
,那么根据 Kubernetes 文档,DockerFile arguments(CMD) 和 command(EntryPoint) 都将被 kubectl 命令中指定的命令覆盖,所以它看起来类似于上面:
/bin/sh -c 'echo hello;sleep 3600'
所以最终会是一样的。
解决方案
在 Kubernetes 中使用容器时,应注意不要混淆 Kubenetescommand
和 Docker Cmd
。
command
Kubernetes 中的字段对应 Docker 中的EntryPoint
字段args
Kubernetes 中的字段对应 Docker 中的Cmd
字段
当您覆盖默认值
Entrypoint
andCmd
时,这些规则适用:
如果您不提供Container,
command
则args
使用 Docker 映像中定义的默认值。如果您为 Container 提供 a
command
but no ,则仅使用提供的。默认值和Docker 镜像中定义的默认值被忽略。args
command
EntryPoint
Cmd
如果您只
args
为 Container 提供,Entrypoint
则 Docker 映像中定义的默认值将使用args
您提供的内容运行。如果您提供
command
andargs
,则忽略 Docker 映像中定义的默认值Entrypoint
和默认值。Cmd
你command
是用你的args
.
推荐阅读
- react-admin - 如何从菜单中删除指向资源列表视图的链接?
- java - 如何为 htmleditorkit 设置换行行为
- ruby-on-rails - 通过控制器查询拉取Activerecord连接表信息
- oracle - 为什么我的 Oracle DataSource 只有在单元测试时才会出现重放错误?
- javascript - 根据 JSON 数据在 d3v4 蝙蝠图上设置自定义刻度值
- node.js - firebase.database() 多个实例
- c# - 如何从 .Net Core Web API 返回 Json?
- .net - 在软件更新中更新 sqlite 架构和数据的最佳方法是什么?
- javascript - 如何在 WebGL 中使纹理在 y 轴和 x 轴上移动
- swift - 从数组创建 UITabBarItem