You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Helm部署至EKS时Sidekiq命令执行失败问题排查

Helm部署EKS时Sidekiq命令执行失败问题排查与解决

问题现象

部署时触发容器启动错误:

Error: failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "bundle exec sidekiq --environment dev": executable file not found in $PATH: unknown

相关配置细节:

  • values.yaml中命令定义为数组格式:
    sidekiqCommand:
      - "bundle"
      - "exec"
      - "sidekiq"
      - "--environment"
      - "dev"
    
  • 直接在deployment.yaml写死command: ["bundle", "exec", "sidekiq", "--environment", "dev"]时部署正常;本地运行、将命令设为容器ENTRYPOINT也均正常。
  • 尝试用range循环渲染命令仍失败:
    {{- $command := .Values.sidekiqCommand }}
    command:
    {{- range $arg := $command }}
      - {{ $arg }}
    {{- end }}
    

问题原因

Helm模板渲染时,若直接引用数组或range渲染处理不当,会导致生成的YAML中command被解析为单个字符串(而非数组/列表),容器 runtime 会把整个命令串当作一个可执行文件查找,因此报路径不存在错误。

解决方案

方案1:使用toYaml函数正确渲染数组

在deployment.yaml中用toYaml将Helm内部数组转换为标准YAML格式,配合nindent保证缩进匹配:

command: {{ .Values.sidekiqCommand | toYaml | nindent 2 }}
  • toYaml:将Go数组类型转换为符合YAML规范的列表格式
  • nindent 2:根据你的YAML缩进风格(通常为2或4空格),给每个列表项添加对应缩进,确保和父节点command的结构一致

方案2:修正range渲染的字符串处理

若坚持使用range循环,需给每个参数添加引号,避免YAML解析时的类型歧义:

{{- $command := .Values.sidekiqCommand }}
command:
{{- range $arg := $command }}
  - {{ $arg | quote }}
{{- end }}

添加quote后,每个参数都会被包裹为字符串,确保渲染后的YAML是标准列表结构。

验证方法

执行helm template命令预览渲染后的YAML:

helm template <release-name> <chart-path> -f values.yaml

确认command部分生成的是如下格式之一:

command:
  - "bundle"
  - "exec"
  - "sidekiq"
  - "--environment"
  - "dev"

或

command: ["bundle", "exec", "sidekiq", "--environment", "dev"]

只要不是command: "bundle exec sidekiq --environment dev"这种单字符串形式,就说明渲染正确。

内容的提问来源于stack exchange,提问作者ggg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:52:44