名称

podman-exec - 在运行中的容器内执行命令

简介

podman exec [选项] 容器 命令 [参数 …]

podman container exec [选项] 容器 命令 [参数 …]

描述

podman exec 在运行中的容器内执行命令。

选项

--cidfile=文件

从指定 文件 中读取目标容器的 ID。

--detach, -d

启动 exec 会话,但不附加到该会话。命令在后台运行,exec 会话在完成后自动移除。podman exec 命令会打印 exec 会话的 ID 并在启动后立即退出。

--detach-keys=序列

指定用于分离容器的按键序列。格式为单个字符 [a-Z] 或一个或多个 ctrl-<value> 字符,其中 <value> 为以下之一:a-z@^[,_。指定空字符串 “” 可禁用此功能。默认值为 ctrl-p,ctrl-q

此选项也可以在 containers.conf(5) 文件中设置。

--env, -e=环境变量

设置环境变量。

此选项允许在容器内启动的进程使用任意环境变量。如果指定的环境变量没有值,Podman 会检查宿主机环境中的值,且仅当该变量在宿主机上已设置时才将其设置。作为特殊情况,如果指定的环境变量以 * 结尾且没有值,Podman 会在宿主机环境中搜索以该前缀开头的变量,并将这些变量添加到容器中。

--env-file=文件

读取包含一行一个环境变量的文件。

--interactive, -i

设置为 true 时,使 stdin 可用于所包含的进程。如果为 false,所包含进程的 stdin 将为空并立即关闭。

如果已附加,stdin 将管道传输到所包含的进程。如果已分离,读取 stdin 将阻塞,直到稍后附加。

注意: Podman 会在 stdin 可用时立即消耗输入,即使所包含的进程未请求它。

--latest, -l

不提供容器名称或 ID,而是使用最后创建的容器。注意:最后启动的容器可能来自主机上其他 Podman 用户。(此选项在远程 Podman 客户端中不可用,包括 Mac 和 Windows(WSL2 除外)机器)

--no-session

不为 exec 进程创建数据库会话。这可以提高性能,但其他 podman 命令将无法看到该 exec 会话。

--preserve-fd=FD1[,FD2,…]

将逗号分隔列表中指定的额外文件描述符传递给进程。此选项可多次指定。此选项仅在使用 crun OCI 运行时的情况下受支持。将此选项与其他 OCI 运行时一起使用可能会带来安全风险。

(远程 Podman 客户端不支持此选项,包括 Mac 和 Windows(WSL2 除外)机器)

--preserve-fds=N

将 N 个额外的文件描述符传递给进程(除了 0、1、2 之外)。文件描述符总数为 3+N。(远程 Podman 客户端不支持此选项,包括 Mac 和 Windows(WSL2 除外)机器)

--privileged

为此容器赋予扩展权限。默认值为 false

默认情况下,Podman 容器是非特权的(=false),例如无法修改操作系统部分内容。这是因为默认情况下容器仅允许对设备进行有限访问。特权(privileged)容器被授予与启动容器的用户相同的设备访问权限,但在系统模式(--systemd=always)下运行虚拟控制台(/dev/tty\d+)除外。

特权容器关闭了将容器与主机隔离的安全功能。删除的能力(Dropped Capabilities)、受限设备、只读挂载点、Apparmor/SELinux 分离和 Seccomp 过滤器都将被禁用。由于禁用了安全功能,几乎不应该设置特权字段,因为容器可以轻易突破限制。

在用户命名空间中运行的容器(例如,无根容器)不能拥有比启动它们的用户更多的特权。

--tty, -t

分配一个伪 TTY。默认值为 false

当设置为 true 时,Podman 分配一个伪 TTY 并将其附加到容器的标准输入。例如,这可以用于运行一次性交互式 shell。

注意: --tty 标志会阻止标准输出的重定向。它结合了 STDOUT 和 STDERR,可能插入控制字符,并可能导致管道挂起。此选项仅在终端交互式运行时使用。向 Podman 输入时,仅使用 -i,不要使用 -it。

--user, -u=用户[:组]

设置指定命令使用的用户名或 UID,以及可选的组名或 GID。用户都可以是符号名称或数字。

如果没有此参数,命令将以容器镜像中指定的用户身份运行。除非被 Containerfile 中的 USER 指令或传递给此选项的值覆盖,否则此用户通常默认为 root。

当未使用用户命名空间时,容器内和主机上使用的 UID 和 GID 匹配。但是,当使用用户命名空间时,容器中的 UID 和 GID 可能对应于主机上的另一个 UID 和 GID。例如,在无根容器中,始终使用用户命名空间,容器中的 root 默认对应于调用 Podman 的用户的 UID 和 GID。

--workdir, -w=目录

容器内的工作目录。

在容器内运行二进制文件的默认工作目录是根目录 (/)。镜像开发人员可以使用 WORKDIR 指令设置不同的默认值。操作员可以使用 -w 选项覆盖工作目录。

退出状态

podman exec 的退出代码提供了关于容器内命令为何运行失败或为何退出的信息。当 podman exec 以非零代码退出时,退出代码遵循 chroot 标准,具体见下文

125 Podman 本身出现错误

$ podman exec --foo ctrID /bin/sh; echo $?
Error: unknown flag: --foo
125

126 容器内命令 无法被调用

$ podman exec ctrID /etc; echo $?
Error: container_linux.go:346: starting container process caused "exec: \"/etc\": permission denied": OCI runtime error
126

127 找不到 容器内命令

$ podman exec ctrID foo; echo $?
Error: container_linux.go:346: starting container process caused "exec: \"foo\": executable file not found in $PATH": OCI runtime error
127

退出代码 容器内命令 的退出代码

$ podman exec ctrID /bin/sh -c 'exit 3'; echo $?
3

示例

在选定容器中执行命令,并分配标准输入 (stdin) 和终端 (tty)

$ podman exec -it ctrID ls

在选定容器中以覆盖的工作目录执行命令,并分配标准输入 (stdin) 和终端 (tty)

$ podman exec -it -w /tmp myCtr pwd

以指定用户身份在选定容器中执行命令

$ podman exec --user root ctrID ls

执行命令但不附加到 exec 会话,使命令在后台运行

$ podman exec -d ctrID find /path/to/search -name yourfile

另请参阅

podman(1), podman-run(1)

历史

2017 年 12 月,最初由 Brent Baude 编写 bbaude@redhat.com