1. docker exec
1.1. 描述
在运行的容器中执行命令
docker exec 是需要容器处于运行中且 PID 1 进程也处于运行中才能执行的操作。
命令执行后会进入容器的默认工作目录,如果在 Dockerfile 中指定了 WORKDIR 工作目录,则会进入 Dokcerfile 指定的目录,如果命令中指定了工作目录 -w 则会进入该目录。
1.2. 帮助
$ docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the container
1.3. 选项
选项 | 描述 |
---|---|
--detach, -d | 后台运行模式,在后台执行命令相关命令 |
--detach-keys | 指定容器退出时使用的快捷键 |
--env, -e | API 1.25+ 设置环境变量 |
--env-file | API 1.25+ 通过一个文件读取加载环境变量 |
--interactive, -i | 展示容器输入信息 STDIN,即使没有附加也保持 STDIN 标准输入打开 |
--privileged | 为命令提供一些扩展权限 |
--tty, -t | 命令行交互模式,分配一个伪终端 |
--user, -u | 设置用户名(format: |
--workdir, -w | API 1.35+ 指定容器内的工作目录 |
1.4. 示例
1.4.1. 在运行的容器中执行 docker run
创建一个容器,名称为 ubuntu_bash
$ docker run --name ubuntu_bash --rm -i -t ubuntu bash
在后台执行命令创建一个文件
这样可以在 ubuntu_bash 容器中创建一个 /tmp/execWorks 普通文件
$ docker exec -d ubuntu_bash touch /tmp/execWorks
在连接标准输出和配置一个 TTYP 终端
在容器中执行 bash 命令,这样可以登录到容器中分配一个 bash 的 shell 终端,也是常用的登录容器的方法
$ docker exec -it ubuntu_bash bash
登录容器时,可以通过 -e 加载环境变量
可以指定多次,配置多个环境变量。
也可以使用 --env-file 一次性批量添加环境变量
需要注意的时,环境变量的配置只适用于本次会话。即退出后丢失,其他会话不可访问
$ docker exec -it -e VAR=1 ubuntu_bash bash
登录到容器中,会有默认的工作目录
比如在 Dockerfile 中定义的 WORKDIR
或者在 docker create 或 docker run 中定义的 WORKDIR
··· $ docker exec -it ubuntu_bash pwd / ···
也可以在登录容器时,临时指定一个工作目录配置
$ docker exec -it -w /root ubuntu_bash pwd
/root
1.4.2. 在停止的容器中执行 docker run
如果容器处于停止的状态,是无法使用 docker exec
登录到容器中的。
如果执行命令登录一个已经停止的容器,会获得一个异常的报错信息。
$ docker pause test
test
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ae3b36715d2 ubuntu:latest "bash" 17 seconds ago Up 16 seconds (Paused) test
$ docker exec test ls
FATA[0000] Error response from daemon: Container test is paused, unpause the container before exec
$ echo $?
1