Fix missing links

This commit is contained in:
Baohua Yang
2026-02-22 13:40:20 -08:00
parent 92ea9623b2
commit e57704271d
54 changed files with 228 additions and 224 deletions

View File

@@ -127,7 +127,7 @@ COPY --from=builder /build/dist .
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1尽早设置 WORKDIR
#### 1. 尽早设置 WORKDIR
如下代码块所示展示了相关示例
@@ -141,7 +141,7 @@ COPY . .
CMD ["node", "server.js"]
```
#### 2使用绝对路径
#### 2. 使用绝对路径
如下代码块所示展示了相关示例
@@ -155,7 +155,7 @@ WORKDIR /app
WORKDIR app
```
#### 3不要用 RUN cd
#### 3. 不要用 RUN cd
如下代码块所示展示了相关示例
@@ -170,7 +170,7 @@ WORKDIR /app
RUN echo "hello" > world.txt
```
#### 4适时重置 WORKDIR
#### 4. 适时重置 WORKDIR
如下代码块所示展示了相关示例

View File

@@ -225,7 +225,7 @@ CMD ["node", "server.js"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1始终使用非 root 用户
#### 1. 始终使用非 root 用户
如下代码块所示展示了相关示例
@@ -241,7 +241,7 @@ CMD ["myapp"]
CMD ["myapp"] # 以 root 运行
```
#### 2使用固定 UID/GID
#### 2. 使用固定 UID/GID
便于在宿主机和容器间共享文件
@@ -253,7 +253,7 @@ RUN addgroup -g 1000 -S appgroup && \
USER 1000:1000
```
#### 3多阶段构建中的 USER
#### 3. 多阶段构建中的 USER
如下代码块所示展示了相关示例

View File

@@ -191,15 +191,15 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1避免副作用
#### 1. 避免副作用
健康检查会被频繁执行不要在检查脚本中进行写操作或消耗大量资源的操作
#### 2使用轻量级工具
#### 2. 使用轻量级工具
优先使用镜像中已有的工具 ( `wget`)避免为了健康检查安装庞大的依赖 ( `curl`)
#### 3设置合理的 Start Period
#### 3. 设置合理的 Start Period
应用启动可能需要时间 ( Java 应用)设置 `--start-period` 可以防止在启动阶段因检查失败而误判
@@ -209,7 +209,7 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq
HEALTHCHECK --start-period=60s CMD curl -f http://localhost/ || exit 1
```
#### 4只检查核心依赖
#### 4. 只检查核心依赖
健康检查应主要关注 **当前服务** 是否可用而不是检查其下游依赖 (数据库等)下游依赖的检查应由应用逻辑处理

View File

@@ -79,7 +79,7 @@ FROM 基础镜像 ──build──> 读取基础镜像触发器 ──> 执行
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1自动处理依赖安装
#### 1. 自动处理依赖安装
如下代码块所示展示了相关示例
@@ -90,7 +90,7 @@ ONBUILD COPY requirements.txt ./
ONBUILD RUN pip install -r requirements.txt
```
#### 2自动编译代码
#### 2. 自动编译代码
如下代码块所示展示了相关示例
@@ -101,7 +101,7 @@ ONBUILD COPY . .
ONBUILD RUN go build -o app main.go
```
#### 3处理静态资源
#### 3. 处理静态资源
如下代码块所示展示了相关示例
@@ -117,7 +117,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1继承性限制
#### 1. 继承性限制
`ONBUILD` 指令 **只会继承一次**
@@ -125,15 +125,15 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
- 镜像 B (FROM A) -> 触发 ONBUILD
- 镜像 C (FROM B) -> **不会** 再次触发 ONBUILD
#### 2构建上下文
#### 2. 构建上下文
子镜像构建时`ONBUILD COPY . .` 中的 `.` 指的是 **子项目** 的构建上下文而不是基础镜像的上下文
#### 3不允许级联
#### 3. 不允许级联
`ONBUILD ONBUILD` 是非法的你不能写 `ONBUILD ONBUILD COPY ...`
#### 4可能会导致构建失败
#### 4. 可能会导致构建失败
由于 `ONBUILD` 实际上是在子镜像中执行指令如果子项目的上下文不满足要求 (例如缺少 `package.json`)会导致子镜像构建失败且错误信息可能比较隐晦
@@ -143,7 +143,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1命名规范
#### 1. 命名规范
建议在镜像标签中添加 `-onbuild` 后缀明确告知使用者该镜像包含触发器
@@ -152,11 +152,11 @@ node:20-onbuild
python:3.12-onbuild
```
#### 2避免执行耗时操作
#### 2. 避免执行耗时操作
尽量不要在 `ONBUILD` 中执行过于耗时或不确定的操作 (如更新系统软件)这会让子镜像构建变得缓慢且不可控
#### 3清理工作
#### 3. 清理工作
如果 `ONBUILD` 指令产生了临时文件最好在同一个指令链中清理或者提供机制让子镜像清理

View File

@@ -23,7 +23,7 @@ SHELL ["executable", "parameters"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1使用 bash 特性
#### 1. 使用 bash 特性
默认的 `/bin/sh` (通常是 dash alpine ash) 功能有限如果你需要使用 bash 的特有功能 (如数组`{}` 扩展`pipefail` )可以切换 shell
@@ -39,7 +39,7 @@ SHELL ["/bin/bash", "-c"]
RUN echo {a..z}
```
#### 2增强错误处理
#### 2. 增强错误处理
默认情况下管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功整个指令就视为成功这可能掩盖构建错误
@@ -61,7 +61,7 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN wget -O - https://invalid-url | tar xz
```
#### 3Windows 环境
#### 3. Windows 环境
Windows 容器中经常需要在 `cmd` `powershell` 之间切换
@@ -127,7 +127,7 @@ RUN echo "Using sh again"
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1推荐开启 pipefail
#### 1. 推荐开启 pipefail
对于使用 bash 的镜像强烈建议开启 `pipefail`以确保构建过程中的错误能被及时捕获
@@ -135,11 +135,11 @@ RUN echo "Using sh again"
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
```
#### 2明确意图
#### 2. 明确意图
如果由于脚本需求必须更改 shell最好在 Dockerfile 中显式声明而不是依赖默认行为
#### 3尽量保持一致
#### 3. 尽量保持一致
避免在 Dockerfile 中频繁切换 SHELL这会使构建过程难以理解和调试尽量在头部定义一次即可

View File

@@ -19,7 +19,7 @@ RUN ["executable", "param1", "param2"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1Shell 格式
#### 1. Shell 格式
如下代码块所示展示了相关示例
@@ -34,7 +34,7 @@ RUN apt-get update
RUN echo "Hello" > /test.txt
```
#### 2Exec 格式
#### 2. Exec 格式
如下代码块所示展示了相关示例
@@ -52,7 +52,7 @@ RUN ["apt-get", "update"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1组合命令 (减少层数)
#### 1. 组合命令 (减少层数)
每一个 `RUN` 指令都会新建一层镜像为了减少镜像体积和层数应使用 `&&` 连接命令
@@ -72,7 +72,7 @@ RUN apt-get update && \
rm -rf /var/lib/apt/lists/*
```
#### 2清理缓存
#### 2. 清理缓存
在安装完软件后立即清除缓存可以显著减小镜像体积
@@ -87,7 +87,7 @@ RUN apt-get update && \
RUN apk add --no-cache package-bar
```
#### 3使用 `set -e` `pipefail`
#### 3. 使用 `set -e` `pipefail`
默认情况下管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功整个 `RUN` 就视为成功
@@ -150,7 +150,7 @@ RUN echo $MY_VAR
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1使用 BuildKit 的挂载缓存
#### 1. 使用 BuildKit 的挂载缓存
BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存加速构建
@@ -169,7 +169,7 @@ RUN --mount=type=cache,target=/go/pkg/mod \
go build -o app
```
#### 2挂载密钥
#### 2. 挂载密钥
安全地使用 SSH 密钥或 Token而不将其记录在镜像中

View File

@@ -256,7 +256,7 @@ Dockerfile
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1利用缓存先复制依赖文件
#### 1. 利用缓存先复制依赖文件
如下代码块所示展示了相关示例
@@ -273,7 +273,7 @@ COPY . .
RUN npm install
```
#### 2使用dockerignore
#### 2. 使用 .dockerignore
如下代码块所示展示了相关示例
@@ -286,7 +286,7 @@ COPY . .
...
```
#### 3明确复制路径
#### 3. 明确复制路径
如下代码块所示展示了相关示例

View File

@@ -214,7 +214,7 @@ ADD app.tar.gz /app/
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1默认使用 COPY
#### 1. 默认使用 COPY
如下代码块所示展示了相关示例
@@ -224,7 +224,7 @@ ADD app.tar.gz /app/
COPY . /app/
```
#### 2仅在需要解压时使用 ADD
#### 2. 仅在需要解压时使用 ADD
如下代码块所示展示了相关示例
@@ -234,7 +234,7 @@ COPY . /app/
ADD app.tar.gz /app/
```
#### 3不要用 ADD 下载文件
#### 3. 不要用 ADD 下载文件
如下代码块所示展示了相关示例
@@ -248,7 +248,7 @@ ADD https://example.com/file.tar.gz /tmp/
RUN curl -fsSL https://example.com/file.tar.gz | tar -xz -C /app
```
#### 4解压后清理
#### 4. 解压后清理
如下代码块所示展示了相关示例

View File

@@ -212,7 +212,7 @@ $ docker run myimage http://other.com # curl -s http://other.com参数覆盖
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1优先使用 exec 格式
#### 1. 优先使用 exec 格式
如下代码块所示展示了相关示例
@@ -226,7 +226,7 @@ CMD ["python", "app.py"]
CMD ["sh", "-c", "echo $PATH && python app.py"]
```
#### 2确保应用在前台运行
#### 2. 确保应用在前台运行
如下代码块所示展示了相关示例
@@ -243,7 +243,7 @@ CMD service nginx start
CMD systemctl start nginx
```
#### 3使用双引号
#### 3. 使用双引号
如下代码块所示展示了相关示例
@@ -257,7 +257,7 @@ CMD ["node", "server.js"]
CMD ['node', 'server.js']
```
#### 4配合 ENTRYPOINT 使用
#### 4. 配合 ENTRYPOINT 使用
如下代码块所示展示了相关示例

View File

@@ -294,7 +294,7 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1使用 exec 格式
#### 1. 使用 exec 格式
如下代码块所示展示了相关示例
@@ -308,7 +308,7 @@ ENTRYPOINT ["python", "app.py"]
ENTRYPOINT python app.py
```
#### 2提供有意义的默认参数
#### 2. 提供有意义的默认参数
如下代码块所示展示了相关示例
@@ -317,7 +317,7 @@ ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]
```
#### 3入口脚本使用 exec
#### 3. 入口脚本使用 exec
运行以下命令
@@ -330,7 +330,7 @@ CMD ["-g", "daemon off;"]
exec "$@"
```
#### 4处理信号
#### 4. 处理信号
确保 ENTRYPOINT 脚本能正确传递信号

View File

@@ -49,7 +49,7 @@ ENV NODE_VERSION=20.10.0 \
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1后续指令中使用
#### 1. 后续指令中使用
如下代码块所示展示了相关示例
@@ -71,7 +71,7 @@ WORKDIR $APP_HOME
COPY . $APP_HOME
```
#### 2容器运行时使用
#### 2. 容器运行时使用
如下代码块所示展示了相关示例
@@ -193,7 +193,7 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1统一管理版本号
#### 1. 统一管理版本号
如下代码块所示展示了相关示例
@@ -211,7 +211,7 @@ RUN apt-get install nginx=${NGINX_VERSION}
RUN apt-get install nginx=1.25.0
```
#### 2不要存储敏感信息
#### 2. 不要存储敏感信息
如下代码块所示展示了相关示例
@@ -227,7 +227,7 @@ ENV DB_PASSWORD=secret123
...
```
#### 3为应用提供合理默认值
#### 3. 为应用提供合理默认值
如下代码块所示展示了相关示例
@@ -237,7 +237,7 @@ ENV APP_ENV=production \
LOG_LEVEL=info
```
#### 4使用有意义的变量名
#### 4. 使用有意义的变量名
如下代码块所示展示了相关示例

View File

@@ -134,7 +134,7 @@ RUN echo "Running with Node $NODE_VERSION"
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1控制基础镜像版本
#### 1. 控制基础镜像版本
如下代码块所示展示了相关示例
@@ -147,7 +147,7 @@ FROM alpine:${ALPINE_VERSION}
$ docker build --build-arg ALPINE_VERSION=3.18 .
```
#### 2设置软件版本
#### 2. 设置软件版本
如下代码块所示展示了相关示例
@@ -157,7 +157,7 @@ ARG NGINX_VERSION=1.25.0
RUN curl -fsSL https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz | tar -xz
```
#### 3配置构建环境
#### 3. 配置构建环境
如下代码块所示展示了相关示例
@@ -172,7 +172,7 @@ RUN if [ "$ENABLE_DEBUG" = "true" ]; then \
fi
```
#### 4配置私有仓库
#### 4. 配置私有仓库
如下代码块所示展示了相关示例
@@ -233,7 +233,7 @@ $ docker build --build-arg HTTP_PROXY=http://proxy:8080 .
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1 ARG 提供合理默认值
#### 1. ARG 提供合理默认值
如下代码块所示展示了相关示例
@@ -247,7 +247,7 @@ ARG NODE_VERSION=20
ARG NODE_VERSION
```
#### 2不要用 ARG 存储敏感信息
#### 2. 不要用 ARG 存储敏感信息
如下代码块所示展示了相关示例
@@ -262,7 +262,7 @@ RUN echo "password=$DB_PASSWORD" > /app/.env
...
```
#### 3使用 ARG 提高构建灵活性
#### 3. 使用 ARG 提高构建灵活性
如下代码块所示展示了相关示例

View File

@@ -73,7 +73,7 @@ VOLUME ["/data", "/logs", "/config"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1自动创建匿名卷
#### 1. 自动创建匿名卷
如果运行时未指定挂载Docker 会自动创建匿名卷
@@ -84,7 +84,7 @@ DRIVER VOLUME NAME
local a1b2c3d4e5f6... # 自动创建的匿名卷
```
#### 2可被命名卷覆盖
#### 2. 可被命名卷覆盖
运行以下命令
@@ -94,7 +94,7 @@ local a1b2c3d4e5f6... # 自动创建的匿名卷
$ docker run -v mysql_data:/var/lib/mysql mysql:8.0
```
#### 3可被 Bind Mount 覆盖
#### 3. 可被 Bind Mount 覆盖
运行以下命令
@@ -263,7 +263,7 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1定义必须持久化的路径
#### 1. 定义必须持久化的路径
如下代码块所示展示了相关示例
@@ -274,7 +274,7 @@ FROM postgres:15
VOLUME /var/lib/postgresql/data
```
#### 2不要在 VOLUME 后修改目录
#### 2. 不要在 VOLUME 后修改目录
如下代码块所示展示了相关示例
@@ -290,7 +290,7 @@ RUN mkdir -p /app/data && cp init-data.json /app/data/
VOLUME /app/data
```
#### 3文档中说明 VOLUME 用途
#### 3. 文档中说明 VOLUME 用途
如下代码块所示展示了相关示例

View File

@@ -39,7 +39,7 @@ EXPOSE 53/udp
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1文档说明
#### 1. 文档说明
告诉镜像使用者容器将在哪些端口提供服务
@@ -56,7 +56,7 @@ $ docker inspect nginx --format '{{.Config.ExposedPorts}}'
map[80/tcp:{}]
```
#### 2配合 -P 使用
#### 2. 配合 -P 使用
使用 `docker run -P` Docker 会自动映射 EXPOSE 的端口到宿主机随机端口
@@ -162,7 +162,7 @@ $ docker run -p 8080:80 nginx # 2. 映射:宿主机 8080 → 容器 80
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1总是声明应用使用的端口
#### 1. 总是声明应用使用的端口
如下代码块所示展示了相关示例
@@ -183,7 +183,7 @@ FROM redis
EXPOSE 6379
```
#### 2使用明确的协议
#### 2. 使用明确的协议
如下代码块所示展示了相关示例
@@ -201,7 +201,7 @@ EXPOSE 53/udp
EXPOSE 53/tcp 53/udp
```
#### 3与应用实际端口保持一致
#### 3. 与应用实际端口保持一致
如下代码块所示展示了相关示例

View File

@@ -26,7 +26,7 @@
### 7.19.2 延伸阅读
- [安全](../17_security/README.md)容器安全实践
- [安全](../18_security/README.md)容器安全实践
- [ENTRYPOINT](7.5_entrypoint.md)入口脚本中的用户切换
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 安全
@@ -41,7 +41,7 @@
### 7.19.3 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)启动主进程
- [Compose 模板文件](../10_compose/10.5_compose_file.md)Compose 中的健康检查
- [Compose 模板文件](../11_compose/11.5_compose_file.md)Compose 中的健康检查
- [Docker 调试](../appendix/20.2_debug.md)容器排障
| 要点 | 说明 |
@@ -163,7 +163,7 @@
### 7.19.12 延伸阅读
- [ARG 构建参数](7.7_arg.md)构建时变量
- [Compose 环境变量](../10_compose/10.5_compose_file.md)Compose 中的环境变量
- [Compose 环境变量](../11_compose/11.5_compose_file.md)Compose 中的环境变量
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南
| 要点 | 说明 |
@@ -191,9 +191,9 @@
### 7.19.14 延伸阅读
- [数据卷](../08_data_network/data/volume.md)卷的管理和使用
- [挂载主机目录](../08_data_network/data/bind-mounts.md)Bind Mount
- [Compose 数据管理](../10_compose/10.5_compose_file.md)Compose 中的卷配置
- [数据卷](../08_data/volume.md)卷的管理和使用
- [挂载主机目录](../08_data/bind-mounts.md)Bind Mount
- [Compose 数据管理](../11_compose/11.5_compose_file.md)Compose 中的卷配置
| 要点 | 说明 |
|------|------|
@@ -205,6 +205,6 @@
### 7.19.15 延伸阅读
- [网络配置](../08_data_network/network/README.md)Docker 网络详解
- [端口映射](../08_data_network/network/port_mapping.md)-p 参数详解
- [Compose 端口](../10_compose/10.5_compose_file.md)Compose 中的端口配置
- [网络配置](../09_network/README.md)Docker 网络详解
- [端口映射](../09_network/port_mapping.md)-p 参数详解
- [Compose 端口](../11_compose/11.5_compose_file.md)Compose 中的端口配置