文章目录
-
- 一、参数介绍
-
- 二、命令排列组合和输入输出对应关系
-
- [2.1. 参数组合与命令行映射](#2.1. 参数组合与命令行映射)
- [2.2. 交互式容器:](#2.2. 交互式容器:)
- [2.3. 后台服务容器:](#2.3. 后台服务容器:)
- [2.4. 一次性命令容器:](#2.4. 一次性命令容器:)
- [三、-d 的作用](#三、-d 的作用)
-
- [3.1、默认 docker run](#3.1、默认 docker run)
- [3.2、默认 docker run -i](#3.2、默认 docker run -i)
- [3.3、默认 docker run -t](#3.3、默认 docker run -t)
- [3.4、默认 docker run -it](#3.4、默认 docker run -it)
- 四、常见问题
-
- [4.1. 为什么 "OpenStdin" 为 true 但无法输入?](#4.1. 为什么 "OpenStdin" 为 true 但无法输入?)
- [4.2. "StdinOnce": true 的作用是什么?](#4.2. "StdinOnce": true 的作用是什么?)
- [4.3. 如何让容器后台运行但仍能查看日志?](#4.3. 如何让容器后台运行但仍能查看日志?)
在docker 容器中有几个参数来决定容器的标准输入输出,从而影响容器的交互方式和日志输出,不同的组合实现不同的效果,本文就此展开,它们分别是:
- AttachStdin
- AttachStdout
- AttachStderr
- OpenStdin
- StdinOnce
- Tty
一、参数介绍
1.1. "AttachStdin"
- 含义:容器启动时是否将标准输入(stdin)附加到 Docker 客户端(即当前终端)。
- 值类型:布尔值(true/false)。
- 作用:
- true:允许用户通过终端向容器发送输入(如键盘输入)。
- false:容器的标准输入不附加到终端。
- 典型场景:交互式容器(如
docker run -it)。
1.2. "AttachStdout"
- 含义:容器启动时是否将标准输出(stdout)附加到 Docker 客户端。
- 值类型:布尔值(true/false)。
- 作用:
- true:容器的标准输出会实时显示在终端。
- false:标准输出不会显示在终端,但可能写入日志文件。
- 典型场景:查看容器的输出日志(如
docker run 时默认启用)。
1.3. "AttachStderr"
- 含义:容器启动时是否将标准错误(stderr)附加到 Docker 客户端。
- 值类型:布尔值(true/false)。
- 作用:
- true:容器的标准错误会实时显示在终端。
- false:标准错误不会显示在终端,但可能写入日志文件。
- 典型场景:调试容器错误信息(如
docker run 时默认启用)。
1.4. "OpenStdin"
- 含义:是否保持标准输入(stdin)打开。
- 值类型:布尔值(true/false)。
- 作用:
- true:即使容器未运行交互式命令,也保持 stdin 打开(允许后续输入)。
- false:stdin 关闭(无法通过终端发送输入)。
- 典型场景:需要持续输入的容器(如
docker run -i)。
1.5. "StdinOnce"
- 含义:标准输入(stdin)是否在第一次关闭后不再接受输入。
- 值类型:布尔值(true/false)。
- 作用:
- true:容器在读取完 stdin 后关闭输入流(适用于一次性命令)。
- false:stdin 持续保持打开(适用于交互式命令)。
- 典型场景:一次性命令(如
docker run -i --rm)。
1.6. "Tty"
- 含义:是否为容器分配伪终端(Pseudo TTY)。
- 值类型:布尔值(true/false)。
- 作用:
- true:分配伪终端,支持交互式操作(如运行 shell)。
- false:不分配终端,适合后台服务。
- 典型场景:交互式调试(docker run -it)或后台服务(docker run -d)。
1.7. 总结
| 字段 |
作用 |
典型命令参数 |
| AttachStdin |
是否附加 stdin 到终端 |
-i |
| AttachStdout |
是否附加 stdout 到终端 |
默认启用 |
| AttachStderr |
是否附加 stderr 到终端 |
默认启用 |
| OpenStdin |
是否保持 stdin 打开 |
-i |
| StdinOnce |
stdin 是否在第一次关闭后终止 |
--rm 或一次性命令 |
| Tty |
是否分配伪终端 |
-t |
二、命令排列组合和输入输出对应关系
2.1. 参数组合与命令行映射
| Docker 命令参数 |
对应字段 |
说明 |
| -i |
"OpenStdin": true |
保持 stdin 打开,允许输入。 |
| -t |
"Tty": true |
分配伪终端(PTY),通常与 -i 联用(如 docker run -it)。 |
| 无 -i |
"OpenStdin": false |
stdin 关闭,无法输入。 |
| 无 -t |
"Tty": false |
不分配伪终端。 |
2.2. 交互式容器:
bash
复制代码
docker run -it ubuntu bash
对应字段值:
- "AttachStdin": true
- "OpenStdin": true
- "Tty": true
- "StdinOnce": false
2.3. 后台服务容器:
bash
复制代码
docker run -d nginx
对应字段值:
- "AttachStdin": false
- "OpenStdin": false
- "Tty": false
- "StdinOnce": false
2.4. 一次性命令容器:
bash
复制代码
docker run --rm alpine echo "Hello World"
对应字段值:
- "AttachStdin": false
- "OpenStdin": false
- "Tty": false
- "StdinOnce": true
三、-d 的作用
| 字段 |
作用 |
与 -d 的关系 |
| "AttachStdout" |
是否将 stdout 附加到终端 |
使用 -d 时通常为 false |
| "AttachStderr" |
是否将 stderr 附加到终端 |
使用 -d 时通常为 false |
| "Tty" |
是否分配伪终端(PTY) |
使用 -d 时通常为 false(除非同时使用 -t) |
| "OpenStdin" |
是否保持 stdin 打开 |
使用 -d 时通常为 false |
3.1、默认 docker run
shell
复制代码
docker run centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
false |
| "AttachStdout" |
true |
| "AttachStderr" |
true |
| "Tty" |
false |
| "OpenStdin" |
false |
| "StdinOnce" |
false |
shell
复制代码
docker run -d centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
false |
| "AttachStdout" |
false |
| "AttachStderr" |
false |
| "Tty" |
false |
| "OpenStdin" |
false |
| "StdinOnce" |
false |
3.2、默认 docker run -i
shell
复制代码
docker run -i centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
true |
| "AttachStdout" |
true |
| "AttachStderr" |
true |
| "Tty" |
false |
| "OpenStdin" |
true |
| "StdinOnce" |
true |
shell
复制代码
docker run -i -d centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
false |
| "AttachStdout" |
false |
| "AttachStderr" |
false |
| "Tty" |
false |
| "OpenStdin" |
true |
| "StdinOnce" |
false |
3.3、默认 docker run -t
shell
复制代码
docker run -t centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
false |
| "AttachStdout" |
true |
| "AttachStderr" |
true |
| "Tty" |
true |
| "OpenStdin" |
false |
| "StdinOnce" |
false |
shell
复制代码
docker run -t -d centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
false |
| "AttachStdout" |
false |
| "AttachStderr" |
false |
| "Tty" |
true |
| "OpenStdin" |
false |
| "StdinOnce" |
false |
3.4、默认 docker run -it
shell
复制代码
docker run -it centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
true |
| "AttachStdout" |
true |
| "AttachStderr" |
true |
| "Tty" |
true |
| "OpenStdin" |
true |
| "StdinOnce" |
true |
shell
复制代码
docker run -itd centos:1.0 /bin/bash
| 字段 |
值 |
| "AttachStdin" |
false |
| "AttachStdout" |
false |
| "AttachStderr" |
false |
| "Tty" |
true |
| "OpenStdin" |
true |
| "StdinOnce" |
false |
四、常见问题
4.1. 为什么 "OpenStdin" 为 true 但无法输入?
- 需同时启用 "AttachStdin": true(通过 docker run -i)。
- 示例:docker run -i ubuntu 会启用 "OpenStdin": true,但需配合 -t 才能交互。
4.2. "StdinOnce": true 的作用是什么?
- 容器在读取完 stdin 后关闭输入流,适合一次性命令(如 echo、cat)。
- 示例:docker run --rm alpine cat 输入后按 Ctrl+D 退出。
4.3. 如何让容器后台运行但仍能查看日志?
- 使用 -d(后台运行),并依赖 "AttachStdout" 和 "AttachStderr" 的默认值(true)。
- 示例:docker run -d nginx 会输出日志到终端(除非重定向)。