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

