Skip to content

容器与 CI/CD 集成

容器化与 CI/CD 天然契合:CI 负责构建镜像并扫描,CD 负责把镜像交付到目标环境。本文聚焦容器在流水线中的关键环节。

流水线整体视图

代码提交 → 单元测试 → 构建镜像 → 漏洞扫描 → 推送仓库 → 部署(Compose/Swarm/K8s)

对应平台实践:

镜像构建阶段

bash
# 用提交哈希作为 tag,保证可回溯
TAG=$(git rev-parse --short HEAD)
docker build -t myapp:${TAG} -t myapp:latest .

多阶段构建让 CI 同时完成编译与产出精简镜像(见 Dockerfile)。

漏洞扫描(阻断式)

bash
# Trivy 扫描,发现高危即失败
trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:${TAG}

CI 中将其设为门禁,未通过不推送。

推送镜像仓库

bash
echo "$REGISTRY_TOKEN" | docker login -u token --password-stdin $REGISTRY
docker push myapp:${TAG}

CNB 仓库注意二级路径限制,用 tag 前缀区分变体(见 镜像仓库)。

部署阶段

Compose / Swarm

bash
# 拉取新镜像并滚动更新
docker compose -f compose.prod.yml pull
docker compose -f compose.prod.yml up -d

# 或 Swarm stack
docker stack deploy -c stack.yml myapp

Kubernetes

bash
# 更新镜像触发滚动发布
kubectl set image deployment/my-app app=myapp:${TAG} -n prod
kubectl rollout status deployment/my-app -n prod

Helm 方式:

bash
helm upgrade my-app ./chart --set image.tag=${TAG} -n prod

镜像缓存加速

CI 中复用构建缓存可大幅提速:

bash
# 拉取上一版本作为缓存基础
docker pull myapp:latest
docker build --cache-from myapp:latest -t myapp:${TAG} .

安全建议

  • CI 中不把凭证写进镜像,用 secret 变量注入。
  • 使用可信基础镜像,定期更新(Dependabot/Renovate)。
  • 部署前对镜像 digest 做签名(cosign)与验证。

最佳实践

  1. 每次提交产出唯一 tag(哈希/版本号),绝不共用 latest 部署。
  2. 扫描作为门禁,高危镜像禁止入库。
  3. 部署用声明式(compose/K8s manifest/Helm),可回滚。
  4. 流水线中缓存镜像层,缩短构建时间。
  5. 凭证仅存在于 CI secret,绝不出现在 Dockerfile 或日志。