Skip to content

镜像构建陷阱

层缓存

  • COPY . . 放在 RUN npm install 之前 = 每次代码变更都使缓存失效
  • apt-get updateapt-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

  • ARGFROM 之后不可用 — 每个 stage 需重新声明
  • ARG 有默认值 + 覆盖为空 = 使用默认值,不是空
  • ARGdocker history 中可见 — 不用于密钥
  • ENV 在运行时持久化 — ARG 仅在构建时

体积陷阱

  • rm -rf /var/lib/apt/lists 写在单独的 RUN 中 = 空间未回收(分层)
  • npm install --productionnpm install 之后 = 开发依赖仍在上一层
  • .git 被复制 = 额外几 MB(缺少 .dockerignore 时)
  • 多个 RUN apt-get = 每个都是带 apt 缓存的层

由云锦鸿维护