Docker容器本地构建正常但GitLab流水线报Gem目录权限错误
Dockerfile本地构建正常GitLab流水线报权限错解决方案
报错根因
Ruby 3.0+官方Alpine镜像默认将/usr/local/bundle目录的所有者设置为非root的ruby用户,本地构建默认使用root用户执行RUN指令因此不会触发权限问题;但GitLab CI的Docker Runner默认开启用户命名空间映射,或是流水线配置指定了非root用户执行构建操作,就会出现无写入权限的报错。你之前尝试添加-n /usr/local/bundle参数只是指定了gem安装路径,没有修改对应目录的操作权限,因此无法解决问题。
解决方案(二选一即可)
方案1:切换到ruby用户执行安装操作(更安全,推荐)
修改后的Dockerfile内容如下:
FROM ruby:3.0-alpine # 安装系统依赖需要root权限,先执行系统依赖安装 RUN apk update && apk add --no-cache build-base mysql-dev rrdtool # 创建工作目录并授予ruby用户权限 RUN mkdir -p /usr/local/bundle /usr/server && chown -R ruby:ruby /usr/local/bundle /usr/server # 切换到非root的ruby用户执行后续操作 USER ruby # 安装ruby依赖 RUN gem install bundler rake # 复制项目文件,指定所有者为ruby用户 WORKDIR /usr/server COPY --chown=ruby:ruby . . RUN bundler install # 启动服务 EXPOSE 443 CMD ["bundle", "exec", "puma"]
方案2:指定gem安装到当前用户目录
如果不想修改执行用户,可以调整gem安装路径为当前用户的可写目录:
FROM ruby:3.0-alpine # Install Dependencies RUN apk update && apk add --no-cache build-base mysql-dev rrdtool # 指定gem安装到当前用户目录,同时将用户gem目录加入PATH ENV PATH="/root/.gem/ruby/3.0.0/bin:$PATH" RUN gem install bundler rake --user-install # Copy the files and build WORKDIR /usr/server COPY . . RUN bundler install # Run bundler EXPOSE 443 CMD ["bundle", "exec", "puma"]
注意事项
修改完成后需要清理GitLab CI的Docker构建缓存,避免旧的缓存层导致修改不生效。
内容的提问来源于stack exchange,提问作者bar9833625
相关产品推荐
相关产品推荐

