GitHub Actions使用actions/upload-artifact上传Docker卷文件时权限被拒
根本原因
报错的核心原因不是目标文件本身的权限不足,而是GitHub Actions默认使用runner用户执行所有步骤,Docker卷的存储父目录/var/lib/docker/volumes/默认只有root用户有访问权限,runner用户没有上层目录的遍历权限,哪怕你修改了最内层文件的权限,也无法访问到目标文件。
推荐解决方案
最稳妥、兼容性最高的方案是将文件从Docker卷拷贝到当前工作目录后再上传,完全避免触碰系统目录权限,修改后的Action步骤如下:
name: Action on: push: jobs: example: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Compose Containers and Run run: | docker-compose up --abort-on-container-exit - name: Copy test file from Docker volume run: | # 启动临时容器同时挂载目标卷和当前工作目录,将文件拷贝到工作目录 docker run --rm -v example_reports:/vol-src -v $(pwd):/output ubuntu cp /vol-src/test.txt /output/ - name: Upload test.txt uses: actions/upload-artifact@v2 with: name: test.txt path: test.txt
如果有多个报告文件需要拷贝,可以把cp命令替换成cp -r /vol-src/* /output/批量拷贝。
替代方案(不推荐)
如果你需要直接从Docker卷路径读取文件,可以给上层目录追加遍历权限:
- name: Fix directory permissions run: | # 给所有父目录追加执行权限(即目录遍历权限) sudo chmod +x /var/lib/docker/volumes/ sudo chmod +x /var/lib/docker/volumes/example_reports/ sudo chmod +x /var/lib/docker/volumes/example_reports/_data/ # 给目标文件追加读权限 sudo chmod ugo+r /var/lib/docker/volumes/example_reports/_data/test.txt
该方案仅适配当前Docker默认存储路径的场景,兼容性较差,且修改系统目录权限存在安全风险。
内容的提问来源于stack exchange,提问作者James Wilcox
相关产品推荐
相关产品推荐

