镜像构建陷阱
层缓存
COPY . .放在RUN npm install之前 = 每次代码变更都使缓存失效apt-get update和apt-get install分开写 = 数周后包缓存过期--no-cache构建清除全部缓存 — 不只是当前步骤- 一个 stage 的缓存不会用于另一个 stage — 多阶段构建从头开始
多阶段构建
--from=builder拼写错误 = 静默地从错误 stage 复制COPY --from=0是第一个 stage,不是名为 "0" 的 stage- 未命名 stage + 重排 stages =
--from=N指向不同 stage - 从前一 stage 复制的文件丢失权限 — 使用
--chmod复制
基础镜像
python:latest今天 ≠ 明天 — 构建不可复现alpine无 glibc = 很多二进制无法运行 — 报错信息晦涩slim镜像无 shell 工具 = 无法调试- "latest" 可能是不同主版本 — 引入 breaking changes
COPY vs ADD
ADD带 URL 会下载但不缓存 — 重新构建 = 重新下载ADD带 .tar.gz 会自动解压 — 如果不期望就是意外COPY不像 shell 那样展开通配符 —COPY *.json ./可能不符合预期- 远程构建(docker build - < Dockerfile)时 .dockerignore 被忽略
ARG vs ENV
ARG在FROM之后不可用 — 每个 stage 需重新声明ARG有默认值 + 覆盖为空 = 使用默认值,不是空ARG在docker history中可见 — 不用于密钥ENV在运行时持久化 —ARG仅在构建时
体积陷阱
rm -rf /var/lib/apt/lists写在单独的 RUN 中 = 空间未回收(分层)npm install --production在npm install之后 = 开发依赖仍在上一层.git被复制 = 额外几 MB(缺少 .dockerignore 时)- 多个
RUN apt-get= 每个都是带 apt 缓存的层