mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-28 20:55:21 +00:00
Simplify words and fix format issues
This commit is contained in:
@@ -1,7 +1,5 @@
|
||||
## 7.10 WORKDIR 指定工作目录
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.10.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -30,8 +28,6 @@ COPY . . # 复制到 /app/
|
||||
|
||||
### 7.10.3 为什么需要 WORKDIR
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 常见错误
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -125,8 +121,6 @@ COPY --from=builder /build/dist .
|
||||
|
||||
### 7.10.7 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 尽早设置 WORKDIR
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -188,8 +182,6 @@ WORKDIR /data
|
||||
|
||||
### 7.10.8 与其他指令的关系
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 指令 | WORKDIR 的影响 |
|
||||
|------|---------------|
|
||||
| `RUN` | 在 WORKDIR 中执行命令 |
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.11 USER 指定当前用户
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.11.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -38,8 +36,6 @@ flowchart LR
|
||||
|
||||
### 7.11.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 创建并切换用户
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -94,10 +90,6 @@ RUN useradd -r -s /bin/false appuser
|
||||
USER appuser
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 创建用户的方式
|
||||
|
||||
**Debian/Ubuntu**:
|
||||
@@ -126,8 +118,6 @@ RUN addgroup -g 1001 -S appgroup && \
|
||||
|
||||
### 7.11.5 运行时切换用户
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 使用 gosu (推荐)
|
||||
|
||||
在 ENTRYPOINT 脚本中切换用户时,不要使用 `su` 或 `sudo`,应使用 [gosu](https://github.com/tianon/gosu):
|
||||
@@ -165,8 +155,6 @@ exec gosu redis "$@"
|
||||
|
||||
#### 为什么不用 su/sudo
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 问题 | su/sudo | gosu |
|
||||
|------|---------|------|
|
||||
| TTY 要求 | 需要 | 不需要 |
|
||||
@@ -223,8 +211,6 @@ CMD ["node", "server.js"]
|
||||
|
||||
### 7.11.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 始终使用非 root 用户
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -279,12 +265,8 @@ CMD ["node", "server.js"]
|
||||
|
||||
### 7.11.9 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:权限被拒绝
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
permission denied: '/app/data.log'
|
||||
```
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.12 HEALTHCHECK 健康检查
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.12.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -37,8 +35,6 @@ Starting ──成功──> Healthy ──失败N次──> Unhealthy
|
||||
|
||||
### 7.12.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Web 服务检查
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -59,8 +55,6 @@ HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
|
||||
|
||||
#### 常用选项
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 选项 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| `--interval` | 两次检查的间隔 | 30s |
|
||||
@@ -83,8 +77,6 @@ HEALTHCHECK NONE
|
||||
|
||||
### 7.12.5 常见检查脚本
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### HTTP 服务
|
||||
|
||||
使用 `curl` 或 `wget`:
|
||||
@@ -158,8 +150,6 @@ services:
|
||||
|
||||
### 7.12.7 查看健康状态
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看容器状态(包含健康信息)
|
||||
|
||||
@@ -189,8 +179,6 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq
|
||||
|
||||
### 7.12.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 避免副作用
|
||||
|
||||
健康检查会被频繁执行,不要在检查脚本中进行写操作或消耗大量资源的操作。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.13 ONBUILD 为他人做嫁衣裳
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.13.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -77,8 +75,6 @@ FROM 基础镜像 ──build──> 读取基础镜像触发器 ──> 执行
|
||||
|
||||
### 7.13.4 常见使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 自动处理依赖安装
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -115,8 +111,6 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
|
||||
|
||||
### 7.13.5 注意事项
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 继承性限制
|
||||
|
||||
`ONBUILD` 指令 **只会继承一次**。
|
||||
@@ -141,8 +135,6 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
|
||||
|
||||
### 7.13.6 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 命名规范
|
||||
|
||||
建议在镜像标签中添加 `-onbuild` 后缀,明确告知使用者该镜像包含触发器。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.14 LABEL 为镜像添加元数据
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.14.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -25,8 +23,6 @@ LABEL <key>=<value> <key>=<value> ...
|
||||
|
||||
### 7.14.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 定义单个标签
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -67,10 +63,6 @@ LABEL maintainer="user@example.com" \
|
||||
| `org.opencontainers.image.title` | 镜像标题 | `My App` |
|
||||
| `org.opencontainers.image.description` | 描述 | `Production ready web server` |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 示例
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -132,8 +124,6 @@ $ docker build \
|
||||
|
||||
### 7.14.7 查看标签
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker inspect
|
||||
|
||||
查看镜像的标签信息:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.15 SHELL 指令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.15.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -21,8 +19,6 @@ SHELL ["executable", "parameters"]
|
||||
|
||||
### 7.15.2 为什么要用 SHELL 指令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 使用 bash 特性
|
||||
|
||||
默认的 `/bin/sh` (通常是 dash 或 alpine 的 ash) 功能有限。如果你需要使用 bash 的特有功能 (如数组、`{}` 扩展、`pipefail` 等),可以切换 shell。
|
||||
@@ -125,8 +121,6 @@ RUN echo "Using sh again"
|
||||
|
||||
### 7.15.5 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 推荐开启 pipefail
|
||||
|
||||
对于使用 bash 的镜像,强烈建议开启 `pipefail`,以确保构建过程中的错误能被及时捕获。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.1 RUN 执行命令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.1.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -17,8 +15,6 @@ RUN ["executable", "param1", "param2"]
|
||||
|
||||
### 7.1.2 两种格式对比
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. Shell 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -50,8 +46,6 @@ RUN ["apt-get", "update"]
|
||||
|
||||
### 7.1.3 常见最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 组合命令 (减少层数)
|
||||
|
||||
每一个 `RUN` 指令都会新建一层镜像。为了减少镜像体积和层数,应使用 `&&` 连接命令。
|
||||
@@ -110,8 +104,6 @@ RUN wget http://url | gzip -d > file
|
||||
|
||||
### 7.1.4 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:为什么 `RUN cd /app` 不生效?
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -148,8 +140,6 @@ RUN echo $MY_VAR
|
||||
|
||||
### 7.1.5 高级技巧
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 使用 BuildKit 的挂载缓存
|
||||
|
||||
BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存,加速构建。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.2 COPY 复制文件
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.2.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -17,8 +15,6 @@ COPY [选项] ["<源路径1>", "<源路径2>", ... "<目标路径>"]
|
||||
|
||||
### 7.2.2 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 复制单个文件
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -90,8 +86,6 @@ COPY app[0-9].js /app/ # app0.js ~ app9.js
|
||||
|
||||
### 7.2.4 目标路径
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 绝对路径
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -163,8 +157,6 @@ COPY start.sh /app/
|
||||
|
||||
### 7.2.7 COPY vs ADD
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | COPY | ADD |
|
||||
|------|------|-----|
|
||||
| 复制本地文件 | ✅ | ✅ |
|
||||
@@ -189,8 +181,6 @@ ADD app.tar.gz /app/
|
||||
|
||||
### 7.2.8 多阶段构建中的 COPY
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 从其他构建阶段复制
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -254,8 +244,6 @@ Dockerfile
|
||||
|
||||
### 7.2.10 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 利用缓存,先复制依赖文件
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.3 ADD 更高级的复制文件
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.3.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -20,8 +18,6 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
|
||||
|
||||
### 7.3.2 ADD vs COPY
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | COPY | ADD |
|
||||
|------|------|-----|
|
||||
| 复制本地文件 | ✅ | ✅ |
|
||||
@@ -36,8 +32,6 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
|
||||
|
||||
### 7.3.3 自动解压功能
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本用法 (自动解压本地 tar)
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -85,8 +79,6 @@ app.tar.gz 包含: /app/ 目录结果:
|
||||
|
||||
### 7.3.4 URL 下载功能 (不推荐)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本用法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -99,8 +91,6 @@ ADD https://example.com/app.zip /app/app.zip
|
||||
|
||||
#### 为什么不推荐
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 问题 | 说明 |
|
||||
|------|------|
|
||||
| 权限固定 | 下载的文件权限为 600,通常需要额外 RUN 修改 |
|
||||
@@ -144,8 +134,6 @@ ADD --chown=1000:1000 files/ /app/
|
||||
|
||||
### 7.3.6 何时使用 ADD
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### ✅ 适合使用 ADD
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -212,8 +200,6 @@ ADD app.tar.gz /app/
|
||||
|
||||
### 7.3.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 默认使用 COPY
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.4 CMD 容器启动命令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.4.1 什么是 CMD
|
||||
|
||||
`CMD` 指令用于指定容器启动时默认执行的命令。它定义了容器的 “主进程”。
|
||||
@@ -63,8 +61,6 @@ CMD ["sh", "-c", "echo $HOME"]
|
||||
|
||||
### 7.4.3 exec 格式 vs shell 格式
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | exec 格式 | shell 格式 |
|
||||
|------|----------|-----------|
|
||||
| 主进程 | 指定的程序 | `/bin/sh` |
|
||||
@@ -72,10 +68,6 @@ CMD ["sh", "-c", "echo $HOME"]
|
||||
| 环境变量 | ❌ 需要 shell 包装 | ✅ 自动解析 |
|
||||
| 推荐使用 | ✅ 大多数场景 | 需要 shell 特性时 |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 信号传递问题示例
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -122,8 +114,6 @@ CMD ["/bin/bash"] + cat /etc/os-release
|
||||
|
||||
### 7.4.5 经典错误:容器立即退出
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 错误示例
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -166,8 +156,6 @@ CMD ["nginx", "-g", "daemon off;"]
|
||||
|
||||
### 7.4.6 CMD vs ENTRYPOINT
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 指令 | 用途 | 运行时行为 |
|
||||
|------|------|-----------|
|
||||
| **CMD**| 默认命令 | `docker run` 参数会 **覆盖** 它 |
|
||||
@@ -210,8 +198,6 @@ $ docker run myimage http://other.com # curl -s http://other.com(参数覆盖
|
||||
|
||||
### 7.4.7 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 优先使用 exec 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -278,8 +264,6 @@ $ docker run myapp --port 9000
|
||||
|
||||
### 7.4.8 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:CMD 可以写多个吗?
|
||||
|
||||
不可以。多个 CMD 只有最后一个生效:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.5 ENTRYPOINT 入口点
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.5.1 什么是 ENTRYPOINT
|
||||
|
||||
`ENTRYPOINT` 指定容器启动时运行的入口程序。与 CMD 不同,ENTRYPOINT 定义的命令不会被 `docker run` 的参数覆盖,而是 **接收这些参数**。
|
||||
@@ -12,8 +10,6 @@
|
||||
|
||||
### 7.5.2 语法格式
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 格式 | 语法 | 推荐程度 |
|
||||
|------|------|---------|
|
||||
| **exec 格式**| `ENTRYPOINT ["可执行文件", "参数1"]` | ✅**推荐** |
|
||||
@@ -33,12 +29,8 @@ ENTRYPOINT nginx -g "daemon off;"
|
||||
|
||||
### 7.5.3 ENTRYPOINT vs CMD
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 核心区别
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ENTRYPOINT | CMD |
|
||||
|------|------------|-----|
|
||||
| **定位** | 固定的入口程序 | 默认参数 |
|
||||
@@ -90,8 +82,6 @@ $ docker run myimage -v http://other.com # curl -s -v http://other.com ✓
|
||||
|
||||
### 7.5.4 场景一:让镜像像命令一样使用
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 需求 (启动前准备)
|
||||
|
||||
创建一个查询公网 IP 的 “命令” 镜像。
|
||||
@@ -156,8 +146,6 @@ curl -s http://myip.ipip.net -i
|
||||
|
||||
### 7.5.5 场景二:启动前的准备工作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 需求
|
||||
|
||||
在启动主服务前执行初始化脚本 (如数据库迁移、权限设置)。
|
||||
@@ -276,8 +264,6 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
|
||||
|
||||
### 7.5.8 ENTRYPOINT 与 CMD 组合表
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| ENTRYPOINT | CMD | 最终执行命令 |
|
||||
|------------|-----|-------------|
|
||||
| 无 | 无 | 无 (容器无法启动)|
|
||||
@@ -292,8 +278,6 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
|
||||
|
||||
### 7.5.9 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 使用 exec 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -319,8 +303,6 @@ CMD ["-g", "daemon off;"]
|
||||
|
||||
#### 3. 入口脚本使用 exec
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
#!/bin/sh
|
||||
## 准备工作...
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.6 ENV 设置环境变量
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.6.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -20,8 +18,6 @@ ENV <key1>=<value1> <key2>=<value2> ...
|
||||
|
||||
### 7.6.2 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 设置单个变量
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -47,8 +43,6 @@ ENV NODE_VERSION=20.10.0 \
|
||||
|
||||
### 7.6.3 环境变量的作用
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 后续指令中使用
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -130,14 +124,8 @@ $ docker run -e APP_ENV=development -e DEBUG=true myimage
|
||||
$ docker run --env-file .env myimage
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 。env 文件格式
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## .env
|
||||
|
||||
@@ -150,8 +138,6 @@ DATABASE_URL=postgres://localhost/mydb
|
||||
|
||||
### 7.6.6 ENV vs ARG
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ENV | ARG |
|
||||
|------|-----|-----|
|
||||
| **生效时间** | 构建时 + 运行时 | 仅构建时 |
|
||||
@@ -159,10 +145,6 @@ DATABASE_URL=postgres://localhost/mydb
|
||||
| **覆盖方式** | `docker run -e` | `docker build --build-arg` |
|
||||
| **适用场景** | 应用配置 | 构建参数 (如版本号)|
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 组合使用
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -191,8 +173,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
|
||||
|
||||
### 7.6.7 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 统一管理版本号
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -257,8 +237,6 @@ ENV HOST=localhost \
|
||||
|
||||
### 7.6.8 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:环境变量在 CMD 中不展开
|
||||
|
||||
exec 格式不会自动展开环境变量:
|
||||
@@ -275,8 +253,6 @@ CMD ["sh", "-c", "python app.py --port $PORT"]
|
||||
|
||||
#### Q:如何查看容器的环境变量
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker inspect mycontainer --format '{{json .Config.Env}}'
|
||||
$ docker exec mycontainer env
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.7 ARG 构建参数
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.7.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -16,8 +14,6 @@ ARG <参数名>[=<默认值>]
|
||||
|
||||
### 7.7.2 ARG vs ENV
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ARG | ENV |
|
||||
|------|-----|-----|
|
||||
| **生效时间** | 仅构建时 | 构建时 + 运行时 |
|
||||
@@ -39,8 +35,6 @@ ARG <参数名>[=<默认值>]
|
||||
|
||||
### 7.7.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 定义和使用
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -58,8 +52,6 @@ RUN echo "Using Node.js $NODE_VERSION"
|
||||
|
||||
#### 构建时覆盖
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用默认值
|
||||
|
||||
@@ -74,8 +66,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
|
||||
|
||||
### 7.7.4 ARG 的作用域
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### FROM 之前的 ARG
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -132,8 +122,6 @@ RUN echo "Running with Node $NODE_VERSION"
|
||||
|
||||
### 7.7.5 常见使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 控制基础镜像版本
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -231,8 +219,6 @@ $ docker build --build-arg HTTP_PROXY=http://proxy:8080 .
|
||||
|
||||
### 7.7.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 为 ARG 提供合理默认值
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.8 VOLUME 定义匿名卷
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.8.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -47,8 +45,6 @@ flowchart LR
|
||||
|
||||
### 7.8.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 定义单个卷
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -71,8 +67,6 @@ VOLUME ["/data", "/logs", "/config"]
|
||||
|
||||
### 7.8.4 VOLUME 的行为
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 自动创建匿名卷
|
||||
|
||||
如果运行时未指定挂载,Docker 会自动创建匿名卷:
|
||||
@@ -86,8 +80,6 @@ local a1b2c3d4e5f6... # 自动创建的匿名卷
|
||||
|
||||
#### 2. 可被命名卷覆盖
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用命名卷替代匿名卷
|
||||
|
||||
@@ -96,8 +88,6 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
|
||||
|
||||
#### 3. 可被 Bind Mount 覆盖
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用宿主机目录替代
|
||||
|
||||
@@ -121,10 +111,6 @@ RUN echo "hello" > /data/test.txt
|
||||
|
||||
**原因**:VOLUME 指令之后,Docker 将该目录视为外部挂载点,不再记录对它的修改。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 正确做法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -145,8 +131,6 @@ VOLUME /data
|
||||
|
||||
### 7.8.6 常见使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 数据库持久化
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -178,8 +162,6 @@ VOLUME /app/uploads
|
||||
|
||||
### 7.8.7 查看 VOLUME 定义
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看镜像定义的 VOLUME
|
||||
|
||||
@@ -197,8 +179,6 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
|
||||
### 7.8.8 VOLUME vs docker run -v
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | Dockerfile VOLUME | docker run -v |
|
||||
|------|-------------------|---------------|
|
||||
| **定义时机** | 镜像构建时 | 容器运行时 |
|
||||
@@ -232,16 +212,8 @@ volumes:
|
||||
|
||||
### 7.8.10 安全注意事项
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 匿名卷可能导致数据丢失
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用 --rm 运行的容器,匿名卷会在容器删除时一起删除
|
||||
|
||||
@@ -261,8 +233,6 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
|
||||
|
||||
### 7.8.11 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 定义必须持久化的路径
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.9 EXPOSE 声明端口
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.9.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -37,8 +35,6 @@ EXPOSE 53/udp
|
||||
|
||||
### 7.9.3 EXPOSE 的作用
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 文档说明
|
||||
|
||||
告诉镜像使用者,容器将在哪些端口提供服务:
|
||||
@@ -76,8 +72,6 @@ $ docker port $(docker ps -q)
|
||||
|
||||
### 7.9.4 EXPOSE vs -p
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | EXPOSE | -p |
|
||||
|------|--------|-----|
|
||||
| **位置** | Dockerfile | docker run 命令 |
|
||||
@@ -92,10 +86,6 @@ flowchart TD
|
||||
Expose ~~~ Run
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 没有 EXPOSE 也能 -p
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -119,8 +109,6 @@ $ docker run -p 8080:80 mynginx
|
||||
|
||||
### 7.9.5 常见误解
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 误解:EXPOSE 会打开端口
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -160,8 +148,6 @@ $ docker run -p 8080:80 nginx # 2. 映射:宿主机 8080 → 容器 80
|
||||
|
||||
### 7.9.6 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 总是声明应用使用的端口
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# 第七章 Dockerfile 指令详解
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
## 什么是 Dockerfile
|
||||
|
||||
Dockerfile 是一个文本文件,其內包含了一条条的 **指令 (Instruction)**,每一条指令构建一层,therefore 每一条指令的内容,就是描述该层应当如何构建。
|
||||
@@ -19,10 +17,6 @@ Dockerfile 是一个文本文件,其內包含了一条条的 **指令 (Instruc
|
||||
|
||||
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
|
||||
|
||||
### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
### 指令详解
|
||||
|
||||
本章将详细讲解 Dockerfile 中的各个指令:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.19 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 要点 | 说明 |
|
||||
|------|------|
|
||||
| **作用** | 设置后续指令的工作目录 |
|
||||
|
||||
Reference in New Issue
Block a user