Files
docker_practice/07_dockerfile/summary.md
T
yeasy 08e981018e fix(content): 修正四处书内自相矛盾的技术断言
1. FROM「必须是第一条指令」(4.5、7.16、summary 三处)与本书 7.7.4「FROM 之前的
   ARG」整节直接冲突。官方 Dockerfile 参考写的是 "A Dockerfile must begin with a
   FROM instruction. This may be after parser directives, comments, and globally
   scoped ARGs",且 "ARG is the only instruction that may precede FROM"。三处
   一并改成「第一条构建指令」并点明例外。

2. 12 章小结把 USER Namespace 列进「默认启用」的一档,并写「容器 root ≠ 宿主机
   root」;而同章 12.2.2 明写 USER Namespace 默认**不**启用、需 userns-remap 显式
   开启,18.1 更直说「在默认情况下,容器内的 root 用户(UID=0)就是宿主机上的
   root 用户」。小结按正文口径改回——这条读反了会直接误判容器逃逸的风险面。

3. 11.5「目前支持三种日志驱动类型」是 Compose 早期文本的残留。官方支持 json-file、
   local、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs、
   none 共十余种,本书 19 章小结自己就列了六种。改为给出常见取值并链到官方清单。

4. 7.8 与 7.5 的示例注释建议 postgres:latest / redis:latest,而 4.1、7.10、
   7.16、7 章小结、4.5 全都要求避免 latest(7.8 同一文件第 177 行也写「避免
   latest」)。按全书口径改掉这两处。

另:ENV 的空格分隔旧写法(7.6 的「格式一」、附录四的 PG_MAJOR/PATH 示例)改为等号
形式并加注。BuildKit 的 LegacyKeyValueFormat 检查会报
"ENV key=value" should be used instead of legacy "ENV key value" format,
而本书 10.2 与 07 章 README 正是在推荐 docker buildx build --check。
2026-08-07 23:26:12 -07:00

2.7 KiB
Raw Blame History

本章小结

本章详细介绍了 Dockerfile 的所有核心指令,以下是各指令要点的速查表。

指令 作用 关键要点
FROM 指定基础镜像 必须是第一条构建指令;只有全局 ARG 能写在它之前
RUN 在新层执行命令 合并命令、清理缓存以减小体积
COPY 复制文件 优先使用,支持 --from
ADD 更高级的复制 自动解压 tar;公开远程 artifact 应配合 --checksum
CMD 容器启动默认命令 可被 docker run 参数覆盖
ENTRYPOINT 容器入口点 固定启动命令,CMD 作为默认参数
ENV 设置环境变量 构建时 + 运行时均生效
ARG 构建参数 仅构建时生效,FROM 后需重新声明
VOLUME 定义匿名卷 运行时挂载会遮蔽镜像内目录;构建后续写入语义依赖 builder
EXPOSE 声明端口 仅文档作用,不自动映射
WORKDIR 指定工作目录 替代 RUN cd,目录不存在会自动创建
USER 指定运行用户 用户必须已存在,推荐 gosu
HEALTHCHECK 健康检查 支持 starting/healthy/unhealthy 状态
ONBUILD 延迟执行指令 只继承一次,不可级联
LABEL 添加元数据 推荐 OCI 标准标签,替代 MAINTAINER
SHELL 更改默认 shell 推荐 ["/bin/bash", "-o", "pipefail", "-c"]

生产镜像快速检查清单

在将镜像推向生产之前,建议逐条过一遍以下清单:

  • 基础镜像选择了最小化版本(如 alpinedistroless
  • 使用了多阶段构建,最终镜像不含编译工具链
  • 以非 root 用户运行(USER 指令)
  • COPY 优先于 ADD,且仅复制必要文件
  • RUN 指令合并了 apt-get update && install && rm -rf /var/lib/apt/lists/*
  • 设置了 HEALTHCHECK
  • 使用了 .dockerignore 排除 .gitnode_modules 等无关文件
  • 镜像标签使用了具体版本号或 commit hash,而非 latest

更完整的编写指南见附录:Dockerfile 最佳实践

延伸阅读


📝 发现错误或有改进建议? 欢迎提交 IssuePR