命令基本语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
[OPTIONS]: 命令的参数,用于控制执行行为。CONTAINER: 正在运行的容器名称或 ID。COMMAND: 要在容器内执行的命令。[ARG...]: 传递给该命令的参数。
核心参数详解
以下是 docker exec 最常用的一些参数:

(图片来源网络,侵删)
-i / --interactive
- 全称:
--interactive - 作用: 以交互模式运行容器,即使没有附加到 STDIN(标准输入),通常与
-t一起使用,以获得一个伪终端。 - 场景: 当你需要在容器内启动一个交互式 shell(如
/bin/bash)时,这个参数是必需的。
-t / --tty
- 全称:
--tty - 作用: 分配一个伪终端(pseudo-terminal),创建一个交互式 shell 环境。
- 场景: 与
-i结合使用 (-it),可以让你像 SSH 进去一样,获得一个功能完整的、可交互的命令行终端。
-d / --detach
- 全称:
--detach - 作用: 在后台运行命令,并打印出容器 ID。
- 场景: 当你执行一个不需要交互的命令时(在容器中创建一个文件、检查某个服务状态),使用
-d可以让你立即返回到宿主机的 shell,而不用等待命令执行完毕。
-w / --workdir
- 全称:
--workdir - 作用: 在容器内指定一个工作目录,命令会在这个指定的目录下执行。
- 场景: 如果你要执行的命令依赖于特定的文件路径,可以先切换到该目录。
-u / --user
- 全称:
--user - 作用: 指定命令在容器内以哪个用户身份执行。
- 场景: 出于安全考虑,有时你不需要以
root用户身份执行命令,可以使用用户名(如nginx)或用户 ID(如101)。
--env / -e
- 全称:
--env - 作用: 设置环境变量。
- 场景: 当命令需要读取某些环境变量时,可以通过
-e参数临时传入。
--env-file
- 全称:
--env-file - 作用: 从一个文件中读取环境变量。
- 场景: 当需要传入多个环境变量时,使用文件比在命令行中逐个设置
-e更方便。
--privileged
- 全称:
--privileged - 作用: 以特权模式执行命令,这会赋予容器几乎与宿主机相同的权限。
- 场景: 非常危险! 仅在特殊情况下使用,例如需要在容器内执行一些需要高权限的系统操作(如使用
mount命令),应尽量避免使用。
--rm
- 全称:
--rm - 作用: 命令执行完毕后,自动删除容器。注意:此参数只能用于
docker run,不能用于docker exec,但如果你在docker run时使用-it并进入容器,退出时可以用exit来自动移除容器。
常用组合与示例
假设我们有一个正在运行的 Nginx 容器,名称为 my_nginx。
示例 1:交互式进入容器(最常用)
这是最常见的用法,相当于“进入”容器内部。
# 以 root 用户身份进入 my_nginx 容器的 bash shell docker exec -it my_nginx /bin/bash # 以 nginx 用户身份进入 docker exec -it -u nginx my_nginx /bin/sh
-it: 提供一个交互式终端。/bin/bash或/bin/sh: 要执行的命令,即启动一个 shell。
示例 2:在后台执行命令
检查容器的网络配置,并立即返回宿主机 shell。
# 在后台执行 ip a 命令 docker exec -d my_nginx ip a # 查看命令的输出(需要先知道容器的ID或名称) # 你可以进入容器查看,或者使用 docker logs docker logs my_nginx
示例 3:在指定工作目录下执行命令
假设容器内有一个 /app 目录,你想在其中创建一个文件。

(图片来源网络,侵删)
# 切换到 /app 目录并创建一个 test.txt 文件 docker exec -w /app my_nginx touch test.txt
示例 4:设置环境变量并执行命令
假设你有一个脚本需要读取 MY_VAR 这个环境变量。
# 在容器内设置环境变量并打印它 docker exec -e MY_VAR="hello world" my_nginx /bin/sh -c 'echo $MY_VAR' # 输出: hello world
示例 5:从文件加载环境变量
创建一个 .env 文件:
# .env 文件内容 DB_HOST=database DB_USER=admin
然后在容器中使用这些变量:
docker exec --env-file .env my_nginx /bin/sh -c 'echo "Host: $DB_HOST, User: $DB_USER"' # 输出: Host: database, User: admin
示例 6:查看容器内的文件
不进入容器,直接查看容器内某个文件的内容。

(图片来源网络,侵删)
# 查看 /etc/hosts 文件内容 docker exec my_nginx cat /etc/hosts
示例 7:以非 root 用户执行命令
# 以 nobody 用户(UID 99)执行 id 命令,查看用户信息 docker exec -u 99 my_nginx id # 输出: uid=99(nobody) gid=99(nobody) groups=99(nobody)
重要注意事项
- 容器必须处于运行状态:
docker exec只能对正在运行的容器(Up状态)执行操作,如果容器已停止,你需要先使用docker start <container>启动它。 - 权限问题:默认情况下,
docker exec会以容器的root用户身份执行命令,如果容器内没有安装/bin/bash或/bin/sh,命令会失败,可以使用docker inspect <container>查看容器内的可用命令。 -it的区别:- 只有
-i:命令会运行,但不会有 shell 提示符,输出会直接显示在终端。 - 只有
-t:会分配一个伪终端,但没有 STDIN,交互性差。 -it组合:提供最佳的交互体验,就像 SSH 一样。
- 只有
总结表格
| 参数 | 全称 | 描述 |
|---|---|---|
-i |
--interactive |
保持 STDIN 打开,用于交互 |
-t |
--tty |
分配一个伪终端 |
-d |
--detach |
在后台运行命令 |
-w |
--workdir |
设置容器内的工作目录 |
-u |
--user |
指定执行命令的用户 |
-e |
--env |
设置环境变量 |
--env-file |
--env-file |
从文件中加载环境变量 |
--privileged |
--privileged |
以特权模式执行(高风险) |
希望这份详细的解释能帮助你全面掌握 docker exec 命令!
