Bitbucket CI/CD中使用Docker BuildKit与--mount时报HTTPS请求错误
问题描述
我在Bitbucket CI/CD流水线中尝试通过DOCKER_BUILDKIT=1结合Docker --mount标记,为依赖PNPM的应用做容器构建缓存优化,遇到了报错。已设置环境变量DOCKER_BUILDKIT=1启用BuildKit特性,但流水线运行时抛出以下错误:
#4 ERROR: failed to do request: Head "https://10.61.202.23:5000/v2/library/node/manifests/18.17?ns=docker.io": http: server gave HTTP response to HTTPS client
[internal] load metadata for docker.io/library/node:18.17:
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://10.61.202.23:5000/v2/library/node/manifests/18.17?ns=docker.io": http: server gave HTTP response to HTTPS client
涉及的Dockerfile构建片段:
FROM node:18.17 as build ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable WORKDIR /opt/app COPY ./package.json ./pnpm-lock.yaml ./.npmrc ./ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile --prod COPY ./ . RUN pnpm build
本地用相同的DOCKER_BUILDKIT=1和--mount标记构建完全正常,仅在Bitbucket流水线中出现该错误。需要明确问题原因及解决方法,实现流水线中带缓存优化的镜像构建。
问题原因
核心原因是Bitbucket流水线环境配置了HTTP协议的私有镜像仓库,但BuildKit默认强制使用HTTPS访问镜像仓库。本地构建正常是因为你的本地Docker已配置信任该私有仓库的HTTP访问,或者本地未走这个私有镜像代理。
从错误信息可看出,Bitbucket的Docker环境将docker.io/library/node:18.17的请求转发到了10.61.202.23:5000这个私有仓库,但该仓库仅支持HTTP,BuildKit默认的HTTPS访问逻辑与仓库的HTTP响应不兼容,导致报错。
解决方法
1. 配置BuildKit信任私有仓库的HTTP访问
在Bitbucket流水线的构建步骤中,需要让Docker允许该私有仓库的HTTP不安全访问:
- 如果使用Bitbucket自带的Docker服务,可在
bitbucket-pipelines.yml中修改Docker daemon配置:
pipelines: default: - step: name: Build Docker Image with BuildKit services: - docker script: - | echo '{"insecure-registries": ["10.61.202.23:5000"]}' > /etc/docker/daemon.json systemctl restart docker - export DOCKER_BUILDKIT=1 - docker build -t your-image-name .
- 若流水线环境不允许修改
daemon.json,可通过BUILDKIT_CONFIG环境变量直接指定配置:
export BUILDKIT_CONFIG='{"registry": {"mirrors": {"docker.io": {"endpoint": ["http://10.61.202.23:5000"]}},"configs": {"10.61.202.23:5000": {"tls": false}}}}' export DOCKER_BUILDKIT=1 docker build -t your-image-name .
2. 校验Bitbucket流水线的镜像源配置
检查Bitbucket流水线是否默认配置了内部镜像代理,确认代理仓库的协议类型。如果只能使用HTTP,必须确保BuildKit已明确信任该仓库的HTTP访问规则。
3. 确保BuildKit缓存在流水线中生效
解决仓库访问问题后,需保证--mount=type=cache的PNPM缓存能跨构建保留:
利用Bitbucket的Pipeline Cache功能配合BuildKit缓存,在bitbucket-pipelines.yml中添加缓存配置:
pipelines: default: - step: name: Build with cached PNPM store services: - docker caches: - docker - pnpm-store script: - export DOCKER_BUILDKIT=1 - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t your-image-name . definitions: caches: pnpm-store: /pnpm/store
内容的提问来源于stack exchange,提问作者Rich

