Buildkit无法正常运行:Jenkins代理Pod执行buildctl报错求助
问题排查:Jenkins BuildKit Agent Pod中buildctl连接失败
问题背景
基于以下Dockerfile构建了Jenkins inbound agent + BuildKit镜像:
FROM jenkins/inbound-agent:alpine as jnlp FROM moby/buildkit as buildkit USER root RUN apk update \ && apk upgrade \ && apk add --update openjdk11 tzdata curl unzip bash \ && rm -rf /var/cache/apk/* 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 ENTRYPOINT ["/usr/local/bin/jenkins-agent"]
该镜像在Kubernetes中以Pod形式运行正常,但执行buildctl构建命令时报错:
+ buildctl build --frontend dockerfile.v0 --local 'context=.' --local 'dockerfile=.' --output 'type=image,name=docker.io/username/image'
错误信息:
error: listing workers for Build: failed to list workers: Unavailable: connection error: desc = "transport: error while dialing: dial unix /run/buildkit/buildkitd.sock: connect: no such file or directory"
Jenkins Helm Chart中BuildKit相关配置:
builkit: podName: buildkit customJenkinsLabels: buildkit image: "agent-buildkit" tag: "1.0" alwaysPullImage: true
问题原因
- BuildKit守护进程未启动:镜像的ENTRYPOINT被替换为Jenkins agent的启动命令,导致
buildkitd(BuildKit核心守护进程)没有运行,/run/buildkit/buildkitd.sock套接字文件自然不存在。 - 进程管理缺失:未配置让
buildkitd和Jenkins agent两个进程同时在Pod内运行,仅启动了Jenkins agent,BuildKit服务未就绪。
解决方案
需要修改Dockerfile,确保buildkitd和Jenkins agent能同时启动,且buildctl可正常连接到buildkitd。
方案1:用Supervisor管理多进程
修改Dockerfile如下:
FROM jenkins/inbound-agent:alpine as jnlp FROM moby/buildkit:latest as buildkit USER root # 安装Supervisor用于进程管理 RUN apk update \ && apk upgrade \ && apk add --update openjdk11 tzdata curl unzip bash supervisor \ && rm -rf /var/cache/apk/* # 拷贝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 # 创建Supervisor配置目录 RUN mkdir -p /etc/supervisor.d/ # 拷贝Supervisor配置文件(需提前创建该文件) COPY supervisord.conf /etc/supervisor.d/ # 设置Supervisor为ENTRYPOINT ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
配套的supervisord.conf文件内容:
[supervisord] nodaemon=true [program:buildkitd] command=/usr/bin/buildkitd autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:jenkins-agent] command=/usr/local/bin/jenkins-agent autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 environment=JENKINS_AGENT_WORKDIR=/home/jenkins/agent
方案2:自定义启动脚本后台启动buildkitd
如果不想依赖Supervisor,可编写启动脚本:
FROM jenkins/inbound-agent:alpine as jnlp FROM moby/buildkit:latest as buildkit USER root RUN apk update \ && apk upgrade \ && apk add --update openjdk11 tzdata curl unzip bash \ && rm -rf /var/cache/apk/* 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 # 拷贝自定义启动脚本(需提前创建该文件) COPY start-agent.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start-agent.sh ENTRYPOINT ["/usr/local/bin/start-agent.sh"]
配套的start-agent.sh脚本内容:
#!/bin/bash # 后台启动buildkitd /usr/bin/buildkitd & # 以exec方式启动Jenkins agent,保证信号能正确传递 exec /usr/local/bin/jenkins-agent "$@"
额外注意事项
- 若修改了
buildkitd的套接字路径,需在buildctl命令中通过--addr参数指定,例如buildctl --addr unix:///custom/path/buildkitd.sock build ... - 建议在Helm Chart中为该agent Pod配置足够的CPU和内存资源请求/限制,避免BuildKit因资源不足异常退出
内容的提问来源于stack exchange,提问作者raboy
相关产品推荐
相关产品推荐

