基于BuildKit的Maven Jenkins Agent镜像启动无限循环问题排查
问题根源
moby/buildkit属于极简镜像,没有预装Java运行环境,而Jenkins Agent的jenkins-agent脚本和agent.jar必须依赖Java才能运行。容器启动执行ENTRYPOINT时,找不到Java导致脚本执行失败,Docker会自动重启容器,形成无限循环。另外你当前的Dockerfile未将Maven相关环境复制到最终镜像中,即便解决Java问题,也无法使用Maven功能。
修复后的Dockerfile
# 阶段1:获取Jenkins Agent核心文件 FROM jenkins/inbound-agent:alpine as jnlp # 阶段2:构建带依赖的Maven环境 FROM maven:3.6.3-jdk-11-slim as maven RUN apt-get update && \ apt-get install -y \ git \ libfontconfig1 \ libfreetype6 # 阶段3:整合BuildKit、Maven和Jenkins Agent FROM moby/buildkit # 复制Java和Maven环境 COPY --from=maven /usr/lib/jvm/java-11-openjdk-amd64 /usr/lib/jvm/java-11-openjdk-amd64 COPY --from=maven /usr/share/maven /usr/share/maven COPY --from=maven /usr/bin/mvn /usr/bin/mvn COPY --from=maven /root/.m2 /root/.m2 # 复制系统依赖工具和库 COPY --from=maven /usr/bin/git /usr/bin/git COPY --from=maven /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 COPY --from=maven /usr/lib/x86_64-linux-gnu/libfreetype.so.6 /usr/lib/x86_64-linux-gnu/libfreetype.so.6 # 配置环境变量,确保Java和Maven可全局调用 ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 ENV MAVEN_HOME=/usr/share/maven ENV PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH # 复制Jenkins Agent文件 COPY --from=jnlp /usr/local/bin/jenkins-agent /usr/local/bin/jenkins-agent COPY --from=jnlp /usr/share/jenkins/agent.jar /usr/share/jenkins/agent.jar # 默认启动Jenkins Agent ENTRYPOINT ["/usr/local/bin/jenkins-agent"]
可选:支持同时启动BuildKit服务
如果需要在同一个镜像中既可以作为Jenkins Agent,又能启动buildkitd服务,可以添加自定义启动脚本:
- 创建
entrypoint.sh脚本:
#!/bin/sh if [ "$1" = "buildkitd" ]; then exec /usr/bin/buildkitd else exec /usr/local/bin/jenkins-agent "$@" fi
- 修改Dockerfile的ENTRYPOINT部分:
COPY entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
启动时,执行docker run [镜像名] buildkitd就能启动buildkit服务,默认则启动Jenkins Agent。
内容的提问来源于stack exchange,提问作者raboy
相关产品推荐
相关产品推荐

