问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

如何使用 docker exec 在 Docker 容器中运行命令

创作时间:
作者:
@小白创作中心

如何使用 docker exec 在 Docker 容器中运行命令

引用
1
来源
1.
https://m.php.cn/faq/1179156.html

Docker exec命令是Docker容器管理中的一个重要工具,它允许用户在正在运行的容器中执行命令。本文将详细介绍如何使用docker exec命令,包括启动测试容器、查找容器名称、运行交互式shell、非交互式命令等实用场景,并提供常见错误的解决方案。

先决条件

本教程假设您已经拥有 Docker已安装并且您的用户有权运行docker。如果您需要以 root 用户身份运行 docker,请记住在本教程中的命令前添加 sudo。

有关在没有 sudo 访问权限的情况下使用 Docker 的更多信息,请参阅在没有 sudo 访问权限的情况下执行 Docker 命令部分我们的如何安装 Docker 教程。

启动测试容器

要使用 docker exec 命令,您将需要 跑步 Docker 容器。如果您还没有容器,请开始测试 使用以下 docker run 命令创建容器:

docker run -d --name container-namealpine watch "date >> /var/log/date.log"

此命令从官方高山图像。这是一个流行的 Linux 容器映像,它使用 Alpine Linux,这是一种轻量级、最小化的 Linux 发行版。

我们使用 -d 标志将容器与终端分离并在后台运行。 --namecontainer-name将命名容器container-name。 您可以在这里选择任何您喜欢的名称,或者完全将其保留给 让 Docker 自动为新容器生成唯一的名称。

接下来我们有 alpine,它指定我们要用于容器的镜像。

最后,我们观看“date > > /var/log/date.log”。这是我们要在容器中运行的命令。默认情况下,watch 会重复运行您给出的命令,每两秒一次。在这种情况下,watch 将运行的命令是 date >> /var/log/date.log。 date 打印当前日期和时间,如下所示:

OutputFri Jul 23 14:57:05 UTC 2021

/var/该命令的 log/date.log 部分重定向 date 的输出并将其附加到文件 /var/log/date.log。每两秒就会在文件中添加一个新行,几秒钟后它将如下所示:

OutputFri Jul 23 15:00:26 UTC 2021Fri Jul 23 15:00:28 UTC 2021Fri Jul 23 15:00:30 UTC 2021Fri Jul 23 15:00:32 UTC 2021Fri Jul 23 15:00:34 UTC 2021

在 下一步,我们将学习如何查找 Docker 容器的名称。 如果您已经有一个目标容器,但是这会很有用 不确定它的名字是什么。

查找 Docker 容器的名称

我们需要向 docker exec 提供我们想要工作的容器的名称(或容器 ID)和。我们可以使用 docker ps 命令找到此信息:

docker ps

此命令列出了所有Docker 容器在服务器上运行,并提供一些高级信息它们:

OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES76aded7112d4alpine "watch 'date >> /var…" 11 seconds ago Up 10 secondscontainer-name

在此示例中,容器 ID 和名称突出显示。您可以使用其中之一来告诉 docker exec 要使用哪个容器。

如果您想重命名容器,请使用 docker rename 命令:

docker rename container-namenew-name

接下来,我们运行几个使用 docker exec 在 Docker 容器中执行命令的示例。

在 Docker 容器中运行交互式 Shell

如果您需要在 Docker 容器内启动交互式 shell, 也许要探索文件系统或调试正在运行的进程,请使用带有 -i 和 -t 标志的 docker exec。

-i 标志使输入保持对容器开放,而 -t 标志创建一个伪终端外壳可以连接。这些标志可以像这样组合:

docker exec -itcontainer-namesh

这将在指定的位置运行 sh shell容器,为您提供基本的 shell 提示。要退出容器,请输入 exit,然后按 ENTER:

exit

如果您的容器镜像包含更高级的 shell,例如 bash,您可以将 sh 替换为 bash

在 Docker 容器中运行非交互式命令

如果您需要在正在运行的 Docker 容器中运行命令,但不需要任何交互性,请使用 docker exec 命令没有任何flags:

docker exec container-nametail /var/log/date.log

此命令将在container-name 容器,并输出结果。默认情况下,尾部 命令将打印出文件的最后十行。如果你正在跑步 我们在第一部分中设置的演示容器,您将看到 像这样的东西:

OutputMon Jul 26 14:39:33 UTC 2021Mon Jul 26 14:39:35 UTC 2021Mon Jul 26 14:39:37 UTC 2021Mon Jul 26 14:39:39 UTC 2021Mon Jul 26 14:39:41 UTC 2021Mon Jul 26 14:39:43 UTC 2021Mon Jul 26 14:39:45 UTC 2021Mon Jul 26 14:39:47 UTC 2021Mon Jul 26 14:39:49 UTC 2021Mon Jul 26 14:39:51 UTC 2021

这本质上与为Docker 容器(如上一步中使用 docker 所做的那样) exec-itcontainer-namesh),然后运行 tail /var/log/date.log 命令。但是,不是打开 shell,而是运行命令, 然后关闭 shell,此命令在 a 中返回相同的输出 单个命令,无需打开伪终端。

在 Docker 容器的备用目录中运行命令

要在容器的某个目录中运行命令,请使用 --workdir 标志指定目录:

docker exec --workdir /tmpcontainer-namepwd

此示例命令将 /tmp 目录设置为工作目录,然后运行pwd 命令,打印出当前的工作状态目录:

Output/tmp

pwd 命令已确认工作目录为 /tmp。

在 Docker 中以不同用户身份运行命令容器

要在容器内以不同用户身份运行命令,请添加 --user 标志:

docker exec --user guestcontainer-namewhoami

这将使用 guest 用户在容器中运行 whoami 命令。 whoami 命令打印出当前用户的用户名:

Outputguest

whoami 命令确认容器的当前用户是 guest。

将环境变量传递到 Docker容器

有时您需要将环境变量与要运行的命令一起传递到容器中。 -e 标志允许您指定环境变量:

docker exec -e TEST=sammycontainer-nameenv

此命令设置 TEST 环境变量等于 sammy,然后在容器内运行 env 命令。然后 env 命令打印出所有环境变量:

OutputPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=76aded7112d4TEST=sammyHOME=/root

TEST 变量设置为sammy.

要设置多个变量,请为每个变量重复 -e 标志一:

docker exec -e TEST=sammy -e ENVIRONMENT=prod container-nameenv

如果您想传入一个充满环境变量的文件,您可以可以使用 --env-file 标志来做到这一点。

首先,使用文本编辑器创建文件。我们将在此处使用 nano 打开一个新文件,但您可以使用任何您喜欢的编辑器:

nano .env

我们使用 .env 作为文件名,因为这是使用此类文件进行管理的流行标准版本控制之外的信息。

将 KEY=value 变量写入文件,每行一个,如下所示:
.env

TEST=sammyENVIRONMENT=prod

保存并关闭文件。要保存文件并退出 Nano,请按 CTRL O,然后按 ENTER 保存,然后按 CTRL X 退出。

现在运行 docker exec 命令,在后面指定正确的文件名--env-file:

docker exec --env-file .envcontainer-nameenv
OutputPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=76aded7112d4TEST=sammyENVIRONMENT=prodHOME=/root

文件中的两个变量被设置。

您可以使用多个 --env-file 指定多个文件 旗帜。如果文件中的变量相互重叠,则以哪个文件为准 在命令中最后列出的文件将覆盖以前的文件。

常见错误

使用 docker exec 命令时,您可能会遇到一些常见错误错误:

Error: No such container:container-name

No such container 错误表示指定的容器不存在,并且可能指示拼写错误的容器名称。使用 docker ps 列出正在运行的容器并仔细检查名称。

Error response from daemon: Container2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4abis not running

这不是running 消息表示容器存在但已停止。您可以使用 docker startcontainer-name

Error response from daemon: Containercontainer-nameis paused, unpause the container before exec

启动容器容器已暂停错误很好地解释了这个问题。在继续之前,您需要使用 docker unpausecontainer-name.

取消暂停容器。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号