fix(content): harden Docker practice guide

This commit is contained in:
yeasy
2026-06-16 21:23:21 -07:00
parent f4e684afeb
commit 9fdffa9d91
67 changed files with 343 additions and 278 deletions
+3 -3
View File
@@ -88,17 +88,17 @@ $ docker run -v /my/data:/var/lib/mysql mysql:8.4
### 7.8.5 VOLUME 在构建时的特殊行为
> **重要**VOLUME 之后该目录的修改会被丢弃
> **重要**`VOLUME` 之后再写入该目录的构建语义取决于 builderlegacy builder 会丢弃这些修改BuildKit 会保留但运行容器时一旦该路径挂载了卷卷会遮蔽镜像内同路径的内容
```docker
FROM ubuntu
VOLUME /data
## ❌ 这个文件不会出现在镜像中!
## ⚠️ legacy builder 会丢弃;BuildKit 会保留,但运行时挂载卷会遮蔽它
RUN echo "hello" > /data/test.txt
```
**原因**在构建过程中VOLUME 指令会为该目录创建一个临时匿名卷后续 RUN 指令对该目录的写入实际发生在这个临时卷中而非镜像层当该 RUN 指令结束后临时卷被丢弃因此写入的内容不会保存到最终镜像中注意这与容器运行时创建的匿名卷是不同的运行时创建的卷会在容器生命周期内持续存在
**原因** builder 在构建过程中为该目录创建临时匿名卷后续写入发生在临时卷中BuildKit 则会把修改保留在镜像层为了避免不同 builder 下出现不同结果也为了避免运行时卷遮蔽镜像内初始化数据不要把必须存在的初始化文件写在 `VOLUME` 之后
#### 正确做法