You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因

  1. BuildKit守护进程未启动:镜像的ENTRYPOINT被替换为Jenkins agent的启动命令,导致buildkitd(BuildKit核心守护进程)没有运行,/run/buildkit/buildkitd.sock套接字文件自然不存在。
  2. 进程管理缺失:未配置让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:53:22