Use a better structure

This commit is contained in:
Baohua Yang
2026-02-09 09:32:05 -08:00
parent fdb879dcf2
commit e669ee0fe8
167 changed files with 2462 additions and 2462 deletions

View File

@@ -1,6 +1,6 @@
# ADD 更高级的复制文件
## ADD 更高级的复制文件
## 基本语法
### 基本语法
```docker
ADD [选项] <源路径>... <目标路径>
@@ -13,7 +13,7 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
---
## ADD vs COPY
### ADD vs COPY
| 特性 | COPY | ADD |
|------|------|-----|
@@ -27,12 +27,12 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
---
## 自动解压功能
### 自动解压功能
### 基本用法
#### 基本用法
```docker
# 自动解压 tar.gz 到目标目录
## 自动解压 tar.gz 到目标目录
ADD app.tar.gz /app/
```
@@ -42,7 +42,7 @@ ADD 会识别并解压以下格式:
- `.tar.bz2` / `.tbz2`
- `.tar.xz` / `.txz`
### 实际应用
#### 实际应用
官方基础镜像通常使用 ADD 解压根文件系统
@@ -51,7 +51,7 @@ FROM scratch
ADD ubuntu-noble-core-cloudimg-amd64-root.tar.gz /
```
### 解压过程
#### 解压过程
```
ADD app.tar.gz /app/
@@ -68,16 +68,16 @@ app.tar.gz 包含: /app/ 目录结果:
---
## URL 下载功能不推荐
### URL 下载功能不推荐
### 基本用法
#### 基本用法
```docker
# 从 URL 下载文件
## 从 URL 下载文件
ADD https://example.com/app.zip /app/app.zip
```
### 为什么不推荐
#### 为什么不推荐
| 问题 | 说明 |
|------|------|
@@ -86,14 +86,14 @@ ADD https://example.com/app.zip /app/app.zip
| 缓存问题 | URL 内容变化时不会重新下载 |
| 层数增加 | 需要额外 RUN 清理 |
### 推荐替代方案
#### 推荐替代方案
```docker
# ❌ 不推荐:使用 ADD 下载
## ❌ 不推荐:使用 ADD 下载
ADD https://example.com/app.tar.gz /tmp/
RUN tar -xzf /tmp/app.tar.gz -C /app && rm /tmp/app.tar.gz
# ✅ 推荐:使用 RUN + curl
## ✅ 推荐:使用 RUN + curl
RUN curl -fsSL https://example.com/app.tar.gz | tar -xz -C /app
```
@@ -104,7 +104,7 @@ RUN curl -fsSL https://example.com/app.tar.gz | tar -xz -C /app
---
## 修改文件所有者
### 修改文件所有者
```docker
ADD --chown=node:node app.tar.gz /app/
@@ -113,43 +113,43 @@ ADD --chown=1000:1000 files/ /app/
---
## 何时使用 ADD
### 何时使用 ADD
### 适合使用 ADD
#### 适合使用 ADD
```docker
# 解压本地 tar 文件
## 解压本地 tar 文件
FROM scratch
ADD rootfs.tar.gz /
# 解压应用包
## 解压应用包
ADD dist.tar.gz /app/
```
### 不适合使用 ADD
#### 不适合使用 ADD
```docker
# 复制普通文件(用 COPY
## 复制普通文件(用 COPY
ADD package.json /app/ # ❌
COPY package.json /app/ # ✅
# 下载文件(用 RUN + curl
## 下载文件(用 RUN + curl
ADD https://example.com/file / # ❌
RUN curl -fsSL ... -o /file # ✅
# 需要保留 tar 不解压(用 COPY
## 需要保留 tar 不解压(用 COPY
ADD archive.tar.gz /archives/ # ❌ 会解压
COPY archive.tar.gz /archives/ # ✅ 保持原样
```
---
## 缓存行为
### 缓存行为
ADD 可能导致构建缓存失效
```docker
# 如果 app.tar.gz 内容变化,此层及后续层都需重建
## 如果 app.tar.gz 内容变化,此层及后续层都需重建
ADD app.tar.gz /app/
RUN npm install
```
@@ -157,46 +157,46 @@ RUN npm install
**优化建议**
```docker
# 先复制依赖文件
## 先复制依赖文件
COPY package*.json /app/
RUN npm install
# 再添加应用代码
## 再添加应用代码
ADD app.tar.gz /app/
```
---
## 最佳实践
### 最佳实践
### 1. 默认使用 COPY
#### 1. 默认使用 COPY
```docker
# ✅ 大多数场景使用 COPY
## ✅ 大多数场景使用 COPY
COPY . /app/
```
### 2. 仅在需要解压时使用 ADD
#### 2. 仅在需要解压时使用 ADD
```docker
# ✅ 自动解压场景
## ✅ 自动解压场景
ADD app.tar.gz /app/
```
### 3. 不要用 ADD 下载文件
#### 3. 不要用 ADD 下载文件
```docker
# ❌ 避免
## ❌ 避免
ADD https://example.com/file.tar.gz /tmp/
# ✅ 推荐
## ✅ 推荐
RUN curl -fsSL https://example.com/file.tar.gz | tar -xz -C /app
```
### 4. 解压后清理
#### 4. 解压后清理
```docker
# 如果需要控制解压过程
## 如果需要控制解压过程
COPY app.tar.gz /tmp/
RUN tar -xzf /tmp/app.tar.gz -C /app && \
rm /tmp/app.tar.gz
@@ -204,7 +204,7 @@ RUN tar -xzf /tmp/app.tar.gz -C /app && \
---
## 本章小结
### 本章小结
| 场景 | 推荐指令 |
|------|---------|
@@ -214,8 +214,8 @@ RUN tar -xzf /tmp/app.tar.gz -C /app && \
| URL 下载 | `RUN curl` |
| 保持 tar 不解压 | `COPY` |
## 延伸阅读
### 延伸阅读
- [COPY 复制文件](copy.md)基本复制操作
- [多阶段构建](../multistage-builds.md)减少镜像体积
- [最佳实践](../../15_appendix/best_practices.md)Dockerfile 编写指南
- [最佳实践](../../15_appendix/15.1_best_practices.md)Dockerfile 编写指南