标准答案
- 构建阶段可以包含编译器、包管理器和测试工具,运行阶段只保留二进制、运行库和必要配置。
- COPY --from 可以从前一阶段复制指定文件,最终镜像不会自动包含前一阶段未复制的文件。
- 运行时依赖不能只看源码依赖,还要确认动态库、证书、字体、时区数据和非 root 用户存在。
- 构建完成后应用最小运行镜像启动、健康检查和回滚,不能只比较镜像大小。
题目解析
多阶段构建把编译器、源码和测试工具留在 builder stage,只把运行所需文件复制到最终 stage,从而减少体积、攻击面和发布时间。distroless 或 scratch 还能进一步减少用户态工具,但它们不自动保证安全,也会让 shell、调试器、证书和动态库排查变困难。
最终镜像的验收要按实际运行时依赖检查动态库、CA 证书、时区、locale、非 root 用户、工作目录和启动入口。可以用临时 debug sidecar 或外部观测工具诊断,不要为了方便把所有编译工具重新放回生产镜像。
常见误区
- 误区:只复制应用文件,不复制运行时依赖。改正:用 ldd、运行测试和依赖清单确认动态库、证书和资源完整。
- 误区:为了镜像小而删除证书或时区数据。改正:按协议、地区和业务需求保留必要运行库,并用体积与功能测试验证。