mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 16:37:34 +00:00
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。
49 lines
2.7 KiB
Go
49 lines
2.7 KiB
Go
## 本章小结
|
||
|
||
本章详细介绍了 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"]` |
|
||
|
||
### 生产镜像快速检查清单
|
||
|
||
在将镜像推向生产之前,建议逐条过一遍以下清单:
|
||
|
||
- [ ] 基础镜像选择了最小化版本(如 `alpine`、`distroless`)
|
||
- [ ] 使用了[多阶段构建](7.17_multistage_builds.md),最终镜像不含编译工具链
|
||
- [ ] 以非 root 用户运行(`USER` 指令)
|
||
- [ ] `COPY` 优先于 `ADD`,且仅复制必要文件
|
||
- [ ] `RUN` 指令合并了 `apt-get update && install && rm -rf /var/lib/apt/lists/*`
|
||
- [ ] 设置了 `HEALTHCHECK`
|
||
- [ ] 使用了 `.dockerignore` 排除 `.git`、`node_modules` 等无关文件
|
||
- [ ] 镜像标签使用了具体版本号或 commit hash,而非 `latest`
|
||
|
||
> 更完整的编写指南见[附录:Dockerfile 最佳实践](../appendix/best_practices.md)。
|
||
|
||
### 延伸阅读
|
||
|
||
- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md):Dockerfile 入门
|
||
- [多阶段构建](7.17_multistage_builds.md):优化镜像大小
|
||
- [Dockerfile 最佳实践](../appendix/best_practices.md):编写指南
|
||
- [安全](../18_security/README.md):容器安全实践
|
||
- [Compose 模板文件](../11_compose/11.5_compose_file.md):Compose 中的配置
|
||
---
|
||
|
||
> 📝 **发现错误或有改进建议?** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。
|