mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 04:14:38 +00:00
style: apply global formatting fixes (struct, spacing, zhlint)
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
## 7.5 ENTRYPOINT 入口点
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 什么是 ENTRYPOINT
|
||||
|
||||
`ENTRYPOINT` 指定容器启动时运行的入口程序。与 CMD 不同,ENTRYPOINT 定义的命令不会被 `docker run` 的参数覆盖,而是**接收这些参数**。
|
||||
@@ -29,6 +31,8 @@ ENTRYPOINT nginx -g "daemon off;"
|
||||
|
||||
### ENTRYPOINT vs CMD
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 核心区别
|
||||
|
||||
| 特性 | ENTRYPOINT | CMD |
|
||||
@@ -40,6 +44,8 @@ ENTRYPOINT nginx -g "daemon off;"
|
||||
|
||||
#### 行为对比
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
## 只用 CMD
|
||||
|
||||
@@ -80,12 +86,16 @@ $ docker run myimage -v http://other.com # curl -s -v http://other.com ✓
|
||||
|
||||
### 场景一:让镜像像命令一样使用
|
||||
|
||||
#### 需求(启动前准备)
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
创建一个查询公网 IP 的"命令"镜像。
|
||||
#### 需求 (启动前准备)
|
||||
|
||||
创建一个查询公网 IP 的 “命令” 镜像。
|
||||
|
||||
#### 使用 CMD 的问题
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:24.04
|
||||
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
|
||||
@@ -105,6 +115,8 @@ exec: "-i": executable file not found
|
||||
|
||||
#### 使用 ENTRYPOINT 解决
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
FROM ubuntu:24.04
|
||||
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
|
||||
@@ -123,6 +135,8 @@ HTTP/1.1 200 OK
|
||||
|
||||
#### 交互图示
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```
|
||||
ENTRYPOINT ["curl", "-s", "http://myip.ipip.net"]
|
||||
│
|
||||
@@ -138,12 +152,16 @@ curl -s http://myip.ipip.net -i
|
||||
|
||||
### 场景二:启动前的准备工作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 需求
|
||||
|
||||
在启动主服务前执行初始化脚本(如数据库迁移、权限设置)。
|
||||
在启动主服务前执行初始化脚本 (如数据库迁移、权限设置)。
|
||||
|
||||
#### 实现方式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
FROM redis:7-alpine
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
@@ -175,6 +193,8 @@ exec "$@"
|
||||
|
||||
#### 工作流程
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```
|
||||
docker run redis docker run redis bash
|
||||
│ │
|
||||
@@ -189,14 +209,16 @@ docker-entrypoint.sh redis-server docker-entrypoint.sh bash
|
||||
|
||||
#### 关键点
|
||||
|
||||
1. **exec "$@"**:用传入的参数替换当前进程,确保信号正确传递
|
||||
1. **exec “$@”**:用传入的参数替换当前进程,确保信号正确传递
|
||||
2. **条件判断**:根据 CMD 不同执行不同逻辑
|
||||
3. **用户切换**:使用 `gosu` 切换用户(比 `su` 更适合容器)
|
||||
3. **用户切换**:使用 `gosu` 切换用户 (比 `su` 更适合容器)
|
||||
|
||||
---
|
||||
|
||||
### 场景三:带参数的应用
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
FROM python:3.12-slim
|
||||
WORKDIR /app
|
||||
@@ -264,7 +286,11 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
|
||||
|
||||
### 最佳实践
|
||||
|
||||
#### 1. 使用 exec 格式
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1。使用 exec 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
## ✅ 推荐
|
||||
@@ -276,14 +302,16 @@ ENTRYPOINT ["python", "app.py"]
|
||||
ENTRYPOINT python app.py
|
||||
```
|
||||
|
||||
#### 2. 提供有意义的默认参数
|
||||
#### 2。提供有意义的默认参数
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
```docker
|
||||
ENTRYPOINT ["nginx"]
|
||||
CMD ["-g", "daemon off;"]
|
||||
```
|
||||
|
||||
#### 3. 入口脚本使用 exec
|
||||
#### 3。入口脚本使用 exec
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -296,7 +324,7 @@ CMD ["-g", "daemon off;"]
|
||||
exec "$@"
|
||||
```
|
||||
|
||||
#### 4. 处理信号
|
||||
#### 4。处理信号
|
||||
|
||||
确保 ENTRYPOINT 脚本能正确传递信号:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user