mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-25 11:15:39 +00:00
Remove blank lines after code block markers
This commit is contained in:
@@ -25,7 +25,6 @@ CMD ["nginx", "-g", "daemon off;"]
|
||||
CMD ["python", "app.py"]
|
||||
CMD ["node", "server.js"]
|
||||
```
|
||||
|
||||
**优点**:
|
||||
|
||||
- 直接执行指定程序,是容器的 PID 1
|
||||
@@ -38,11 +37,9 @@ CMD ["node", "server.js"]
|
||||
CMD echo "Hello World"
|
||||
CMD nginx -g "daemon off;"
|
||||
```
|
||||
|
||||
**实际执行**:会被包装为 `sh -c`
|
||||
|
||||
```docker
|
||||
|
||||
## 你写的
|
||||
|
||||
CMD echo $HOME
|
||||
@@ -51,7 +48,6 @@ CMD echo $HOME
|
||||
|
||||
CMD ["sh", "-c", "echo $HOME"]
|
||||
```
|
||||
|
||||
**优点**:可以使用环境变量、管道等 shell 特性 **缺点**:主进程是 sh,信号无法正确传递给应用
|
||||
|
||||
---
|
||||
@@ -68,7 +64,6 @@ CMD ["sh", "-c", "echo $HOME"]
|
||||
#### 信号传递问题示例
|
||||
|
||||
```docker
|
||||
|
||||
## ❌ shell 格式:docker stop 会超时
|
||||
|
||||
CMD node server.js
|
||||
@@ -85,7 +80,6 @@ CMD ["node", "server.js"]
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7.4.4 运行时覆盖 CMD
|
||||
@@ -93,13 +87,11 @@ CMD ["node", "server.js"]
|
||||
`docker run` 后的命令会覆盖 Dockerfile 中的 CMD:
|
||||
|
||||
```bash
|
||||
|
||||
## ubuntu 默认 CMD 是 /bin/bash
|
||||
|
||||
$ docker run -it ubuntu # 进入 bash
|
||||
$ docker run ubuntu cat /etc/os-release # 覆盖为 cat 命令
|
||||
```
|
||||
|
||||
```bash
|
||||
Dockerfile: docker run 命令:
|
||||
CMD ["/bin/bash"] + cat /etc/os-release
|
||||
@@ -108,7 +100,6 @@ CMD ["/bin/bash"] + cat /etc/os-release
|
||||
↓
|
||||
执行: cat /etc/os-release
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7.4.5 经典错误:容器立即退出
|
||||
@@ -116,12 +107,10 @@ CMD ["/bin/bash"] + cat /etc/os-release
|
||||
#### 错误示例
|
||||
|
||||
```docker
|
||||
|
||||
## ❌ 容器启动后立即退出
|
||||
|
||||
CMD service nginx start
|
||||
```
|
||||
|
||||
#### 原因分析
|
||||
|
||||
```bash
|
||||
@@ -137,16 +126,13 @@ CMD service nginx start
|
||||
↓
|
||||
6. 容器主进程(sh)退出 → 容器停止
|
||||
```
|
||||
|
||||
#### 正确做法
|
||||
|
||||
```docker
|
||||
|
||||
## ✅ 让 nginx 在前台运行
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7.4.6 CMD vs ENTRYPOINT
|
||||
@@ -159,32 +145,26 @@ CMD ["nginx", "-g", "daemon off;"]
|
||||
#### 单独使用 CMD
|
||||
|
||||
```docker
|
||||
|
||||
## Dockerfile
|
||||
|
||||
CMD ["curl", "-s", "http://example.com"]
|
||||
```
|
||||
|
||||
```bash
|
||||
$ docker run myimage # 执行默认命令
|
||||
$ docker run myimage curl -v ... # 完全覆盖
|
||||
```
|
||||
|
||||
#### 搭配 ENTRYPOINT
|
||||
|
||||
```docker
|
||||
|
||||
## Dockerfile
|
||||
|
||||
ENTRYPOINT ["curl", "-s"]
|
||||
CMD ["http://example.com"]
|
||||
```
|
||||
|
||||
```bash
|
||||
$ docker run myimage # curl -s http://example.com
|
||||
$ docker run myimage http://other.com # curl -s http://other.com(参数覆盖)
|
||||
```
|
||||
|
||||
详见 [ENTRYPOINT 入口点](7.5_entrypoint.md)章节。
|
||||
|
||||
---
|
||||
@@ -194,7 +174,6 @@ $ docker run myimage http://other.com # curl -s http://other.com(参数覆盖
|
||||
#### 1. 优先使用 exec 格式
|
||||
|
||||
```docker
|
||||
|
||||
## ✅ 推荐
|
||||
|
||||
CMD ["python", "app.py"]
|
||||
@@ -203,11 +182,9 @@ CMD ["python", "app.py"]
|
||||
|
||||
CMD ["sh", "-c", "echo $PATH && python app.py"]
|
||||
```
|
||||
|
||||
#### 2. 确保应用在前台运行
|
||||
|
||||
```docker
|
||||
|
||||
## ✅ 前台运行
|
||||
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
@@ -219,11 +196,9 @@ CMD ["java", "-jar", "app.jar"]
|
||||
CMD service nginx start
|
||||
CMD systemctl start nginx
|
||||
```
|
||||
|
||||
#### 3. 使用双引号
|
||||
|
||||
```docker
|
||||
|
||||
## ✅ 正确:双引号
|
||||
|
||||
CMD ["node", "server.js"]
|
||||
@@ -232,11 +207,9 @@ CMD ["node", "server.js"]
|
||||
|
||||
CMD ['node', 'server.js']
|
||||
```
|
||||
|
||||
#### 4. 配合 ENTRYPOINT 使用
|
||||
|
||||
```docker
|
||||
|
||||
## 用于可配置参数的场景
|
||||
|
||||
ENTRYPOINT ["python", "app.py"]
|
||||
@@ -248,7 +221,6 @@ $ docker run myapp --port 9000
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7.4.8 常见问题
|
||||
@@ -261,11 +233,9 @@ $ docker run myapp --port 9000
|
||||
CMD ["echo", "first"]
|
||||
CMD ["echo", "second"] # 只有这个生效
|
||||
```
|
||||
|
||||
#### Q:如何在 CMD 中使用环境变量?
|
||||
|
||||
```docker
|
||||
|
||||
## 方法1:使用 shell 格式
|
||||
|
||||
CMD echo "Port is $PORT"
|
||||
@@ -274,13 +244,11 @@ CMD echo "Port is $PORT"
|
||||
|
||||
CMD ["sh", "-c", "echo Port is $PORT"]
|
||||
```
|
||||
|
||||
#### Q:为什么我的容器不响应 Ctrl+C?
|
||||
|
||||
可能是使用了 shell 格式,信号被 sh 吃掉了:
|
||||
|
||||
```docker
|
||||
|
||||
## ❌ 信号无法传递
|
||||
|
||||
CMD python app.py
|
||||
@@ -289,5 +257,4 @@ CMD python app.py
|
||||
|
||||
CMD ["python", "app.py"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user