修改Gradle Dockerfile以root用户执行,解决GitLab Runner构建问题
解决GitLab Runner回归问题:修改Gradle Docker镜像以root运行
针对你遇到的GitLab Runner v9.2.0的回归问题(非root用户无法正常构建Gradle项目),我来帮你梳理Dockerfile的修改点,以及docker:dind环境下的构建命令:
一、修改Dockerfile,让镜像以root用户运行
看你提供的Dockerfile,核心是它最后特意切换到了gradle普通用户,我们只需要调整这部分就能改成root运行:
移除用户切换指令
找到Dockerfile里的这一行:USER gradle直接删掉或者用
#注释掉,这样容器启动后默认就会以root身份运行。可选:调整工作目录(非必须,但更符合root用户习惯)
原Dockerfile设置的工作目录是/home/gradle,你可以改成root的默认目录/root,只需要把:WORKDIR /home/gradle改成:
WORKDIR /root如果你想保留原缓存目录的软链,这部分完全不用动,root用户有权限访问
/home/gradle/.gradle,而且原有的软链已经把/root/.gradle指向了这个目录,缓存依然可以复用。
修改后的完整Dockerfile(保留原用户创建逻辑,仅切换回root):
FROM openjdk:8-jdk-alpine CMD ["gradle"] ENV GRADLE_HOME /opt/gradle ENV GRADLE_VERSION 4.4.1 ARG GRADLE_DOWNLOAD_SHA256=e7cf7d1853dfc30c1c44f571d3919eeeedef002823b66b6a988d27e919686389 RUN set -o errexit -o nounset \ && echo "Installing build dependencies" \ && apk add --no-cache --virtual .build-deps \ ca-certificates \ openssl \ unzip \ \ && echo "Downloading Gradle" \ && wget -O gradle.zip "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" \ \ && echo "Checking download hash" \ && echo "${GRADLE_DOWNLOAD_SHA256} *gradle.zip" | sha256sum -c - \ \ && echo "Installing Gradle" \ && unzip gradle.zip \ && rm gradle.zip \ && mkdir /opt \ && mv "gradle-${GRADLE_VERSION}" "${GRADLE_HOME}/" \ && ln -s "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle \ \ && apk del .build-deps \ \ && echo "Adding gradle user and group" \ && addgroup -S -g 1000 gradle \ && adduser -D -S -G gradle -u 1000 -s /bin/ash gradle \ && mkdir /home/gradle/.gradle \ && chown -R gradle:gradle /home/gradle \ \ && echo "Symlinking root Gradle cache to gradle Gradle cache" \ && ln -s /home/gradle/.gradle /root/.gradle # Create Gradle volume # USER gradle # 注释或删除该行,默认以root运行 VOLUME "/home/gradle/.gradle" WORKDIR /root # 可选:切换到root工作目录 RUN set -o errexit -o nounset \ && echo "Testing Gradle installation" \ && gradle --version
二、docker:dind环境下的Gradle构建命令
当使用docker:dind作为CI镜像时,你需要把GitLab拉取的代码目录挂载到你的自定义Gradle容器中,才能执行构建。修改你的CI配置如下:
build_java: image: docker:dind stage: build_java script: - docker images - docker login -u _json_key -p "$(echo $GCR_SERVICE_ACCOUNT | base64 -d)" https://eu.gcr.io - docker pull eu.gcr.io/test/gradle:4.4.1-jdk8-alpine-root - docker images # 挂载当前项目目录到容器的/workspace,执行gradle build - docker run --rm -v "$(pwd)":/workspace -w /workspace eu.gcr.io/test/gradle:4.4.1-jdk8-alpine-root gradle build artifacts: expire_in: 1 hour paths: - build/ - .gradle/
命令解释:
--rm:容器运行完成后自动销毁,避免残留无用容器;-v "$(pwd)":/workspace:把CI环境中当前的代码目录(GitLab已经拉取了你的项目代码到这里)挂载到容器内的/workspace目录;-w /workspace:设置容器的工作目录为/workspace,确保gradle build在你的项目根目录执行;- 最后是你的自定义镜像名和要执行的构建命令
gradle build。
思路验证
你的思路完全没问题:因为GitLab Runner v9.2.0的回归bug,普通用户无法正常执行Gradle构建,所以修改官方镜像切换到root是合理的临时 workaround,直到GitLab修复这个安全性问题的回归。
内容的提问来源于stack exchange,提问作者Tim Schwalbe
相关产品推荐
相关产品推荐

