标准答案
- 构建器需要读取上下文中可被 Dockerfile 引用的文件,未排除的 node_modules、构建产物、Git 历史和本地缓存都会增加体积。
- 敏感文件即使没有被 COPY,也可能进入构建上下文或构建日志,不能把 .dockerignore 当成秘密管理方案。
- 构建应使用最小上下文、固定工作目录和明确 COPY 路径,必要时使用 secret mount 避免把凭据写入层。
- 排查慢构建要区分上下文上传、依赖下载、编译和镜像导出阶段。
题目解析
build context 是发送给构建器、允许 Dockerfile 读取的文件集合,过大的上下文会增加传输和缓存计算,也会扩大误把秘密带入构建的概率。`.dockerignore` 可以排除文件,但不能替代对 Dockerfile、构建日志和最终层的审计。
秘密一旦通过 COPY、ARG、ENV 或普通 RUN 写入 layer,后续删除只会在新层中删除引用,历史 layer 仍可能被拉取。需要秘密时应使用构建器的 secret mount 或外部凭据,并确保最终镜像、缓存和日志都没有留下值。
常见误区
- 误区:把整个家目录作为 build context。改正:从最小项目目录构建并用 .dockerignore 排除凭据、缓存和无关产物。
- 误区:COPY secret 后再 RUN rm。改正:使用 secret mount 或构建外注入,避免秘密进入任何镜像层。
- 误区:修改 .dockerignore 后不验证。改正:检查实际发送内容、构建日志、缓存和最终镜像层。