名称

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

概要

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

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

描述

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

选项

--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=env

设置环境变量。

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

--env-file=文件

读取以换行符分隔的环境变量文件。

--interactive, -i

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

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

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

--latest, -l

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

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

将逗号分隔列表中指定的附加文件描述符传递给进程。它可以指定多次。此选项仅在 crun OCI 运行时中受支持。在其他 OCI 运行时中使用此选项可能存在安全风险。

(此选项不可用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器)

--preserve-fds=N

将 N 个附加文件描述符(除了 0、1、2)传递给进程。总 FD 为 3+N。(此选项不可用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器)

--privileged

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

默认情况下,Podman 容器是非特权的 (=false),例如,它们不能修改操作系统的部分。这是因为默认情况下,容器只被允许访问有限的设备。一个“特权”容器被赋予与启动容器的用户相同的设备访问权限,但在系统d 模式 (--systemd=always) 下运行时,虚拟控制台 (/dev/tty\d+) 除外。

一个特权容器会关闭隔离容器与主机的安全功能。删除的功能、有限的设备、只读挂载点、Apparmor/SELinux 分离和 Seccomp 过滤器都被禁用。由于禁用了安全功能,所以应该几乎从不设置 privileged 字段,因为容器很容易打破限制。

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

--tty, -t

分配一个伪终端。默认值为 false

设置为 true 时,Podman 会分配一个伪终端,并附加到容器的标准输入。这可以用于例如运行一个临时的交互式 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

另请参见

podman(1), podman-run(1)

历史

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