在容器内调用yq命令时遭遇Permission Denied问题求助
问题分析与解决方案
你的报错核心是yq二进制文件权限不足、路径配置错误,结合Dockerfile和Jenkins流水线逐一排查:
Dockerfile的问题点
- ENTRYPOINT指向错误:你创建了
/usr/bin/yq目录,但ENTRYPOINT却指向这个目录,而非实际的yq可执行文件,不符合容器入口的配置要求。 - 二进制文件路径与命名问题:你把yq下载到
/usr/bin/yq子目录下,文件名为yq_linux_amd64,但系统默认PATH仅包含/usr/bin,子目录不会被搜索,执行yq --version时系统找不到对应命令。 - 缺少执行权限:下载的
yq_linux_amd64未添加可执行权限,即使找到文件也无法运行,直接触发Permission Denied报错。
修正后的Dockerfile
FROM some_registry/some_prj/busybox:1.31.1 LABEL maintainer="this.maintainer@com" # 创建yq用户组和用户 RUN addgroup -S yq && adduser -S yq -G yq # 以root身份下载yq到/usr/bin目录,重命名为yq,添加执行权限后修改归属 RUN wget -O /usr/bin/yq "https://some_registry/nexus/repository/applications-to-deploy/yq/yq_linux_amd64" \ && chmod +x /usr/bin/yq \ && chown yq:yq /usr/bin/yq USER yq # 正确指向可执行文件 ENTRYPOINT ["/usr/bin/yq"]
Jenkins流水线调整(可选)
修正镜像后,无需再覆盖entrypoint,直接调用即可:
node("Build-Node"){ def sourceArtefact stage("checkout"){ checkout scm } stage("invoke yq"){ docker.withRegistry("https://some_prj/harbor/", "robot_id_to_pull"){ docker.image("some_prj/yq:v0.5").inside(){ sh "yq --version" } } } }
验证步骤
- 重新构建镜像并推送到仓库
- 运行Jenkins流水线,检查
yq --version是否正常输出版本信息
内容的提问来源于stack exchange,提问作者user2179627
相关产品推荐
相关产品推荐

