PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DOCKER_HOST=<unset>
which docker: <not found>
ls /usr/bin/docker*: No such file or directory
env | grep -i docker:
CNB_DOCKER_MODEL_REGISTRY=docker-model.cnb.cool
CNB_PIPELINE_DOCKER_IMAGE=cnbcool/default-build-env ← ★ 关键
CNB_DOCKER_REGISTRY=docker.cnb.cool
动机(Why)
PR #5 诊断块在远端输出了关键真相——截图实证:
★ 关键信号:
CNB_PIPELINE_DOCKER_IMAGE=cnbcool/default-build-env这证明 PR #4 引入的
docker: { image: maven:... }语法让 CNB 回退到了默认镜像cnbcool/default-build-env(该镜像无 maven 无 docker),而不是 maven image。这解释了为什么 coverage 0.19s fail——mvn 都没有。对比证据:
biz-backend-compile远端 64.5s 真跑了mvn compile——它用的是image: maven:*旧语法,说明旧语法才正确生效。变更清单(What)
3 处修正
改动 1:
.cnb.yml(push + MR 4 处回滚)- name: biz-backend-coverage - services: - - docker - docker: - image: maven:3.9-eclipse-temurin-17 + image: maven:3.9-eclipse-temurin-17 + services: + - docker script: ...回到 PR #3 原语法但保留
services: [docker]声明——假设它注入 daemon sidecar 但不注入 CLI(由脚本自装)。改动 2:脚本加
install_docker_cli函数在
functional.sh+coverage.sh都加:download.docker.com/linux/static/下载官方静态二进制(docker-26.1.0.tgz ~30MB)/usr/local/bin/docker+chmod +xapt-get(避免 sudo + 依赖链)改动 3:同时探测
DOCKER_HOSTif [ -z "${DOCKER_HOST:-}" ]; then if [ -S /var/run/docker.sock ]; then # 标准 socket : elif nc -z docker 2375 2>/dev/null; then # CNB sidecar 常见约定 export DOCKER_HOST="tcp://docker:2375" elif nc -z localhost 2375 2>/dev/null; then # localhost 兜底 export DOCKER_HOST="tcp://localhost:2375" fi fi验证证据(How verified)
本地 15/15 CI stages 全绿 + 0 lint + yml 对称 81/81 行
Docker 可用场景(本地有 OrbStack):
本地不能验证的(需远端 CI 真跑):
download.docker.com在 CNB 网络的可达性DOCKER_HOST端点(是docker:2375还是别的)services: [docker]提供的 daemon 是否真的可连影响面(Impact)
本次的假设链(全部依赖远端验证)
services: [docker]确实启动了 dind sidecar(即使 CLI 不注入)docker:2375或localhost:2375暴露 APIDOCKER_HOST即可连通合入后远端 CI 的可能结果(3 种分支)
which docker安装后有效 +docker infoOK + coverage 79/71 ✅docker info超时DOCKER_HOST需调整apt-get install docker.io或镜像内预装回归 PR #3 思路的合理性
PR #3 的
.cnb.yml语法实际是正确的(image: maven + services:);当时失败是因为脚本在command -v docker就exit 0 + WARNING静默跳过。本 PR 保留 services 声明 + 脚本安装 CLI——这是"PR #3 语法 + PR #5 策略"的真实组合。本轮的 meta 意义
候选待办
Refs
CNB_PIPELINE_DOCKER_IMAGE=default-build-env发现CHECKPOINT §四 轮次 3.2待闭环的 T-Q2-hmeta-principles §原则 2(诊断驱动的逐步修复)LESSONS §二 B12推论 + B14 候选(未经实证就修改配置)