mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 04:14:38 +00:00
Refine content
This commit is contained in:
@@ -1,208 +1,30 @@
|
|||||||
## 本章小结
|
## 本章小结
|
||||||
|
|
||||||
| 要点 | 说明 |
|
本章详细介绍了 Dockerfile 的所有核心指令,以下是各指令要点的速查表。
|
||||||
|------|------|
|
|
||||||
| **作用** | 设置后续指令的工作目录 |
|
|
||||||
| **语法** | `WORKDIR /path` |
|
|
||||||
| **自动创建** | 目录不存在会自动创建 |
|
|
||||||
| **持久性** | 影响后续所有指令,直到下次 WORKDIR |
|
|
||||||
| **不要用** | `RUN cd /path` (无效)|
|
|
||||||
|
|
||||||
### 7.19.1 延伸阅读
|
| 指令 | 作用 | 关键要点 |
|
||||||
|
|------|------|---------|
|
||||||
|
| **FROM** | 指定基础镜像 | 必须是第一条指令 |
|
||||||
|
| **RUN** | 在新层执行命令 | 合并命令、清理缓存以减小体积 |
|
||||||
|
| **COPY** | 复制文件 | 优先使用,支持 `--from` |
|
||||||
|
| **ADD** | 更高级的复制 | 自动解压 tar,不推荐用于下载 |
|
||||||
|
| **CMD** | 容器启动默认命令 | 可被 `docker run` 参数覆盖 |
|
||||||
|
| **ENTRYPOINT** | 容器入口点 | 固定启动命令,CMD 作为默认参数 |
|
||||||
|
| **ENV** | 设置环境变量 | 构建时 + 运行时均生效 |
|
||||||
|
| **ARG** | 构建参数 | 仅构建时生效,FROM 后需重新声明 |
|
||||||
|
| **VOLUME** | 定义匿名卷 | VOLUME 之后的修改会丢失 |
|
||||||
|
| **EXPOSE** | 声明端口 | 仅文档作用,不自动映射 |
|
||||||
|
| **WORKDIR** | 指定工作目录 | 替代 `RUN cd`,目录不存在会自动创建 |
|
||||||
|
| **USER** | 指定运行用户 | 用户必须已存在,推荐 gosu |
|
||||||
|
| **HEALTHCHECK** | 健康检查 | 支持 starting/healthy/unhealthy 状态 |
|
||||||
|
| **ONBUILD** | 延迟执行指令 | 只继承一次,不可级联 |
|
||||||
|
| **LABEL** | 添加元数据 | 推荐 OCI 标准标签,替代 MAINTAINER |
|
||||||
|
| **SHELL** | 更改默认 shell | 推荐 `["/bin/bash", "-o", "pipefail", "-c"]` |
|
||||||
|
|
||||||
- [COPY 复制文件](7.2_copy.md):文件复制
|
### 延伸阅读
|
||||||
- [RUN 执行命令](../04_image/4.5_build.md):执行构建命令
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md):Dockerfile 入门
|
||||||
|------|------|
|
|
||||||
| **作用** | 切换后续指令的执行用户 |
|
|
||||||
| **语法** | `USER username` 或 `USER UID:GID` |
|
|
||||||
| **前提** | 用户必须已存在 |
|
|
||||||
| **运行时覆盖** | `docker run -u` |
|
|
||||||
| **切换工具** | 使用 gosu,不用 su/sudo |
|
|
||||||
|
|
||||||
### 7.19.2 延伸阅读
|
|
||||||
|
|
||||||
- [安全](../18_security/README.md):容器安全实践
|
|
||||||
- [ENTRYPOINT](7.5_entrypoint.md):入口脚本中的用户切换
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 安全
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 检测容器应用是否真实可用 |
|
|
||||||
| **命令** | `HEALTHCHECK [选项] CMD command` |
|
|
||||||
| **状态** | starting, healthy, unhealthy |
|
|
||||||
| **Compose** | 支持 `condition: service_healthy` 依赖 |
|
|
||||||
| **注意** | 避免副作用,节省资源 |
|
|
||||||
|
|
||||||
### 7.19.3 延伸阅读
|
|
||||||
|
|
||||||
- [CMD 容器启动命令](7.4_cmd.md):启动主进程
|
|
||||||
- [Compose 模板文件](../11_compose/11.5_compose_file.md):Compose 中的健康检查
|
|
||||||
- [Docker 调试](../appendix/debug.md):容器排障
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 定义在子镜像构建时执行的指令 |
|
|
||||||
| **语法** | `ONBUILD INSTRUCTION` |
|
|
||||||
| **适用** | 基础架构镜像 (Node, Python, Go 等)|
|
|
||||||
| **限制** | 只继承一次,不可级联 |
|
|
||||||
| **规范** | 建议使用 `-onbuild` 标签后缀 |
|
|
||||||
|
|
||||||
### 7.19.4 延伸阅读
|
|
||||||
|
|
||||||
- [COPY 指令](7.2_copy.md):文件复制
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md):基础镜像设计
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 添加 key-value 元数据 |
|
|
||||||
| **语法** | `LABEL k=v k=v ...` |
|
|
||||||
| **规范** | 推荐使用 OCI 标准标签 |
|
|
||||||
| **弃用** | 不要再使用 `MAINTAINER` |
|
|
||||||
| **查看** | `docker inspect` |
|
|
||||||
|
|
||||||
### 7.19.5 延伸阅读
|
|
||||||
|
|
||||||
- [OCI 标签规范](https://github.com/opencontainers/image-spec/blob/main/annotations.md)
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md)
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 更改 RUN/CMD/ENTRYPOINT 的默认 shell |
|
|
||||||
| **Linux 默认** | `["/bin/sh", "-c"]` |
|
|
||||||
| **Windows 默认** | `["cmd", "/S", "/C"]` |
|
|
||||||
| **推荐用法** | `SHELL ["/bin/bash", "-o", "pipefail", "-c"]` |
|
|
||||||
| **影响范围** | 后续所有使用 shell 格式的指令 |
|
|
||||||
|
|
||||||
### 7.19.6 延伸阅读
|
|
||||||
|
|
||||||
- [RUN 指令](../04_image/4.5_build.md):执行命令
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md):错误处理与调试
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 在新层执行命令 |
|
|
||||||
| **原则** | 合并命令,清理缓存 |
|
|
||||||
| **格式** | Shell (常用) vs Exec |
|
|
||||||
| **陷阱** | `cd` 不持久,环境变量不持久 |
|
|
||||||
| **进阶** | 使用 Cache Mount 加速构建 |
|
|
||||||
|
|
||||||
### 7.19.7 延伸阅读
|
|
||||||
|
|
||||||
- [CMD 容器启动命令](7.4_cmd.md):容器启动时的命令
|
|
||||||
- [WORKDIR 指定工作目录](7.10_workdir.md):改变目录
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md)
|
|
||||||
|
|
||||||
| 操作 | 示例 |
|
|
||||||
|------|------|
|
|
||||||
| 复制文件 | `COPY app.js /app/` |
|
|
||||||
| 复制多个文件 | `COPY *.json /app/` |
|
|
||||||
| 复制目录内容 | `COPY src/ /app/src/` |
|
|
||||||
| 修改所有者 | `COPY --chown=node:node . /app/` |
|
|
||||||
| 从构建阶段复制 | `COPY --from=builder /app/dist ./` |
|
|
||||||
|
|
||||||
### 7.19.8 延伸阅读
|
|
||||||
|
|
||||||
- [ADD 指令](7.3_add.md):复制和解压
|
|
||||||
- [WORKDIR 指令](7.10_workdir.md):设置工作目录
|
|
||||||
- [多阶段构建](7.17_multistage_builds.md):优化镜像大小
|
- [多阶段构建](7.17_multistage_builds.md):优化镜像大小
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
- [Dockerfile 最佳实践](../appendix/best_practices.md):编写指南
|
||||||
|
- [安全](../18_security/README.md):容器安全实践
|
||||||
| 场景 | 推荐指令 |
|
- [Compose 模板文件](../11_compose/11.5_compose_file.md):Compose 中的配置
|
||||||
|------|---------|
|
|
||||||
| 复制普通文件 | `COPY` |
|
|
||||||
| 复制目录 | `COPY` |
|
|
||||||
| 自动解压 tar | `ADD` |
|
|
||||||
| 从 URL 下载 | `RUN curl` |
|
|
||||||
| 保持 tar 不解压 | `COPY` |
|
|
||||||
|
|
||||||
### 7.19.9 延伸阅读
|
|
||||||
|
|
||||||
- [COPY 复制文件](7.2_copy.md):基本复制操作
|
|
||||||
- [多阶段构建](7.17_multistage_builds.md):减少镜像体积
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 指定容器启动时的默认命令 |
|
|
||||||
| **推荐格式** | exec 格式 `CMD [“程序”, “参数”]` |
|
|
||||||
| **覆盖方式** | `docker run image 新命令` |
|
|
||||||
| **与 ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 |
|
|
||||||
| **核心原则** | 应用必须在前台运行 |
|
|
||||||
|
|
||||||
### 7.19.10 延伸阅读
|
|
||||||
|
|
||||||
- [ENTRYPOINT 入口点](7.5_entrypoint.md):固定的启动命令
|
|
||||||
- [后台运行](../05_container/5.2_daemon.md):容器前台/后台概念
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| ENTRYPOINT | CMD | 适用场景 |
|
|
||||||
|------------|-----|---------|
|
|
||||||
| ✓ | ✗ | 镜像作为固定命令使用 |
|
|
||||||
| ✗ | ✓ | 简单的默认命令 |
|
|
||||||
| ✓ | ✓ | **推荐**:固定命令 + 可配置参数 |
|
|
||||||
|
|
||||||
### 7.19.11 延伸阅读
|
|
||||||
|
|
||||||
- [CMD 容器启动命令](7.4_cmd.md):默认命令
|
|
||||||
- [最佳实践](../appendix/best_practices.md):启动命令设计
|
|
||||||
- [后台运行](../05_container/5.2_daemon.md):前台/后台概念
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **语法** | `ENV KEY=value` |
|
|
||||||
| **作用范围** | 构建时 + 运行时 |
|
|
||||||
| **覆盖方式** | `docker run -e KEY=value` |
|
|
||||||
| **与 ARG** | ARG 仅构建时,ENV 持久化到运行时 |
|
|
||||||
| **安全** | 不要存储敏感信息 |
|
|
||||||
|
|
||||||
### 7.19.12 延伸阅读
|
|
||||||
|
|
||||||
- [ARG 构建参数](7.7_arg.md):构建时变量
|
|
||||||
- [Compose 环境变量](../11_compose/11.5_compose_file.md):Compose 中的环境变量
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 定义构建时变量 |
|
|
||||||
| **语法** | `ARG NAME=value` |
|
|
||||||
| **覆盖** | `docker build --build-arg NAME=value` |
|
|
||||||
| **作用域** | FROM 之后需要重新声明 |
|
|
||||||
| **vs ENV** | ARG 仅构建时,ENV 构建+运行时 |
|
|
||||||
| **安全** | 不要存储敏感信息 |
|
|
||||||
|
|
||||||
### 7.19.13 延伸阅读
|
|
||||||
|
|
||||||
- [ENV 设置环境变量](7.6_env.md):运行时环境变量
|
|
||||||
- [FROM 指令](../04_image/4.5_build.md):基础镜像指定
|
|
||||||
- [多阶段构建](7.17_multistage_builds.md):复杂构建场景
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 创建挂载点,标记为外部卷 |
|
|
||||||
| **语法** | `VOLUME /path` |
|
|
||||||
| **默认行为** | 自动创建匿名卷 |
|
|
||||||
| **覆盖方式** | `docker run -v name:/path` |
|
|
||||||
| **注意** | VOLUME 之后的修改会丢失 |
|
|
||||||
|
|
||||||
### 7.19.14 延伸阅读
|
|
||||||
|
|
||||||
- [数据卷](../08_data/8.1_volume.md):卷的管理和使用
|
|
||||||
- [挂载主机目录](../08_data/8.2_bind-mounts.md):Bind Mount
|
|
||||||
- [Compose 数据管理](../11_compose/11.5_compose_file.md):Compose 中的卷配置
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 声明容器提供服务的端口 (文档)|
|
|
||||||
| **不会** | 自动映射端口或开放外部访问 |
|
|
||||||
| **配合** | `docker run -P` 自动映射 |
|
|
||||||
| **外部访问** | 需要 `-p 宿主机端口:容器端口` |
|
|
||||||
| **语法** | `EXPOSE 80` 或 `EXPOSE 80/tcp` |
|
|
||||||
|
|
||||||
### 7.19.15 延伸阅读
|
|
||||||
|
|
||||||
- [网络配置](../09_network/README.md):Docker 网络详解
|
|
||||||
- [端口映射](../09_network/9.5_port_mapping.md):-p 参数详解
|
|
||||||
- [Compose 端口](../11_compose/11.5_compose_file.md):Compose 中的端口配置
|
|
||||||
|
|||||||
Reference in New Issue
Block a user