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

Jenkins Dockerfile运行Poetry提示Permission Denied的问题问询

问题:Jenkins运行Docker容器执行poetry时提示权限拒绝

相关代码与配置

Dockerfile

FROM git.corp.com:4567/some/python:3.11-slim

RUN apt update; \
  apt install pipx -y; \
  pipx install  poetry; \
  pipx ensurepath; \
  chmod a +rx /root/.local/bin/poetry; \
  ln -s /root/.local/bin/poetry /usr/bin/poetry; \

Jenkins阶段配置

stage('Test') {
      agent {
        dockerfile{
            filename 'Dockerfile.build'
            args "-v $WORKSPACE:/app"
            reuseNode true
        }
      }
      steps {
          sh """
          ls -l poetry
          poetry install --no-root -E tests -E mypy -E lint
          PYTHONPATH="$PWD/src" pytest
          """
      }
    }

错误信息

script.sh.copy: 3: poetry: Permission denied

已排查信息

执行ls -l poetry的输出:

lrwxrwxrwx 1 root root 23 Apr 11 10:02 /usr/bin/poetry -> /root/.local/bin/poetry

已知Jenkins会向docker run命令传递-u 1000:1000参数,以普通用户身份运行容器。


问题原因

你只给了/root/.local/bin/poetry文件本身的读、执行权限,但忽略了父目录的访问权限:默认情况下/root目录的权限是drwx------,普通用户(UID 1000)根本无法进入/root目录,更别说访问/root/.local/bin下的文件了。软链接指向的路径无法被普通用户遍历,自然会触发权限拒绝。

解决方案

提供三种可行的修复方式,按需选择:

方式1:开放父目录的访问权限

在Dockerfile的RUN命令中,新增对/root/.local和/root/.local/bin目录的权限设置,让普通用户可以遍历路径:

FROM git.corp.com:4567/some/python:3.11-slim

RUN apt update; \
  apt install pipx -y; \
  pipx install poetry; \
  pipx ensurepath; \
  chmod a+rx /root/.local/bin/poetry; \
  chmod a+rx /root/.local /root/.local/bin; \  # 新增:开放目录访问权限
  ln -s /root/.local/bin/poetry /usr/bin/poetry;

方式2:将poetry安装到系统全局路径

换一种安装方式,直接把poetry安装到所有用户都能访问的系统路径,避开root家目录:

FROM git.corp.com:4567/some/python:3.11-slim

RUN apt update && apt install -y curl && \
  curl -sSL https://install.python-poetry.org | python3 - --install-dir /usr/local/bin --version 1.8.3 && \
  ln -s /usr/local/bin/poetry /usr/bin/poetry

(可根据需求调整poetry版本,去掉--version 1.8.3即可安装最新版)

方式3:创建普通用户进行安装与运行

更规范的做法是在Dockerfile中创建与Jenkins运行用户UID匹配的普通用户,所有操作基于该用户执行:

FROM git.corp.com:4567/some/python:3.11-slim

RUN apt update && apt install -y pipx

# 创建UID为1000的普通用户,匹配Jenkins运行用户
RUN useradd -m -u 1000 appuser
USER appuser

# 以普通用户身份安装poetry
RUN pipx install poetry && pipx ensurepath

# 切换回root创建全局软链接(可选,也可直接让Jenkins用appuser执行)
USER root
RUN ln -s /home/appuser/.local/bin/poetry /usr/bin/poetry

这种方式从根源上避免了root家目录的权限问题,更符合容器最佳实践。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:24:54