任务

任务
管理集群
管理集群
Debug DNS 方案
Enabling Service Topology (EN)
IP Masquerade Agent 用户指南
Kubernetes 云管理控制器
Safely Drain a Node while Respecting the PodDisruptionBudget (EN)
为 Kubernetes 运行 etcd 集群
为系统守护进程预留计算资源
为节点发布扩展资源
使用 CoreDNS 进行服务发现
使用 KMS 提供商进行数据加密
使用 Kubernetes API 访问集群
关键插件 Pod 的调度保证
启用端点切片
命名空间演练
在 Kubernetes 集群中使用 NodeLocal DNSCache
在 Kubernetes 集群中使用 sysctl
在实时集群上重新配置节点的 Kubelet
声明网络策略
开发云控制器管理器
控制节点上的 CPU 管理策略
控制节点上的拓扑管理策略
搭建高可用的 Kubernetes Masters
改变默认 StorageClass
更改 PersistentVolume 的回收策略
自定义 DNS 服务
访问集群上运行的服务
通过命名空间共享集群
通过配置文件设置 Kubelet 参数
配置 API 对象配额
配置多个调度器
配置资源不足时的处理方式
限制存储消耗
集群 DNS 服务自动伸缩
集群安全
集群管理
静态加密 Secret 数据
用插件扩展 kubectl
管理巨页(HugePages)
调度 GPUs

Edit This Page

为容器设置启动时要执行的命令及其入参

本页将展示如何为 PodPod 是 Kubernetes 的原子对象。Pod 表示您的集群上一组正在运行的容器。 中的容器设置启动时要执行的命令及其入参。

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

要获知版本信息,请输入 kubectl version.

创建 Pod 时设置命令及入参

创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其入参。如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的入参,就填写在配置文件的 args 字段下。一旦 Pod 创建完成,该命令及其入参就无法再进行更改了。

如果在配置文件中设置了容器启动时要执行的命令及其入参,那么容器镜像中自带的命令与入参将会被覆盖而不再执行。如果配置文件中只是设置了入参,却没有设置其对应的命令,那么容器镜像中自带的命令会使用该新入参作为其执行时的入参。

注意: 在有些容器运行时中,command 字段对应 entrypoint,请参阅下面的 注意

本示例中,将创建一个只包含单个容器的 Pod。在 Pod 配置文件中设置了一个命令与两个入参:

pods/commands.yaml
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["printenv"]
    args: ["HOSTNAME", "KUBERNETES_PORT"]
  restartPolicy: OnFailure
  1. 基于 YAML 文件创建一个 Pod:

    kubectl apply -f https://k8s.io/examples/pods/commands.yaml
  1. 获取正在运行的 Pods:

    kubectl get pods

    查询结果显示在 command-demo 这个 Pod 下运行的容器已经启动完成。

  1. 如果要获取容器启动时执行命令的输出结果,可以通过 Pod 的日志进行查看:

    kubectl logs command-demo

    日志中显示了 HOSTNAME 与 KUBERNETES_PORT 这两个环境变量的值:

    command-demo
    tcp://10.3.240.1:443
    

使用环境变量来设置入参

在上面的示例中,我们直接将一串字符作为命令的入参。除此之外,我们还可以将环境变量作为命令的入参。

env:
- name: MESSAGE
  value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]

这意味着你可以将那些用来设置环境变量的方法应用于设置命令的入参,其中包括了 ConfigMapsSecrets

注意: 环境变量需要加上括号,类似于 "$(VAR)"。这是在 commandargs 字段使用变量的格式要求。

通过 shell 来执行命令

有时候,您需要在 shell 脚本中运行命令。 例如,您要执行的命令可能由多个命令组合而成,或者它就是一个 shell 脚本。这时,就可以通过如下方式在 shell 中执行命令:

command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]

注意

下表给出了 Docker 与 Kubernetes 中对应的字段名称。

描述Docker 字段名称Kubernetes 字段名称
容器执行的命令Entrypointcommand
传给命令的参数Cmdargs

如果要覆盖默认的 Entrypoint 与 Cmd,需要遵循如下规则:

  • 如果在容器配置中没有设置 command 或者 args,那么将使用 Docker 镜像自带的命令及其入参。

  • 如果在容器配置中只设置了 command 但是没有设置 args,那么容器启动时只会执行该命令,Docker 镜像中自带的命令及其入参会被忽略。

  • 如果在容器配置中只设置了 args,那么 Docker 镜像中自带的命令会使用该新入参作为其执行时的入参。

  • 如果在容器配置中同时设置了 commandargs,那么 Docker 镜像中自带的命令及其入参会被忽略。容器启动时只会执行配置中设置的命令,并使用配置中设置的入参作为命令的入参。

下表涵盖了各类设置场景:

镜像 Entrypoint镜像 Cmd容器 command容器 args命令执行
[/ep-1][foo bar]<not set><not set>[ep-1 foo bar]
[/ep-1][foo bar][/ep-2]<not set>[ep-2]
[/ep-1][foo bar]<not set>[zoo boo][ep-1 zoo boo]
[/ep-1][foo bar][/ep-2][zoo boo][ep-2 zoo boo]

接下来

反馈