主题
容器与 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 myappKubernetes
bash
# 更新镜像触发滚动发布
kubectl set image deployment/my-app app=myapp:${TAG} -n prod
kubectl rollout status deployment/my-app -n prodHelm 方式:
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)与验证。
最佳实践
- 每次提交产出唯一 tag(哈希/版本号),绝不共用
latest部署。 - 扫描作为门禁,高危镜像禁止入库。
- 部署用声明式(compose/K8s manifest/Helm),可回滚。
- 流水线中缓存镜像层,缩短构建时间。
- 凭证仅存在于 CI secret,绝不出现在 Dockerfile 或日志。