Docker exec 命令的详细使用

Docker/容器
698
0
0
2022-05-21
标签   Docker

在平时工作中,对于docker exec这个命令使用的还算多,在此写份记录。

简介

为了在运行中的容器内执行命令,以前是需要在镜像里添加一个 SSH Server的,现在直接使用 docker exex 这个命令即可。

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

其中OPTIONS参数如下:

| 参数名 | 简写 | 描述 |

| :—–| —-: | —-: |

| –detach | -d | 分离模式:在后台运行命令 |

| -detach-keys | | 重写分离容器的键序列 |

| -env | -e | 设置环境变量 |

| –interactive | -i | 即使没有连接,也要保持 STDIN 开启 |

| –privileged | | 赋予命令扩展特权 |

| –tty | -t | 分配一个伪 tty |

| -user | -u | 用户名或 UID |

| -workdir | -w | 指定容器内的工作目录 |

需要注意的地方

  • 执行的command只会在容器默认的目录中运行,如果基础镜像中有一个使用了 WORKDIR 指令自定义目录,将会在这个目录下运行。
  • command必须是一个可执行的命令,使用链接和引号的命令将不会被执行。举个例子:
# 这个将不会被执行
docker exec -ti my_container "echo a && echo b"

# 这个可以执行
docker exec -ti my_container sh -c "echo a && echo b"

使用

我们使用 Ubuntu 镜像为例子来做实验。

首先拉取ubuntu镜像

docker pull ubuntu

然后运行一个容器 命名为 ut

docker run -d --name ut -it ubuntu

对于 docker exec 的使用有3种模式。

1.基本模式

这种是在 docker cli 模式命令行下同步执行运行容器中的命令。

$ docker exec ut echo "hello world"
hello world

这个模式和 docker run 比较像了,可以通过指定容器的名字或者容器ID来运行。注意:后面执行的命令是容器内的命令,不是当前宿主机的命令。

2.后台模式

这种是在后台执行容器中的命令,没有输出返回,主要用来执行一些耗时的任务。比如一个耗时的脚本之类

docker exec -d ut touch /tmp/test.txt

3.交互模式

这种主要是在容器上执行交互式 bash shell。会在容器中创建一个新的Bash会话。注意,这个环境变量只在当前的 Bash 会话中有效。

docker exec -it -e VAR=1 ut bash
root@7e535aff75ef:/# echo $VAR
1

默认情况下,docker exec 命令在容器创建时在相同的工作目录集中运行。

[master~]docker exec -it ut pwd

/

你也可以选择执行命令的工作目录,比如下面这样

[master~]docker exec -it -w /root ut pwd

/root