mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 20:31:18 +00:00
style: apply global formatting fixes (struct, spacing, zhlint)
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
## 7.1 RUN 执行命令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
RUN <command>
|
||||
RUN ["executable", "param1", "param2"]
|
||||
@@ -13,7 +17,11 @@ RUN ["executable", "param1", "param2"]
|
||||
|
||||
### 两种格式对比
|
||||
|
||||
#### 1. Shell 格式
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。Shell 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
RUN apt-get update
|
||||
@@ -26,7 +34,9 @@ RUN apt-get update
|
||||
RUN echo "Hello" > /test.txt
|
||||
```
|
||||
|
||||
#### 2. Exec 格式
|
||||
#### 2。Exec 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
RUN ["apt-get", "update"]
|
||||
@@ -34,17 +44,19 @@ RUN ["apt-get", "update"]
|
||||
|
||||
- **特点**:直接调用可执行文件,不经过 Shell。
|
||||
- **优势**:避免 Shell 字符串解析问题,适用于参数中包含特殊字符的情况。
|
||||
- **注意**:无法使用 `$VAR` 环境变量替换(除非显式调用 shell)。
|
||||
- **注意**:无法使用 `$VAR` 环境变量替换 (除非显式调用 shell)。
|
||||
|
||||
---
|
||||
|
||||
### 常见最佳实践
|
||||
|
||||
#### 1. 组合命令(减少层数)
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。组合命令 (减少层数)
|
||||
|
||||
每一个 `RUN` 指令都会新建一层镜像。为了减少镜像体积和层数,应使用 `&&` 连接命令。
|
||||
|
||||
**❌ 糟糕的写法**(创建 3 层):
|
||||
**❌ 糟糕的写法** (创建 3 层):
|
||||
|
||||
```docker
|
||||
RUN apt-get update
|
||||
@@ -52,7 +64,7 @@ RUN apt-get install -y nginx
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
**✅ 推荐写法**(创建 1 层):
|
||||
**✅ 推荐写法** (创建 1 层):
|
||||
|
||||
```docker
|
||||
RUN apt-get update && \
|
||||
@@ -60,7 +72,7 @@ RUN apt-get update && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
#### 2. 清理缓存
|
||||
#### 2。清理缓存
|
||||
|
||||
在安装完软件后,立即清除缓存,可以显著减小镜像体积。
|
||||
|
||||
@@ -74,7 +86,7 @@ RUN apt-get update && \
|
||||
RUN apk add --no-cache package-bar
|
||||
```
|
||||
|
||||
#### 3. 使用 `set -e` 和 `pipefail`
|
||||
#### 3。使用 `set -e` 和 `pipefail`
|
||||
|
||||
默认情况下,管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功,整个 `RUN` 就视为成功。
|
||||
|
||||
@@ -97,21 +109,27 @@ RUN wget http://url | gzip -d > file
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### Q: 为什么 `RUN cd /app` 不生效?
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:为什么 `RUN cd /app` 不生效?
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
RUN cd /app
|
||||
RUN touch hello.txt
|
||||
```
|
||||
|
||||
**结果**:`hello.txt` 会出现在根目录 `/`,而不是 `/app`。**原因**:每个 `RUN` 都在一个新的 Shell/容器 环境中执行。`cd` 只影响当前 `RUN` 的环境。**解决**:使用 `WORKDIR` 指令。
|
||||
**结果**:`hello.txt` 会出现在根目录 `/`,而不是 `/app`。**原因**:每个 `RUN` 都在一个新的 Shell/容器环境中执行。`cd` 只影响当前 `RUN` 的环境。**解决**:使用 `WORKDIR` 指令。
|
||||
|
||||
```docker
|
||||
WORKDIR /app
|
||||
RUN touch hello.txt
|
||||
```
|
||||
|
||||
#### Q: 环境变量不生效?
|
||||
#### Q:环境变量不生效?
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
RUN export MY_VAR=hello
|
||||
@@ -129,7 +147,9 @@ RUN echo $MY_VAR
|
||||
|
||||
### 高级技巧
|
||||
|
||||
#### 1. 使用 BuildKit 的挂载缓存
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。使用 BuildKit 的挂载缓存
|
||||
|
||||
BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存,加速构建。
|
||||
|
||||
@@ -148,7 +168,7 @@ RUN --mount=type=cache,target=/go/pkg/mod \
|
||||
go build -o app
|
||||
```
|
||||
|
||||
#### 2. 挂载密钥
|
||||
#### 2。挂载密钥
|
||||
|
||||
安全地使用 SSH 密钥或 Token,而不将其记录在镜像中。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user