使用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
相关产品推荐
相关产品推荐

