K8S中command和args

在 Kubernetes 中,如果需要在容器启动时 执行多条命令,可以通过以下几种方式实现(按推荐度排序):


方法 1:通过 Shell 模式(推荐)

使用 command: ["/bin/sh", "-c"] + 多行 args 执行多条命令:

containers:
- name: my-container
  image: alpine
  command: ["/bin/sh", "-c"]  # 启动 Shell 解释器
  args:
  - |                         # 多行命令(注意缩进)
    echo "Command 1: Hello";
    echo "Command 2: $(date)";
    sleep 3600;               # 保持容器运行

等效命令

/bin/sh -c "echo 'Command 1: Hello'; echo 'Command 2: $(date)'; sleep 3600"

方法 2:单行 Shell 命令

适用于简单命令组合:

containers:
- name: my-container
  image: alpine
  command: ["/bin/sh", "-c"]
  args: ["echo 'Command 1' && echo 'Command 2' && sleep 3600"]

方法 3:通过自定义脚本

将命令写入脚本文件,通过 volume 挂载或镜像内置:

containers:
- name: my-container
  image: alpine
  command: ["/bin/sh", "/path/to/script.sh"]  # 执行脚本
  volumeMounts:
  - name: scripts
    mountPath: /path/to
volumes:
- name: scripts
  configMap:
    name: my-scripts  # 将脚本存储在 ConfigMap 中

方法 4:使用多个 **args** 条目

仅适用于顺序执行的命令(不推荐,可读性差):

containers:
- name: my-container
  image: alpine
  command: ["sh", "-c", "echo 'Command 1' && echo 'Command 2'"]

关键注意事项

  1. 命令分隔符

    • ;:顺序执行,无论前一条是否成功。
    • &&:仅前一条成功时才执行下一条。
    • ||:前一条失败时才执行下一条。
  2. 保持容器运行

如果命令是短暂的(如 echo),需在最后添加一个 长期运行命令(如 sleeptail -f),否则容器会立即退出。

  1. 错误处理

在脚本中通过 set -e 让命令失败时自动退出:

args:
- |
  set -e;
  echo "Starting...";
  ./init-db.sh;  # 如果此脚本失败,容器会退出
  sleep infinity;

示例场景

场景 1:初始化数据库后启动服务

command: ["/bin/sh", "-c"]
args:
- |
  ./init-db.sh &&   # 初始化数据库
  ./start-server.sh # 启动服务

场景 2:并行任务(后台执行)

args:
- |
  ./task1.sh &      # 后台运行
  ./task2.sh &      # 后台运行
  wait;             # 等待所有后台任务完成
  sleep infinity;

调试技巧

  1. 查看命令输出
kubectl logs <pod-name>
  1. 进入容器手动执行
kubectl exec -it <pod-name> -- /bin/sh

通过上述方法,可以灵活地在 Kubernetes 容器中执行复杂命令链。推荐优先使用 Shell 多行模式(方法 1),兼顾可读性和功能性。

posted @ 2025-12-30 16:30  shuix1ng  阅读(0)  评论(0)    收藏  举报