如何在GitHub Workflows中用Docker构建ArchLinux包并解决权限问题
问题背景
本地环境下使用Docker构建ArchLinux包完全正常,但迁移到GitHub Workflows后,容器内的build用户无法写入挂载的/app目录,出现以下报错:
CMake Error: Unable to (re)create the private pkgRedirects directory:
/app/CMakeFiles/pkgRedirects
Error: could not load cache
==> ERROR: You do not have write permission for the directory $BUILDDIR (/app).
Aborting...
甚至执行touch test这类简单命令也因权限失败。
问题原因
GitHub Actions的Ubuntu Runner环境中,仓库目录的所有者UID为1001,而Docker容器内默认创建的build用户UID是随机分配的(通常不是1001),导致挂载目录后,容器内用户与目录所有者UID不匹配,无写入权限。本地环境中你的用户UID恰好与容器内build用户一致,所以未触发权限问题。
解决方法
方法一:Dockerfile中指定匹配Runner的UID/GID
直接在创建build用户时指定UID为1001(GitHub Actions Ubuntu Runner的默认用户UID),让容器内用户与宿主目录所有者权限匹配:
FROM archlinux:latest RUN pacman -Syu make cmake gcc base-devel --noconfirm # 指定UID=1001,匹配GitHub Actions Runner用户 RUN useradd -u 1001 build
修改后重新构建镜像,GitHub Workflows中的原有运行命令无需改动即可正常执行。
方法二:启动容器时先调整挂载目录权限
在运行构建容器前,先以root身份进入容器,将/app目录的所有者改为build用户:
name: archlinux build on: [push] jobs: build: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v3 - name: Build run: | docker build -t build . # 先以root身份修改目录权限 docker run -v "$PWD":/app --user root build chown -R build:build /app # 再用build用户执行构建 docker run -v "$PWD":/app --user build -w "/app" build ./build.sh
方法三:给build用户添加sudo权限(不推荐)
如果临时需要快速解决,可在Dockerfile中给build用户添加无密码sudo权限,然后在构建脚本开头调整目录权限:
- 修改Dockerfile:
FROM archlinux:latest RUN pacman -Syu make cmake gcc base-devel sudo --noconfirm RUN useradd build # 给build用户添加无密码sudo权限 RUN echo "build ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
- 修改build.sh脚本:
# 先调整当前目录权限 sudo chown -R $USER:$USER . cmake CMakeLists.txt cmake --build . makepkg
此方法存在安全风险,仅建议临时应急使用。
推荐方案
优先选择方法一,配置简洁且无额外运行步骤;若无法修改Dockerfile,可使用方法二,通过额外的容器命令调整权限。
内容的提问来源于stack exchange,提问作者User

