名称

podman-run - 在新容器中运行命令

概要

podman run [选项] 镜像 [命令 [参数 …]]

podman container run [选项] 镜像 [命令 [参数 …]]

描述

在新的容器中运行一个进程。podman run 启动一个具有自身文件系统、网络和隔离进程树的进程。启动进程的镜像可以定义与将在容器中运行的进程相关的默认值,例如要公开的网络等等,但podman run 将最终控制权交给从镜像启动容器的操作员或管理员。因此,podman run 拥有比任何其他 Podman 命令更多的选项。

如果镜像尚未加载,那么podman run 会以与运行podman pull 镜像相同的方式从存储库中拉取镜像及其所有镜像依赖项,然后才会从该镜像启动容器。

在容器内会自动创建几个文件。这些文件包括/etc/hosts/etc/hostname/etc/resolv.conf,用于管理网络。这些文件将基于主机的文件版本,尽管它们可以通过选项进行自定义(例如,--dns 将覆盖创建的resolv.conf 中的主机 DNS 服务器)。此外,在每个容器中都会创建一个容器环境文件,用于向程序指示它们正在容器中运行。该文件位于/run/.containerenv(对于 FreeBSD 容器,位于/var/run/.containerenv)。使用 --privileged 标志时,.containerenv 包含指示容器引擎版本、引擎是否以无根模式运行、容器名称和 ID,以及容器所基于的镜像名称和 ID 的名称/值对。注意:当在 /run 上挂载卷时,/run/.containerenv 不会被创建。

从用户定义的网络命名空间运行时,如果/etc/netns/NSNAME/resolv.conf 存在,则会使用它;否则,将使用/etc/resolv.conf

默认设置在 containers.conf 中定义。大多数远程连接设置使用服务器 containers.conf,除非在手册页中另有说明。

镜像

使用传输:路径格式指定镜像。如果没有指定传输,则默认使用 docker(容器注册表)传输。对于远程 Podman,包括 Mac 和 Windows(不包括 WSL2)机器,docker 是唯一允许的传输。

dir:路径 存储清单、层 tarball 和签名的现有本地目录路径,作为单个文件。这是一种非标准化格式,主要用于调试或非侵入式容器检查。

$ podman save --format docker-dir fedora -o /tmp/fedora
$ podman run dir:/tmp/fedora echo hello

docker://docker-引用(默认)存储在远程容器镜像注册表中的镜像引用。例如:“quay.io/podman/stable:latest”。引用可以包含指向特定注册表的路径;如果没有,则会查询 registries.conf 中列出的注册表以找到匹配的镜像。默认情况下,使用 podman login 中的凭据进行身份验证(默认情况下存储在 $XDG_RUNTIME_DIR/containers/auth.json 中);否则,它会回退到使用 $HOME/.docker/config.json 中的凭据。

$ podman run registry.fedoraproject.org/fedora:latest echo hello

docker-archive:路径[:docker-引用] 以 docker save 格式存储的镜像文件。docker-引用仅在创建此类文件时使用,并且不能包含摘要。

$ podman save --format docker-archive fedora -o /tmp/fedora
$ podman run docker-archive:/tmp/fedora echo hello

docker-daemon:docker-引用 存储在 docker 守护进程内部存储中的以docker-引用格式存储的镜像。docker-引用也可以是镜像 ID(docker-daemon:algo:digest)。

$ sudo docker pull fedora
$ sudo podman run docker-daemon:docker.io/library/fedora echo hello

oci-archive:路径:标签 位于指定路径且使用标签指定的、符合“开放容器镜像布局规范”的目录中的镜像。

$ podman save --format oci-archive fedora -o /tmp/fedora
$ podman run oci-archive:/tmp/fedora echo hello

选项

--add-host=主机名[;主机名[;…]]:ip

向容器的 /etc/hosts 文件添加自定义主机到 IP 映射。

该选项采用一个或多个以分号分隔的主机名,映射到一个以冒号分隔的单个 IPv4 或 IPv6 地址。它还可以用来覆盖 Podman 默认添加到 /etc/hosts 的主机名的 IP 地址(另请参见--name--hostname 选项)。此选项可以多次指定,以将更多映射添加到 /etc/hosts。它与--no-hosts 选项冲突,并与 containers.conf 中的no_hosts=true 冲突。

除了 IP 地址外,还可以使用特殊的标志host-gateway。它解析为容器可以用来连接主机的 IP 地址。所选择的 IP 地址取决于您的网络设置,因此无法保证 Podman 能自动确定host-gateway 地址,这将导致 Podman 失败并显示错误消息。您可以使用containers.conf 中的host_containers_internal_ip 选项覆盖此 IP 地址。

host-gateway 地址还由 Podman 用于自动将 host.containers.internalhost.docker.internal 主机名添加到 /etc/hosts。您可以通过提供--no-hosts 选项或在containers.conf 中设置host_containers_internal_ip=”none” 来防止这种情况。如果未手动配置host-gateway 地址,并且 Podman 无法自动确定 IP 地址,则 Podman 将静默跳过将这些内部主机名添加到 /etc/hosts。如果 Podman 正在使用 podman machine 在虚拟机中运行(包括 Mac 和 Windows 主机),Podman 将静默跳过将内部主机名添加到 /etc/hosts,除非手动配置了 IP 地址;内部主机名将由 gvproxy DNS 解析器解析。

Podman 默认情况下会将主机的 /etc/hosts 文件用作基础,即此文件中存在的任何主机名也都会出现在容器的 /etc/hosts 文件中。可以使用 containers.conf 中的base_hosts_file 配置使用不同的基础文件。

--annotation=键=值

向容器添加注释。此选项可以设置多次。

--arch=架构

覆盖要拉取的镜像的架构,默认为主机,例如 arm。除非覆盖,否则本地存储中相同镜像的后续查找将匹配此架构,而与主机无关。

--attach, -a=stdin | stdout | stderr

附加到 STDIN、STDOUT 或 STDERR。

在前景模式下(当未指定-d 时为默认模式),podman run 可以启动容器中的进程并将控制台附加到进程的标准输入、输出和错误。它甚至可以假装是 TTY(这是大多数命令行可执行文件所期望的)并传递信号。-a 选项可以针对stdinstdoutstderr 中的每一个设置。

--authfile=路径

身份验证文件的路径。默认情况下,在 Linux 上为 ${XDG_RUNTIME_DIR}/containers/auth.json,在 Windows/macOS 上为 $HOME/.config/containers/auth.json。该文件由podman login 创建。如果在那里找不到授权状态,则会检查 $HOME/.docker/config.json,该文件是使用docker login 设置的。

注意:还可以通过设置 REGISTRY_AUTH_FILE 环境变量来覆盖身份验证文件的默认路径。这可以通过export REGISTRY_AUTH_FILE=路径 来完成。

--blkio-weight=权重

块 IO 相对权重。权重是介于101000 之间的值。

此选项在 cgroups V1 无根系统上不受支持。

--blkio-weight-device=设备:权重

块 IO 相对设备权重。

--cap-add=功能

添加 Linux 功能。

--cap-drop=功能

删除 Linux 功能。

--cgroup-conf=键=值

在 cgroup v2 上运行时,指定要写入的 cgroup 文件及其值。例如,--cgroup-conf=memory.high=1073741824 将内存.high 限制设置为 1GB。

--cgroup-parent=路径

容器的 cgroup 所在的 cgroups 的路径。如果路径不是绝对路径,则该路径被视为相对于 init 进程的 cgroups 路径。如果 cgroups 不存在,则会创建它们。

--cgroupns=模式

设置容器的 cgroup 命名空间模式。

  • host:在容器内部使用主机的 cgroup 命名空间。

  • container:id:加入指定容器的命名空间。

  • private:创建一个新的 cgroup 命名空间。

  • ns:路径:加入指定路径的命名空间。

如果主机使用 cgroups v1,则默认设置为host。在 cgroups v2 上,默认设置为private

--cgroups=方式

确定容器是否创建 CGroups。

默认情况下,已启用

已启用选项会在 cgroup-parent 下创建一个新的 cgroup。已禁用选项强制容器不创建 CGroups,因此与 CGroup 选项(--cgroupns--cgroup-parent)冲突。no-conmon 选项仅针对conmon 进程禁用新的 CGroup。split 选项将当前 CGroup 分割成两个子 cgroup:一个用于 conmon,另一个用于容器有效负载。无法使用 split 设置 --cgroup-parent

--chrootdirs=path

容器内被视为 chroot 目录的目录路径。任何由 Podman 管理的文件(例如,/etc/resolv.conf、/etc/hosts、etc/hostname)被挂载到根目录,也会被挂载到该位置。多个目录用逗号隔开。

--cidfile=file

将容器 ID 写入 file。该文件将与容器一起删除,除非与 podman --remote run 一起使用,用于分离容器。

--conmon-pidfile=file

conmon 进程的 pid 写入文件。由于conmon 在与 Podman 不同的进程中运行,因此在使用 systemd 重启 Podman 容器时,这是必要的。(此选项不适用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器)

--cpu-period=limit

设置完全公平调度器 (CFS) 的 CPU 周期,这是一个以微秒为单位的持续时间。当容器的 CPU 配额用完后,它将不会被调度运行,直到当前周期结束。默认为 100000 微秒。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--cpu-quota=limit

限制 CPU 完全公平调度器 (CFS) 配额。

限制容器的 CPU 使用率。默认情况下,容器使用完整的 CPU 资源。限制是一个以微秒为单位的数字。如果提供一个数字,则允许容器使用该数量的 CPU 时间,直到 CPU 周期结束(可以通过 --cpu-period 控制)。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--cpu-rt-period=microseconds

限制 CPU 实时周期,以微秒为单位。

限制容器的实时 CPU 使用率。此选项告诉内核限制容器的实时 CPU 使用率到指定的周期。

此选项仅在 cgroups V1 根目录系统上支持。

--cpu-rt-runtime=microseconds

限制 CPU 实时运行时间,以微秒为单位。

限制容器的实时 CPU 使用率。此选项告诉内核限制给定 CPU 周期内实时任务可以消耗的时间量。例如:周期为 1,000,000us,运行时间为 950,000us,意味着该容器可以消耗 95% 的可用 CPU,并将剩余的 5% 留给普通优先级任务。

所有容器的运行时间的总和不能超过分配给父 cgroup 的数量。

此选项仅在 cgroups V1 根目录系统上支持。

--cpu-shares, -c=shares

CPU 份额(相对权重)。

默认情况下,所有容器都获得相同比例的 CPU 周期。可以通过更改容器的 CPU 份额权重来修改此比例,该权重相对于所有正在运行的容器的组合权重。默认权重为 1024

该比例仅在 CPU 密集型进程运行时适用。当一个容器中的任务处于空闲状态时,其他容器可以使用剩余的 CPU 时间。实际的 CPU 时间量会根据系统上运行的容器数量而有所不同。

例如,考虑三个容器,一个容器的 cpu-share 为 1024,另外两个容器的 cpu-share 设置为 512。当三个容器中的进程都尝试使用 100% 的 CPU 时,第一个容器接收 50% 的总 CPU 时间。如果添加第四个容器,其 cpu-share 为 1024,则第一个容器仅获得 33% 的 CPU。剩余的容器分别获得 16.5%、16.5% 和 33% 的 CPU。

在多核系统上,CPU 时间份额将分布到所有 CPU 内核。即使容器被限制在低于 100% 的 CPU 时间,它也可以使用每个单独 CPU 内核的 100%。

例如,考虑一个拥有三个以上内核的系统。如果容器 C0--cpu-shares=512 启动并运行一个进程,而另一个容器 C1--cpu-shares=1024 启动并运行两个进程,则可能导致以下 CPU 份额分配:

PID

容器

CPU

CPU 份额

100

C0

0

CPU0 的 100%

101

C1

1

CPU1 的 100%

102

C1

2

CPU2 的 100%

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--cpus=number

CPU 数量。默认值为 0.0,这意味着没有限制。这是 --cpu-period--cpu-quota 的简写,因此不能与 --cpu-period--cpu-quota 一起指定此选项。

在某些系统上,可能不允许非 root 用户更改 CPU 限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--cpuset-cpus=number

允许执行的 CPU。可以指定为逗号分隔列表(例如 0,1),作为范围(例如 0-3),或任何组合(例如 0-3,7,11-15)。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--cpuset-mems=nodes

允许执行的内存节点 (MEM)(0-3、0、1)。仅在 NUMA 系统上有效。

如果系统上有四个内存节点(0-3),则使用 --cpuset-mems=0,1,则容器中的进程仅使用来自前两个内存节点的内存。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--decryption-key=key[:passphrase]

用于解密镜像的 [key[:passphrase]]。Key 可以指向密钥和/或证书。将尝试使用所有密钥进行解密。如果密钥受密码保护,则需要在参数中传递密码,否则将其省略。

--detach, -d

分离模式:在后台运行容器并打印新的容器 ID。默认值为 false

随时在另一个 shell 中运行 podman ps 以查看正在运行的容器列表。使用 podman attach 命令重新连接到分离的容器。

当通过 tty 模式连接时,使用可配置的密钥序列从容器分离(并让它继续运行)。默认序列为 ctrl-p,ctrl-q。使用 --detach-keys 选项指定密钥序列,或在 containers.conf 文件中进行配置:有关更多信息,请参阅 containers.conf(5)

--detach-keys=sequence

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

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

--device=host-device[:container-device][:permissions]

向容器添加主机设备。可选的 permissions 参数可用于通过组合 r(读)、w(写)和 mmknod(2))来指定设备权限。

例如:--device=/dev/sdc:/dev/xvdc:rwm

注意:如果 host-device 是一个符号链接,则会先解析它。容器仅存储主机设备的主次编号。

Podman 可能会加载使用指定设备所需的内核模块。Podman 在必要时加载模块的设备为:/dev/fuse。

在无根模式下,新设备从主机在容器中进行绑定挂载,而不是 Podman 在容器空间内创建它。由于绑定挂载在 SELinux 系统上保留其 SELinux 标签,因此容器在访问挂载的设备时可能会收到权限被拒绝的错误。修改 SELinux 设置以允许容器通过以下命令使用所有设备标签:

$ sudo setsebool -P container_use_devices=true

注意:如果用户仅通过组拥有访问权限,则从无根容器内部访问设备将失败。使用 --group-add keep-groups 标志将用户的补充组访问权限传递到容器中。

--device-cgroup-rule=”type major:minor mode”

向 cgroup 允许的设备列表添加规则。规则的格式应与 Linux 内核文档中指定的格式一致 admin-guide/cgroup-v1/devices

  • type: a(全部)、c(字符)或 b(块);

  • majorminor:可以是数字,也可以是 * 表示所有;

  • mode:由 r(读取)、w(写入)和 m(mknod(2))组成。

--device-read-bps=path:rate

限制从设备读取的速率(以每秒字节数计)(例如,--device-read-bps=/dev/sda:1mb)。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--device-read-iops=path:rate

限制从设备读取的速率(以每秒 I/O 操作数计)(例如,--device-read-iops=/dev/sda:1000)。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--device-write-bps=path:rate

限制写入到设备的速率(以每秒字节数计)(例如,--device-write-bps=/dev/sda:1mb)。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--device-write-iops=path:rate

限制写入到设备的速率(以每秒 I/O 操作数计)(例如,--device-write-iops=/dev/sda:1000)。

在某些系统上,可能不允许非 root 用户更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--disable-content-trust

这是一个 Docker 特定的选项,用于禁用对容器注册表的镜像验证,Podman 不支持此选项。此选项是 NOOP,仅为了脚本兼容性而提供。

--dns=ipaddr

设置自定义 DNS 服务器。

此选项可用于覆盖传递给容器的 DNS 配置。通常,当主机 DNS 配置对于容器无效时(例如,127.0.0.1),这很有必要。在这种情况下,每次运行都需要 --dns 标志。

可以指定特殊值 none 来禁用 Podman 在容器中创建 /etc/resolv.conf。镜像中的 /etc/resolv.conf 文件将使用,不会进行更改。

此选项不能与设置为 nonecontainer:id--network 结合使用。

--dns-option=option

设置自定义 DNS 选项。如果将 --dns-option 与设置为 nonecontainer:id--network 结合使用,则无效。

--dns-search=domain

设置自定义 DNS 搜索域。如果将 --dns-search 与设置为 nonecontainer:id--network 结合使用,则无效。使用 --dns-search=. 删除搜索域。

--entrypoint=”command” | ‘[“command”, “arg1”, …]’

覆盖镜像中的默认 ENTRYPOINT。

镜像的 ENTRYPOINT 类似于 COMMAND,因为它指定在容器启动时运行哪个可执行文件,但它(故意)更难以覆盖。ENTRYPOINT 为容器提供了其默认性质或行为。设置 ENTRYPOINT 后,容器运行起来就像该二进制文件一样,包括默认选项。可以通过 COMMAND 传递更多选项。但是,如果用户想要在容器中运行其他内容,则 --entrypoint 选项允许指定新的 ENTRYPOINT。

以 JSON 字符串的形式指定多选项命令。

--env, -e=env

设置环境变量。

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

有关优先级和示例,请参见下面的 环境 说明。

--env-file=file

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

有关优先级和示例,请参见下面的 环境 说明。

--env-host

在容器内部使用主机环境。有关优先级,请参见下面的 环境 说明。(此选项在远程 Podman 客户端不可用,包括 Mac 和 Windows(不包括 WSL2)机器)

--env-merge=env

预处理容器的默认环境变量。例如,如果镜像包含环境变量 hello=world,用户可以使用 --env-merge hello=${hello}-some 来预处理它,因此新值为 hello=world-some

请注意,如果镜像中不存在环境变量 hello,则它将被替换为空字符串,因此使用 --env-merge hello=${hello}-some 将导致新值为 hello=-some,请注意前导 - 分隔符。

--expose=port[/protocol]

公开端口或端口范围(例如,--expose=3300-3310)。协议可以是 tcpudpsctp,如果没有给出,则假定为 tcp。此选项与镜像构建的 EXPOSE 指令匹配,对实际网络规则没有影响,除非使用 -P/--publish-all 将其转发到所有公开端口(来自随机主机端口)。要将主机上的特定端口转发到容器中,请使用 -p/--publish 选项。

--gidmap=[flags]container_uid:from_uid[:amount]

在新的用户命名空间中运行容器,使用提供的 GID 映射。此选项与 --userns--subgidname 选项冲突。此选项提供了一种将主机 GID 映射到容器 GID 的方法,与 --uidmap 将主机 UID 映射到容器 UID 的方式相同。有关详细信息,请参见 --uidmap

注意:在使用 --pod 选项时,不能使用 --gidmap 选项,因为当在 pod 中时,不能在容器级别设置 gidmap。

--gpus=ENTRY

要添加到容器的 GPU 设备(“all” 表示传递所有 GPU)目前仅支持 Nvidia 设备。

--group-add=group | keep-groups

将附加组分配给在容器进程中运行的主用户。

  • keep-groups 是一个特殊标志,它告诉 Podman 保留辅助组访问权限。

允许容器使用用户的辅助组访问权限。如果文件系统或设备仅由无根用户的组访问,则此标志告诉 OCI 运行时将组访问权限传递到容器中。目前仅在 crun OCI 运行时中可用。注意:keep-groups 是独占的,不能与其他组一起指定此标志。(远程命令不可用,包括 Mac 和 Windows(不包括 WSL2)机器)

--group-entry=ENTRY

自定义在使用 --user 时写入容器内的 /etc/group 文件的条目。

如果存在,变量 $GROUPNAME、$GID 和 $USERLIST 会在运行时自动替换为它们的值。

--health-cmd=”command” | ‘[“command”, “arg1”, …]’

设置或更改容器的运行状况检查命令。该命令是在容器内部执行的命令,用于确定容器的运行状况。其他运行状况检查选项需要此命令才能应用。值 none 会禁用现有的运行状况检查。

多个选项可以以 JSON 数组的形式传递;否则,该命令将被解释为 /bin/sh -c 的参数。

--health-interval=interval

设置运行状况检查的间隔。值为 disable 表示不设置自动计时器。默认值为 30s

--health-log-destination=directory_path

设置运行状况检查日志的目标。目录路径(本地或 events_logger(本地使用容器状态文件))(默认值:本地)

  • local: (默认) 运行状况检查日志存储在覆盖容器中。(例如: $runroot/healthcheck.log)

  • directory:在指定目录中创建名为 <container-ID>-healthcheck.log 的日志文件,其中包含运行状况检查日志。

  • events_logger:日志将使用 events_logger 设置的日志机制写入。它还会将日志保存到默认目录中,以提高拥有大量日志的系统的性能。

--health-max-log-count=number of stored logs

设置运行状况检查日志文件中的最大尝试次数。(值“0”表示日志文件中无限次尝试)(默认值:5 次尝试)

--health-max-log-size=size of stored logs

设置存储的运行状况检查日志的最大长度(以字符计)。(值“0”表示无限日志长度)(默认值:500 个字符)

--health-on-failure=action

容器过渡到不健康状态后要执行的操作。默认值为 none

  • none:不执行任何操作。

  • kill:杀死容器。

  • 重启: 重新启动容器。不要将 restart 操作与 --restart 标志结合使用。在 systemd 单元内部运行时,请考虑使用 killstop 操作,以便利用 systemd 的重启策略。

  • 停止: 停止容器。

--health-retries=重试次数

健康检查被认为不健康之前允许的重试次数。默认值为 3

--health-start-period=时间段

容器引导所需的初始化时间。该值可以用时间格式表示,例如 2m3s。默认值为 0s

注意: 健康检查命令在容器启动后立即执行,如果健康检查成功,容器的健康状态将更新为 healthy。但是,如果健康检查失败,健康状态将保持为 starting,直到健康检查成功或 --health-start-period 时间结束。如果健康检查命令在 --health-start-period 时间结束之后失败,健康状态将更新为 unhealthy。健康检查命令会根据 --health-interval 的值定期执行。

--health-startup-cmd=“命令” | ‘[“命令”, “参数1”, …]’

为容器设置启动健康检查命令。此命令在容器内部执行,用于控制常规健康检查。当启动命令成功时,常规健康检查开始,启动健康检查停止。可选地,如果命令在设置次数的尝试中失败,容器将重新启动。启动健康检查可用于确保具有扩展启动周期的容器在完全启动之前不被标记为不健康。只有在也设置了常规健康检查(来自容器镜像或 --health-cmd 选项)时,才能使用启动健康检查。

--health-startup-interval=间隔

设置启动健康检查的间隔。disable间隔 不会导致自动计时器设置。默认值为 30s

--health-startup-retries=重试次数

启动健康检查重新启动容器之前允许的尝试次数。如果设置为 0,容器将永远不会重新启动。默认值为 0

--health-startup-success=重试次数

启动健康检查成功并开始常规健康检查之前所需的成功运行次数。值为 0 表示任何成功都会开始常规健康检查。默认值为 0

--health-startup-timeout=超时

启动健康检查命令在被标记为失败之前必须完成的最长时间。该值可以用时间格式表示,例如 2m3s。默认值为 30s

--health-timeout=超时

在间隔被认为失败之前完成健康检查允许的最长时间。与 start-period 一样,该值可以用时间格式表示,例如 1m22s。默认值为 30s

--help

打印使用说明语句

--hostname, -h=名称

在容器内设置容器的主机名。

此选项只能与私有 UTS 命名空间 --uts=private(默认)一起使用。如果给出了 --pod 并且 pod 共享相同的 UTS 命名空间(默认),则使用 pod 的主机名。给定的主机名还会使用容器的主 IP 地址添加到 /etc/hosts 文件中(另请参阅 --add-host 选项)。

--hostuser=名称

从主机向容器添加一个用户帐户到 /etc/passwd。用户名或 UID 必须存在于主机系统上。

--http-proxy

默认情况下,如果为 Podman 进程设置了代理环境变量,它们将传递到容器中。可以通过将值设置为 false 来禁用此功能。传递的​​环境变量包括 http_proxyhttps_proxyftp_proxyno_proxy,以及这些变量的大写版本。此选项仅在主机系统必须使用代理但容器不使用任何代理时才需要。为容器以任何其他方式指定的代理环境变量会覆盖从主机传递的值。(为容器指定代理的其他方法包括使用 --env 标志传递值,或在容器构建时硬编码代理环境。)当与远程客户端一起使用时,它使用在服务器进程上设置的代理环境变量。

默认值为 true

--image-volume=bind | tmpfs | ignore

告诉 Podman 如何处理内置镜像卷。默认值为 bind

  • bind: 创建一个匿名命名卷并将其挂载到容器中。

  • tmpfs: 该卷作为 tmpfs 挂载到容器上,这允许用户创建内容,这些内容在容器停止时消失。

  • ignore: 所有卷都被忽略,不执行任何操作。

--init

在容器内运行一个 init,它转发信号并回收进程。container-init 二进制文件被挂载到 /run/podman-init。在 /run 上挂载会破坏容器执行。

--init-path=路径

container-init 二进制文件的路径。

--interactive, -i

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

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

警告: Podman 将尽快消耗来自 stdin 的输入,即使包含的进程没有请求它。

--ip=ipv4

为容器指定一个静态 IPv4 地址,例如 10.88.64.128。此选项只能在容器仅加入单个网络时使用 - 也就是说,--network=network-name 最多使用一次 - 并且如果容器未通过 --network=container:id 加入另一个容器的网络命名空间。该地址必须位于网络的 IP 地址池内(默认值为 10.88.0.0/16)。

要为每个容器指定多个静态 IP 地址,请使用 --network 选项设置多个网络,并使用该选项的 ip 模式为每个网络指定一个静态 IP 地址。

--ip6=ipv6

为容器指定一个静态 IPv6 地址,例如 fd46:db93:aa76:ac37::10。此选项只能在容器仅加入单个网络时使用 - 也就是说,--network=network-name 最多使用一次 - 并且如果容器未通过 --network=container:id 加入另一个容器的网络命名空间。该地址必须位于网络的 IPv6 地址池内。

要为每个容器指定多个静态 IPv6 地址,请使用 --network 选项设置多个网络,并使用该选项的 ip6 模式为每个网络指定一个静态 IPv6 地址。

--ipc=ipc

设置容器的 IPC 命名空间模式。默认值为创建私有 IPC 命名空间。

  • “”: 使用 Podman 的默认值,在 containers.conf 中定义。

  • container:id: 重用另一个容器的共享内存、信号量和消息队列

  • host: 在容器内使用主机的共享内存、信号量和消息队列。注意: 主机模式使容器能够完全访问本地共享内存,因此被认为是不安全的。

  • none: 私有 IPC 命名空间,没有挂载 /dev/shm。

  • ns:路径: 要加入的 IPC 命名空间的路径。

  • private: 私有 IPC 命名空间。

  • shareable: 私有 IPC 命名空间,可以与其他容器共享。

--label, -l=键=值

向容器添加元数据。

--label-file=文件

读取标签的行分隔文件。

--log-driver=驱动程序

容器的日志记录驱动程序。当前可用的选项是 k8s-filejournaldnonepassthroughpassthrough-tty,其中 json-file 为了脚本兼容性而被别名为 k8s-file。(默认值为 journald)。

下面的 podman info 命令显示系统的默认 log-driver。

$ podman info --format '{{ .Host.LogDriver }}'
journald

passthrough 驱动程序将标准流(stdin、stdout、stderr)传递到容器。它不允许与远程 Podman 客户端一起使用,包括 Mac 和 Windows(不包括 WSL2)机器以及 tty,因为它容易受到通过 TIOCSTI 的攻击。

passthrough-tty 驱动程序与 passthrough 相同,只是它还允许在 TTY 上使用它,如果用户确实需要的话。

--log-opt=名称=值

日志记录驱动程序特定选项。

设置自定义日志记录配置。以下 名称 受支持

path: 指定日志文件的路径(例如 --log-opt path=/var/log/container/mycontainer.json);

max-size: 指定日志文件的最大大小(例如 --log-opt max-size=10mb);

tag: 为容器指定一个自定义日志标签(例如 --log-opt tag=”{{.ImageName}}”。它支持与 podman inspect --format 相同的键。此选项目前仅由 journald 日志记录驱动程序支持。

--mac-address=地址

容器网络接口 MAC 地址(例如 92:d0:c6:0a:29:33) 此选项仅在容器连接到单个网络时可用,即 --network=network-name 最多使用一次,并且容器不通过 --network=container:id 加入另一个容器的网络命名空间。

请记住,以太网网络中的 MAC 地址必须是唯一的。IPv6 链接本地地址根据 RFC4862 基于设备的 MAC 地址。

要为每个容器指定多个静态 MAC 地址,请使用 --network 选项设置多个网络,并为每个网络使用 mac 模式指定一个静态 MAC 地址。

--memory, -m=number[unit]

内存限制。unit 可以是 b(字节)、k(Kibibytes)、m(Mebibytes)或 g(Gibibytes)。

允许限制容器可用的内存。如果主机支持交换内存,则 -m 内存设置可以大于物理 RAM。如果指定了 0 的限制(不使用 -m),则容器的内存不受限制。实际限制可能会向上舍入到操作系统页面大小的倍数(值非常大,即数百万兆兆字节)。

此选项在 cgroups V1 无根系统上不受支持。

--memory-reservation=number[unit]

内存软限制。unit 可以是 b(字节)、k(Kibibytes)、m(Mebibytes)或 g(Gibibytes)。

设置内存预留后,当系统检测到内存竞争或内存不足时,容器将被迫将其消耗限制在预留范围内。因此,始终将该值设置为低于 --memory,否则硬限制将优先。默认情况下,内存预留与内存限制相同。

此选项在 cgroups V1 无根系统上不受支持。

--memory-swap=number[unit]

等于内存加交换空间的限制值。unit 可以是 b(字节)、k(Kibibytes)、m(Mebibytes)或 g(Gibibytes)。

必须与 -m--memory)标志一起使用。参数值必须大于 -m--memory)的值。默认情况下,它被设置为 --memory 值的两倍。

number 设置为 -1 以启用无限交换空间。

此选项在 cgroups V1 无根系统上不受支持。

--memory-swappiness=number

调整容器的内存交换行为。接受 0100 之间的整数。

此标志仅在 cgroups V1 有根系统上受支持。

--mount=type=TYPE,TYPE-SPECIFIC-OPTION[,…]

将文件系统挂载附加到容器

当前支持的挂载 TYPE 是 binddevptsglobimageramfstmpfsvolume

所有挂载类型共有的选项

  • src, source: bindglobvolume 的挂载源规范。对于 bindglob 来说是强制性的。

  • dst, destination, target: 挂载目标规范。

当源通配符在没有指定目标目录的情况下指定时,文件和目录会与其在容器中的完整路径一起挂载。当指定目标时,与目标目录上的基本文件名匹配的通配符上的文件和目录将被挂载。选项 type=glob,src=/foo*,destination=/tmp/bar 告诉容器引擎将与 /foo* 匹配的主机文件挂载到容器中的 /tmp/bar/ 目录。

type=volume 特定的选项

  • ro, readonly: truefalse(默认情况下未指定:false)。

  • U, chown: truefalse(默认情况下未指定:false)。根据容器的 UID 和 GID 递归地更改源卷的所有者和组。

  • idmap: 如果指定,则创建到容器中目标用户命名空间的 id 映射挂载。idmap 选项支持与容器使用的用户命名空间不同的自定义映射。映射可以在 idmap 选项之后指定,例如:idmap=uids=0-1-10#10-11-10;gids=0-100-10。对于每个三元组,第一个值是映射到主机上的第二个值的备份文件系统 ID 的开始。此映射的长度在第三个值中给出。多个范围用 # 分隔。如果指定的映射以 ‘@’ 开头,则该映射被视为相对于容器用户命名空间。主机 ID 会更改以反映容器用户在容器用户命名空间中的相对位置。

type=image 特定的选项

  • rw, readwrite: truefalse(默认情况下未指定:false)。

  • subpath: 仅挂载镜像中的特定路径,而不是整个镜像。

bindglob 特定的选项

  • ro, readonly: truefalse(默认情况下未指定:false)。

  • bind-propagation: shared, slave, private, unbindable, rshared, rslave, runbindablerprivate(默认)。[1] 另请参见 mount(2)。

  • bind-nonrecursive: 不要设置递归绑定挂载。默认情况下它是递归的。

  • relabel: shared, private

  • idmap: truefalse(默认情况下未指定:false)。如果为 true,则创建到容器中目标用户命名空间的 id 映射挂载。

  • U, chown: truefalse(默认情况下未指定:false)。根据容器的 UID 和 GID 递归地更改源卷的所有者和组。

  • no-dereference: 不要取消引用符号链接,而是将链接源复制到挂载目标中。

type=tmpfsramfs 特定的选项

  • ro, readonly: truefalse(默认情况下未指定:false)。

  • tmpfs-size: tmpfs/ramfs 挂载的大小,以字节为单位。在 Linux 中默认情况下无限制。

  • tmpfs-mode: tmpfs/ramfs 的八进制文件模式(例如 700 或 0700)。

  • tmpcopyup: 启用从同一位置的镜像目录到 tmpfs/ramfs 的 copyup。默认情况下使用。

  • notmpcopyup: 禁用从镜像到 tmpfs/ramfs 的文件复制。

  • U, chown: truefalse(默认情况下未指定:false)。根据容器的 UID 和 GID 递归地更改源卷的所有者和组。

type=devpts 特定的选项

  • uid: 文件所有者的数字 UID(默认:0)。

  • gid: 文件所有者的数字 GID(默认:0)。

  • mode: 文件的八进制权限掩码(默认:600)。

  • max: PTY 的最大数量(默认:1048576)。

示例

  • type=bind,source=/path/on/host,destination=/path/in/container

  • type=bind,src=/path/on/host,dst=/path/in/container,relabel=shared

  • type=bind,src=/path/on/host,dst=/path/in/container,relabel=shared,U=true

  • type=devpts,destination=/dev/pts

  • type=glob,src=/usr/lib/libfoo*,destination=/usr/lib,ro=true

  • type=image,source=fedora,destination=/fedora-image,rw=true

  • type=ramfs,tmpfs-size=512M,destination=/path/in/container

  • type=tmpfs,tmpfs-size=512M,destination=/path/in/container

  • type=tmpfs,destination=/path/in/container,noswap

  • type=volume,source=vol1,destination=/path/in/container,ro=true

--name=name

为容器分配一个名称。

操作员可以通过三种方式识别容器

  • UUID 长标识符(“f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”);

  • UUID 短标识符(“f78375b1c487”);

  • 名称(“jonah”)。

Podman 为每个容器生成一个 UUID,如果使用 --name 未为容器分配名称,Podman 将生成一个随机字符串名称。名称可以用作识别容器的更人性化的方式。这对后台和前台容器都有效。容器的名称还使用容器的主 IP 地址添加到 /etc/hosts 文件中(另请参见 --add-host 选项)。

--network=mode, --net

设置容器的网络模式。

有效的 mode 值为

  • bridge[:OPTIONS,…]: 在默认网桥上创建网络栈。这是有根容器的默认设置。可以指定以下附加选项

    • alias=name: 为容器添加网络范围别名。

    • ip=IPv4: 为此容器指定一个静态 IPv4 地址。

    • ip6=IPv6: 为此容器指定一个静态 IPv6 地址。

    • mac=MAC: 为此容器指定一个静态 MAC 地址。

    • interface_name=name: 为容器内部创建的网络接口指定一个名称。

    例如,要设置一个静态 ipv4 地址和一个静态 mac 地址,请使用 --network bridge:ip=10.88.0.10,mac=44:33:22:11:00:99

  • <network name or ID>[:OPTIONS,…]: 连接到用户定义的网络;这是由 podman network create 创建的网络的网络名称或 ID。可以使用网桥模式下描述的相同选项。多次使用 --network 选项以指定其他网络。
    为了向后兼容,也可以在第一个 --network 参数上指定逗号分隔的网络,但这会阻止您使用网桥部分中描述的选项。

  • none: 为容器创建一个网络命名空间,但不要为其配置网络接口,因此容器没有网络连接。

  • container:id: 重用另一个容器的网络栈。

  • host: 不要创建网络命名空间,容器使用主机的网络。注意:主机模式使容器能够完全访问本地系统服务,例如 D-bus,因此被认为是不安全的。

  • ns:path: 要加入的网络命名空间的路径。

  • private: 为容器创建一个新的命名空间。对于有根容器,这使用 bridge 模式,而对于无根容器,则使用 slirp4netns

  • slirp4netns[:OPTIONS,…]: 使用 slirp4netns(1) 创建用户网络栈。可以指定这些附加选项,它们也可以使用 containers.conf 中的 network_cmd_options 设置。

    • allow_host_loopback=true|false: 允许 slirp4netns 访问主机环回 IP(默认值为 10.0.2.2 或从 slirp4netns cidr 子网更改后的第二个 IP,请参阅下面的 cidr 选项)。默认值为 false。

    • mtu=MTU: 指定此网络的 MTU。(默认值为 65520)。

    • cidr=CIDR: 指定此网络的 IP 范围。(默认值为 10.0.2.0/24)。

    • enable_ipv6=true|false: 启用 IPv6。默认值为 true。(outbound_addr6 所必需)。

    • outbound_addr=INTERFACE: 指定 slirp 绑定的出站接口(仅 IPv4 流量)。

    • outbound_addr=IPv4: 指定 slirp 绑定的出站 IPv4 地址。

    • outbound_addr6=INTERFACE: 指定 slirp 绑定的出站接口(仅 IPv6 流量)。

    • outbound_addr6=IPv6: 指定 slirp 绑定的出站 IPv6 地址。

    • port_handler=rootlesskit: 使用 rootlesskit 进行端口转发。默认。
      注意:Rootlesskit 将传入数据包的源 IP 地址更改为容器网络命名空间中的 IP 地址,通常为 10.0.2.100。如果应用程序需要真实的源 IP 地址,例如 Web 服务器日志,请使用 slirp4netns 端口处理程序。当连接到用户定义的网络时,无根容器也会使用 rootlesskit 端口处理程序。

    • port_handler=slirp4netns: 使用 slirp4netns 端口转发,它比 rootlesskit 速度慢,但保留了正确的源 IP 地址。此端口处理程序不能用于用户定义的网络。

  • pasta[:OPTIONS,…]: 使用 pasta(1) 创建用户模式网络堆栈。
    这是无根容器的默认值,仅在无根模式下受支持。
    默认情况下,IPv4 和 IPv6 地址和路由以及 pod 接口名称将从主机复制。如果未配置端口转发,则当服务在两侧(init 命名空间或容器命名空间)绑定时,端口会动态转发。端口转发保留原始源 IP 地址。可以在 pasta(1) 中指定以逗号分隔的参数形式描述的选项。
    pasta(1) 选项方面,--config-net 默认情况下给出,以便在容器启动时配置网络,并且 --no-map-gw 也默认情况下假定,以避免容器使用网关地址直接访问主机。可以通过在 pasta 特定选项中传递 --map-gw 来覆盖后者(尽管它不是真正的 pasta(1) 选项)。
    此外,如果分别未配置从主机到容器的 TCP 或 UDP 端口转发,则传递 -t none-u none,以禁用基于绑定端口的自动端口转发。类似地,-T none-U none 用于禁用从容器到主机的相同功能。
    一些例子

    • pasta:--map-gw: 允许容器使用网关地址直接访问主机。

    • pasta:--mtu,1500: 为容器中的 tap 接口指定 1500 字节的 MTU。

    • pasta:--ipv4-only,-a,10.0.2.0,-n,24,-g,10.0.2.2,--dns-forward,10.0.2.3,-m,1500,--no-ndp,--no-dhcpv6,--no-dhcp,等效于默认 slirp4netns(1) 选项:禁用 IPv6,为容器中的 tap0 接口分配 10.0.2.0/24,网关为 10.0.2.3,启用在 10.0.2.3 可访问的 DNS 转发器,将 MTU 设置为 1500 字节,禁用 NDP、DHCPv6 和 DHCP 支持。

    • pasta:-I,tap0,--ipv4-only,-a,10.0.2.0,-n,24,-g,10.0.2.2,--dns-forward,10.0.2.3,--no-ndp,--no-dhcpv6,--no-dhcp,等效于具有 Podman 覆盖的默认 slirp4netns(1) 选项:与上面相同,但将 MTU 保留为 65520 字节

    • pasta:-t,auto,-u,auto,-T,auto,-U,auto: 启用基于从主机和容器两侧观察到的绑定端口的自动端口转发

    • pasta:-T,5201: 启用从容器到主机的 TCP 端口 5201 的转发,使用环回接口而不是 tap 接口以提高性能

如果与 --dns--dns-option--dns-search 一起使用,且 --network 设置为 nonecontainer:id,则无效。

如果与 --pod 一起使用,则容器将加入 pod 的网络命名空间。

--network-alias=alias

为容器添加网络范围的别名,为容器加入的所有网络设置别名。要仅为特定网络设置名称,请使用别名选项,如 --network 选项下所述。如果网络启用了 DNS(podman network inspect -f {{.DNSEnabled}} <name>),则这些别名可用于在给定网络上进行名称解析。此选项可以多次指定。注意:当使用 CNI 时,容器只能访问它加入的第一个网络上的别名。使用 netavark/aardvark-dns 时不存在此限制。

--no-healthcheck

禁用容器的任何已定义的健康检查。

--no-hosts

不要修改容器中的 /etc/hosts 文件。

默认情况下,Podman 会控制容器的 /etc/hosts 文件,并添加容器名称(请参阅 --name 选项)和主机名(请参阅 --hostname 选项)、内部 host.containers.internalhost.docker.internal 主机以及使用 --add-host 选项添加的任何主机名的条目。有关详细信息,请参阅 --add-host 选项。传递 --no-hosts 将禁用此功能,以便保持镜像的 /etc/hosts 文件不变。通过在 containers.conf 中设置 no_hosts=true 可以全局实现相同的效果。

此选项与 --add-host 冲突。

--oom-kill-disable

是否为容器禁用 OOM Killer。

此标志在 cgroups V2 系统上不受支持。

--oom-score-adj=num

调整主机对容器的 OOM 偏好设置(接受从 -10001000 的值)。

在无根模式下运行时,指定的数值不能低于当前进程的 oom_score_adj。在这种情况下,oom-score-adj 会被限制为当前进程的数值。

--os=OS

覆盖要拉取的镜像的 OS,默认为主机,例如,windows。除非覆盖,否则本地存储中相同镜像的后续查找将匹配此 OS,而与主机无关。

--passwd

允许 Podman 在与 --user 选项一起使用时向 /etc/passwd 和 /etc/group 添加条目。这用于覆盖 Podman 提供的用户设置,以便支持入口点配置,例如 libnss-extrausers。

--passwd-entry=ENTRY

自定义在使用 --passwd 时写入容器中的 /etc/passwd 文件的条目。

变量 $USERNAME、$UID、$GID、$NAME、$HOME 会在运行时自动替换为其值。

--personality=persona

Personality 通过 Linux personality(2) 设置执行域。

--pid=mode

设置容器的 PID 命名空间模式。默认情况下,为容器创建一个私有的 PID 命名空间。

  • container:id: 加入另一个容器的 PID 命名空间;

  • host: 为容器使用主机的 PID 命名空间。注意,主机模式会赋予容器对本地 PID 的完全访问权限,因此被认为是不安全的;

  • ns:path: 加入指定的 PID 命名空间;

  • private: 为容器创建一个新的命名空间(默认)。

--pidfile=path

当指定 pidfile 位置时,容器进程的 PID 将写入 pidfile。(此选项不适用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器)如果未指定 pidfile 选项,则容器进程的 PID 将写入 /run/containers/storage/${storage-driver}-containers/$CID/userdata/pidfile。

容器启动后,可以使用以下 podman inspect 命令查找 pidfile 的位置

$ podman inspect --format '{{ .PidFile }}' $CID
/run/containers/storage/${storage-driver}-containers/$CID/userdata/pidfile

--pids-limit=limit

调整容器的 pids 限制。设置为 -1 表示容器的 pids 无限制。默认情况下,在支持 “pids” cgroup 控制器 的系统上为 2048

--platform=OS/ARCH

指定用于选择镜像的平台。(与 --arch 和 --os 冲突)--platform 选项可用于覆盖当前体系结构和操作系统。除非覆盖,否则本地存储中相同镜像的后续查找将匹配此平台,而与主机无关。

--pod=name

在现有 pod 中运行容器。如果 pod 名称以 new: 为前缀,Podman 会自动创建 pod。若要使用更细粒度的选项创建 pod,请在创建容器之前使用 podman pod create 命令。当容器与具有基础设施容器的 pod 一起运行时,基础设施容器将首先启动。

--pod-id-file=file

在现有 pod 中运行容器,并从指定的 file 中读取 pod 的 ID。当容器在具有基础设施容器的 pod 中运行时,基础设施容器将首先启动。

--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**),例如,不能修改操作系统的一部分。这是因为默认情况下,容器仅允许访问有限的设备。一个“特权”容器被授予与启动容器的用户相同的设备访问权限,除了在 systemd 模式下(**--systemd=always**)运行时虚拟控制台(* /dev/tty\d+*)。

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

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

**--publish**,**-p**= *[[ip:][hostPort]:]containerPort[/protocol]*

将容器的端口或端口范围发布到主机。

*hostPort* 和 *containerPort* 都可以指定为端口范围。当为两者指定范围时,范围中容器端口的数量必须与范围中主机端口的数量相匹配。

如果主机 IP 设置为 0.0.0.0 或根本没有设置,则端口将在主机的所有 IP 上绑定。

默认情况下,Podman 发布 TCP 端口。要改为发布 UDP 端口,请将 udp 作为协议。要发布 TCP 和 UDP 端口,请分别使用 tcpudp 作为协议设置两次 --publish。带根容器也可以使用 sctp 协议发布端口。

主机端口不必指定(例如,podman run -p 127.0.0.1::80)。如果没有指定,则容器端口会在主机上随机分配一个端口。

使用 **podman port** 查看实际映射:podman port $CONTAINER $CONTAINERPORT

请注意,网络驱动程序 macvlanipvlan 不支持端口转发,它对这些网络没有影响。

**注意:**如果容器在 Pod 中运行,则无需为 Pod 中的容器发布端口。端口只需要由 Pod 本身发布。Pod 网络堆栈就像主机上的网络堆栈一样 - 意味着 Pod 中的各种容器和容器中的程序共享一个接口、IP 地址和相关端口。如果一个容器绑定到一个端口,则 Pod 中的任何其他容器在它使用时都不能使用该端口。Pod 中的容器也可以通过让一个容器绑定到 Pod 中的 localhost,另一个容器连接到该端口来通过 localhost 进行通信。

**--publish-all**,**-P**

将所有公开的端口发布到主机接口上的随机端口。默认值为 **false**。

设置为 **true** 时,将所有公开的端口发布到主机接口。如果操作员使用 **-P**(或 **-p**),那么 Podman 会使公开的端口在主机上可访问,并且这些端口可供可以访问主机的任何客户端使用。

使用此选项时,Podman 会将任何公开的端口绑定到主机上 * /proc/sys/net/ipv4/ip_local_port_range* 中定义的短暂端口范围内的随机端口。要查找主机端口和公开端口之间的映射,请使用 **podman port**。

**--pull**= *policy*

拉取镜像策略。默认值为 **missing**。

  • **always**:始终拉取镜像,如果拉取失败则抛出错误。

  • **missing**:仅在本地容器存储中没有镜像时拉取镜像。如果找不到镜像且拉取失败,则抛出错误。

  • **never**:从不拉取镜像,而是使用本地容器存储中的镜像。如果找不到镜像,则抛出错误。

  • **newer**:如果注册表上的镜像比本地容器存储中的镜像更新,则拉取。当摘要不同时,镜像被认为是更新的。比较时间戳容易出错。如果找到本地镜像,则拉取错误将被抑制。

**--quiet**,**-q**

拉取镜像时抑制输出信息

**--rdt-class**= *intel-rdt-class-of-service*

Rdt-class 设置容器运行的类别服务(CLOS 或 COS)。基于作为英特尔资源总监技术 (RDT) 特性集的一部分的缓存分配技术 (CAT) 特性,所有容器进程将在预配置的 COS 内运行,代表缓存的一部分。COS 必须使用 resctrl 内核驱动程序提供的伪文件系统(通常挂载在 /sys/fs/resctrl)创建和配置。将容器分配给 COS 需要 root 权限,因此在无根环境中不起作用。目前,该特性仅支持使用 runc 作为运行时。有关在容器可以分配到 COS 之前创建 COS 的更多详细信息,请参阅 https://docs.kernel.org/arch/x86/resctrl.html

**--read-only**

将容器的根文件系统以只读方式挂载。

默认情况下,容器根文件系统是可写的,允许进程在任何地方写入文件。通过指定 **--read-only** 标志,容器根文件系统以只读方式挂载,禁止任何写入操作。

**--read-only-tmpfs**

运行 --read-only 容器时,在 * /dev*、* /dev/shm*、* /run*、* /tmp* 和 * /var/tmp* 上挂载一个可写 tmpfs。默认值为 **true**。

--read-only

--read-only-tmpfs

/

/run, /tmp, /var/tmp

true

true

r/o

r/w

true

false

r/o

r/o

false

false

r/w

r/w

false

true

r/w

r/w

当 **--read-only=true** 且 **--read-only-tmpfs=true** 时,将在 /tmp、/run 和 /var/tmp 目录上挂载额外的 tmpfs。

当 **--read-only=true** 且 **--read-only-tmpfs=false** 时,/dev 和 /dev/shm 被标记为只读,并且在 /tmp、/run 和 /var/tmp 上没有挂载 tmpfs。这些目录从底层镜像暴露出来,这意味着它们默认情况下是只读的。这使得容器完全只读。容器内不存在可写目录。在这种模式下,需要通过外部卷或挂载添加可写目录。

默认情况下,当 **--read-only=false** 时,/dev 和 /dev/shm 是可读写的,而 /tmp、/run 和 /var/tmp 是来自容器镜像的可写目录。

**--replace**

如果另一个同名容器已存在,则替换并删除它。默认值为 **false**。

**--requires**= *container*

指定一个或多个需求。需求是一个依赖容器,在该容器之前启动。容器可以通过名称或 ID 指定,多个容器用逗号分隔。

**--restart**= *policy*

容器退出时要遵循的重启策略。如果容器通过 **podman kill** 或 **podman stop** 命令停止,则重启策略不会生效。

有效的 *policy* 值是

  • no :容器退出时不重启

  • never :与 **no** 同义;容器退出时不重启

  • on-failure[:max_retries] :容器以非零退出代码退出时重启容器,无限次重试,直到可选的 *max_retries* 计数达到为止

  • always :容器退出时重启容器,无论状态如何,无限次重试

  • unless-stopped :与 **always** 相同

Podman 提供了一个 systemd unit 文件,podman-restart.service,它在系统重启后重启容器。

在 systemd 服务中运行容器时,使用 systemd 提供的重启功能。换句话说,不要在容器单元中使用此选项,而是将 Restart= systemd 指令设置在 [Service] 部分。请参阅 **podman-systemd.unit**(5) 和 **systemd.service**(5)。

**--retry**= *attempts*

在注册表和本地存储之间拉取或推送镜像时,在发生故障的情况下重试的次数。默认值为 **3**。

**--retry-delay**= *duration*

在注册表和本地存储之间拉取或推送镜像时,在发生故障的情况下,两次重试尝试之间的延迟时间。默认值为从两秒开始,然后指数级回退。如果设置了此值,则使用延迟,并且不会发生指数级回退。

**--rm**

容器退出时自动删除容器和与其关联的任何匿名未命名卷。默认值为 **false**。

**--rmi**

容器退出后,删除镜像,除非其他容器正在使用它。意味着在新的容器上使用 --rm。默认值为 *false*。

**--rootfs**

如果指定,则第一个参数指的是文件系统上的已展开容器。

这对于在不需要任何镜像管理的情况下运行容器很有用,容器的 rootfs 假设是在外部管理的。

Overlay Rootfs Mounts

:O 标志告诉 Podman 使用 overlay file system 将目录从 rootfs 路径挂载为存储。容器进程可以修改挂载点内的内容,这些内容存储在容器存储中的单独目录中。用覆盖术语来说,源目录是底层的,而容器存储目录是顶层的。对挂载点的修改在容器完成执行后会销毁,类似于 tmpfs 挂载点被卸载。

注意:在 **SELinux** 系统上,rootfs 需要正确的标签,默认情况下为 **unconfined_u:object_r:container_file_t:s0**。

idmap

如果指定了 idmap,则在容器中的目标用户命名空间中创建一个 idmap 挂载点。 idmap 选项支持自定义映射,该映射可能与容器使用的用户命名空间不同。 可以在 idmap 选项之后指定映射,例如:idmap=uids=0-1-10#10-11-10;gids=0-100-10。 对于每个三元组,第一个值是映射到主机上的第二个值的后备文件系统 ID 的起始位置。 此映射的长度在第三个值中给出。 多个范围用 # 分隔。

--sdnotify=container | conmon | healthy | ignore

确定如何使用 NOTIFY_SOCKET,该套接字与 systemd 一起传递,并且 Type=notify。

默认值为 container,这意味着允许 OCI 运行时将套接字代理到容器中以接收就绪通知。 Podman 将 MAINPID 设置为 conmon 的 pid。 conmon 选项将 MAINPID 设置为 conmon 的 pid,并在容器启动时发送 READY。 该套接字永远不会传递到运行时或容器。 healthy 选项将 MAINPID 设置为 conmon 的 pid,并在容器变为健康状态时发送 READY; 需要设置健康检查。 该套接字永远不会传递到运行时或容器。 ignore 选项从自身及其子进程的环境中删除 NOTIFY_SOCKET,用于某些在 Podman 之上使用 NOTIFY_SOCKET 但 Podman 不使用它的其他进程的情况。

--seccomp-policy=policy

指定策略以选择 seccomp 配置文件。 如果设置为 image,Podman 会在容器镜像配置中查找“io.containers.seccomp.profile”标签,并使用其值作为 seccomp 配置文件。 否则,Podman 会遵循 default 策略,通过应用默认配置文件来执行此操作,除非在下面描述的 --security-opt seccomp 中另有指定。

请注意,此功能处于实验阶段,将来可能会更改。

--secret=secret[,opt=opt …]

让容器访问密钥。 可以多次指定。

密钥是容器在运行时需要但未存储在镜像或源代码控制中的敏感数据块,例如用户名和密码、TLS 证书和密钥、SSH 密钥或其他重要的通用字符串或二进制内容(大小上限为 500 kb)。

当密钥指定为 mount 类型时,密钥将在创建容器时复制并挂载到容器中。 当密钥指定为 env 类型时,密钥将在容器中被设置为环境变量。 密钥在容器创建时写入容器,并且在创建容器后使用 podman secret 命令修改密钥会影响容器内的密钥。

密钥及其存储使用 podman secret 命令进行管理。

密钥选项

  • type=mount|env:如何向容器公开密钥。 mount 将密钥挂载到容器中作为文件。 env 将密钥作为环境变量公开。 默认值为 mount

  • target=target:密钥的目标。 对于挂载的密钥,这是容器内密钥的路径。 如果提供完全限定路径,则密钥将挂载到该位置。 否则,密钥将挂载到 /run/secrets/target(对于 Linux 容器)或 /var/run/secrets/target(对于 FreeBSD 容器)。 如果未设置目标,则默认情况下密钥将挂载到 /run/secrets/secretname。 对于 env 密钥,这是环境变量键。 默认值为 secretname

  • uid=0:密钥的 UID。 默认值为 0。 仅挂载密钥类型。

  • gid=0:密钥的 GID。 默认值为 0。 仅挂载密钥类型。

  • mode=0:密钥的模式。 默认值为 0444。 仅挂载密钥类型。

示例

挂载到 /my/location/mysecret,UID 为 1

--secret mysecret,target=/my/location/mysecret,uid=1

挂载到 /run/secrets/customtarget,模式为 0777

--secret mysecret,target=customtarget,mode=0777

创建一个名为 ENVSEC 的密钥环境变量

--secret mysecret,type=env,target=ENVSEC

--security-opt=option

安全选项

  • apparmor=unconfined:关闭容器的 apparmor 限制

  • apparmor=alternate-profile:设置容器的 apparmor 限制配置文件

  • label=user:USER:设置容器进程的标签用户

  • label=role:ROLE:设置容器进程的标签角色

  • label=type:TYPE:设置容器进程的标签进程类型

  • label=level:LEVEL:设置容器进程的标签级别

  • label=filetype:TYPE:设置容器文件的标签文件类型

  • label=disable:关闭容器的标签分离

注意:可以通过在 containers.conf (/etc/containers/containers.conf$HOME/.config/containers/containers.conf) 文件中设置 label=false 来为所有容器禁用标签。

  • label=nested:允许在容器内进行 SELinux 修改。 只要 SELinux 策略允许,容器就可以修改文件和进程的 SELinux 标签。 如果没有 nested,容器会将 SELinux 视为已禁用,即使它在主机上已启用。 容器会被阻止设置任何标签。

  • mask=/path/1:/path/2:要屏蔽的路径,用冒号分隔。 容器内部无法访问屏蔽的路径。

  • no-new-privileges:禁用容器进程获得额外权限。

  • seccomp=unconfined:关闭容器的 seccomp 限制。

  • seccomp=profile.json:用作 seccomp 过滤器的 JSON 文件。 请注意,io.podman.annotations.seccomp 注释将使用指定的 value 设置,如 podman inspect 中所示。

  • proc-opts=OPTIONS:用于 /proc 挂载点的选项的逗号分隔列表。 关于可能的挂载选项的更多详细信息在 proc(5) 手册页中指定。

  • unmask=ALL/path/1:/path/2 或 shell 展开的路径 (/proc/*):要取消屏蔽的路径,用冒号分隔。 如果设置为 ALL,它将取消屏蔽默认情况下被屏蔽或设置为只读的所有路径。 默认屏蔽的路径为 /proc/acpi, /proc/kcore, /proc/keys, /proc/latency_stats, /proc/sched_debug, /proc/scsi, /proc/timer_list, /proc/timer_stats, /sys/firmware, and /sys/fs/selinux, /sys/devices/virtual/powercap。 默认的只读路径为 /proc/asound, /proc/bus, /proc/fs, /proc/irq, /proc/sys, /proc/sysrq-trigger, /sys/fs/cgroup.

注意:可以通过在 containers.conf(5) 文件中设置 label=false 来为所有容器禁用标签。

--shm-size=number[unit]

/dev/shm 的大小。 unit 可以是 b(字节)、k(kibibytes)、m(mebibytes)或 g(gibibytes)。 如果省略了单位,系统将使用字节。 如果省略了大小,则默认值为 64m。 当 size0 时,容器用于 IPC 的内存量没有限制。 此选项与 --ipc=host 冲突。

--shm-size-systemd=number[unit]

systemd 特定 tmpfs 挂载点(如 /run、/run/lock、/var/log/journal 和 /tmp)的大小。 unit 可以是 b(字节)、k(kibibytes)、m(mebibytes)或 g(gibibytes)。 如果省略了单位,系统将使用字节。 如果省略了大小,则默认值为 64m。 当 size0 时,使用量将限制为主机可用内存的 50%。

--sig-proxy

将接收到的信号代理到容器进程。 不会代理 SIGCHLD、SIGURG、SIGSTOP 和 SIGKILL。

默认值为 true

--stop-signal=signal

用于停止容器的信号。 默认值为 SIGTERM

--stop-timeout=seconds

停止容器的超时时间。 默认值为 10。 远程连接使用本地 containers.conf 获取默认值。

--subgidname=name

在新的用户命名空间中运行容器,使用 /etc/subgid 文件中的 name 映射。 如果以 rootless 模式运行,则用户需要有权使用映射。 请参见 subgid(5)。 此标志与 --userns--gidmap 冲突。

--subuidname=name

在新的用户命名空间中运行容器,使用 /etc/subuid 文件中的 name 映射。 如果以 rootless 模式运行,则用户需要有权使用映射。 请参见 subuid(5)。 此标志与 --userns--uidmap 冲突。

--sysctl=name=value

在运行时配置命名空间内核参数。

对于 IPC 命名空间,允许使用以下 sysctls

  • kernel.msgmax

  • kernel.msgmnb

  • kernel.msgmni

  • kernel.sem

  • kernel.shmall

  • kernel.shmmax

  • kernel.shmmni

  • kernel.shm_rmid_forced

  • 以 fs.mqueue.* 开头的 Sysctls

注意:如果使用 --ipc=host 选项,则不允许使用上述 sysctls。

对于网络命名空间,仅允许使用以 net.* 开头的 sysctls。

注意:如果使用 --network=host 选项,则不允许使用上述 sysctls。

--systemd=true | false | always

在 systemd 模式下运行容器。 默认值为 true

  • true 仅在容器内执行的命令为 systemd/usr/sbin/init/sbin/init/usr/local/sbin/init 时启用 systemd 模式。

  • false 禁用 systemd 模式。

  • always 强制启用 systemd 模式。

在 systemd 模式下运行容器会导致以下更改

  • Podman 在以下目录中挂载 tmpfs 文件系统

    • /run

    • /run/lock

    • /tmp

    • /sys/fs/cgroup/systemd (在 cgroup v1 系统上)

    • /var/lib/journal

  • Podman 将默认停止信号设置为 SIGRTMIN+3

  • Podman 在容器中设置 container_uuid 环境变量为容器 ID 的前 32 个字符。

  • Podman 在使用 --privileged 运行时不会挂载虚拟控制台 (/dev/tty\d+)。

  • 在 cgroup v2 上,/sys/fs/cgroup 被挂载为可写。

这使得 systemd 可以在没有任何修改的情况下运行在受限容器中。

请注意,在 SELinux 系统上,systemd 会尝试写入 cgroup 文件系统。默认情况下,容器写入 cgroup 文件系统会被拒绝。在 SELinux 分离的系统上,必须启用 container_manage_cgroup 布尔值才能允许此操作。

setsebool -P container_manage_cgroup true

--timeout=seconds

容器在 conmon 发送终止信号之前允许运行的最大时间。默认情况下,容器会一直运行,直到它们退出或被 podman stop 停止。

--tls-verify

在联系注册表时要求 HTTPS 并验证证书(默认:true)。如果显式设置为 true,则使用 TLS 验证。如果设置为 false,则不使用 TLS 验证。如果未指定,则使用 TLS 验证,除非目标注册表在 containers-registries.conf(5) 中列为不安全的注册表。

--tmpfs=fs

创建一个 tmpfs 挂载。

将一个临时文件系统 (tmpfs) 挂载到容器中,例如

$ podman run -d --tmpfs /tmp:rw,size=787448k,mode=1777 my_image

此命令将一个 tmpfs 挂载到容器中的 /tmp。支持的挂载选项与 Linux 默认挂载标志相同。如果没有指定选项,系统将使用以下选项:rw,noexec,nosuid,nodev

--tty, -t

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

当设置为 true 时,Podman 会分配一个伪终端并连接到容器的标准输入。这可以用来运行一个一次性的交互式 shell。

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

echo "asdf" | podman run --rm -i someimage /bin/cat

--tz=timezone

在容器中设置时区。此标志接受区域性时区、GMT 时间,以及 local,它会将容器中的时区设置为与主机相同。有关有效时区,请参见 /usr/share/zoneinfo/。远程连接使用本地 containers.conf 作为默认值。

--uidmap=[flags]container_uid:from_uid[:amount]

使用提供的 UID 映射在新的用户命名空间中运行容器。此选项与 --userns--subuidname 选项冲突。此选项提供了一种将主机 UID 映射到容器 UID 的方法。它可以多次传递以映射不同的范围。

可选 flags 的可能值将在本页面的下文中进一步讨论。amount 值是可选的,如果未给出,则假定为 1

from_uid 值基于运行该命令的用户,无论是 rootful 用户还是 rootless 用户。

  • rootful 用户: [flags]container_uid:host_uid[:amount]

  • rootless 用户: [flags]container_uid:intermediate_uid[:amount]

    Rootful mappings

当特权用户调用 podman run 时,选项 --uidmap 会作为主机 UID 和容器 UID 之间的直接映射工作。

主机 UID -> 容器 UID

amount 指定被映射的连续 UID 的数量。例如,如果 amount4,则映射如下所示

主机 UID

容器 UID

from_uid

container_uid

from_uid + 1

container_uid + 1

from_uid + 2

container_uid + 2

from_uid + 3

container_uid + 3

Rootless mappings

当非特权用户(即运行 rootless)调用 podman run 时,from_uid 值将被解释为“中间 UID”。在 rootless 情况下,主机 UID 不会直接映射到容器 UID。相反,映射会通过两个映射步骤完成

主机 UID -> 中间 UID -> 容器 UID

--uidmap 选项只影响第二个映射步骤。

第一个映射步骤由 Podman 从文件 /etc/subuid 和调用 Podman 的用户的 UID 中推导出。

第一个映射步骤

主机 UID

中间 UID

Podman 用户的 UID

0

第一个从属 UID

1

第二个从属 UID

2

第三个从属 UID

3

第 n 个从属 UID

n

为了能够使用大于零的中间 UID,用户需要在 /etc/subuid 中配置从属 UID。请参见 subuid(5)。

第二个映射步骤是用 --uidmap 配置的。

例如,如果 amount5,则第二个映射步骤如下所示

中间 UID

容器 UID

from_uid

container_uid

from_uid + 1

container_uid + 1

from_uid + 2

container_uid + 2

from_uid + 3

container_uid + 3

from_uid + 4

container_uid + 4

当以 rootless 方式运行时,Podman 会使用 /etc/subuid 文件中配置的所有范围。

当前用户 ID 映射到 rootless 用户命名空间中的 UID=0。每个额外的范围都会在之后按顺序添加

主机

rootless 用户命名空间

长度

$UID

0

1

1

$FIRST_RANGE_ID

$FIRST_RANGE_LENGTH

1+$FIRST_RANGE_LENGTH

$SECOND_RANGE_ID

$SECOND_RANGE_LENGTH

Referencing a host ID from the parent namespace

作为 rootless 用户,--uidmap--gidmap 中给定的主机 ID 是从 Podman 生成的 中间命名空间 映射的。有时,直接引用 主机命名空间 是可取的。可以通过手动执行 podman unshare cat /proc/self/gid_map,在输出的第二列中找到所需的主机 ID,并从第一列获取相应的中间 ID,来手动执行此操作。

Podman 可以通过在映射中的主机 ID 前面加上 @ 符号来完成所有这些操作。例如,通过指定 --gidmap 100000:@2000:1,podman 将查找与主机 ID 2000 相对应的中间 ID,并将找到的中间 ID 映射到容器 ID 100000。给定的主机 ID 必须是 subordination 的(否则它不会在第一步中映射到中间空间)。

如果长度大于 1,例如使用 --gidmap 100000:@2000:2,Podman 会将主机 ID 20002001 分别映射到 100000100001,而与中间映射的定义方式无关。

Extending previous mappings

某些映射修改可能很麻烦。例如,用户从一个映射开始,例如 --gidmap="0:0:65000",需要更改,例如父 ID 1000 映射到容器 ID 100000,而容器 ID 1 未分配。相应的 --gidmap 变为 --gidmap="0:0:1" --gidmap="2:2:65534" --gidmap="100000:1:1"

可以使用 + 标志简化此表示法,该标志负责断开先前的映射,并删除与给定映射的任何冲突分配。该标志在容器 ID 前面给出,如下所示:--gidmap="0:0:65000" --gidmap="+100000:1:1"

标志

示例

描述

+

+100000:1:1

扩展之前的映射

这种表示法会导致分配中出现间隙,因此之后可能需要填充这些间隙:--gidmap="0:0:65000" --gidmap="+100000:1:1" --gidmap="1:65001:1"

此标志的一种特定用例是在 rootless 用户的上下文中。rootless 用户可以使用 + 标志指定映射,如 --gidmap="+100000:1:1"。然后,Podman 会从零开始,使用所有剩余的中间 ID 来“填充间隙”。当用户希望将特定中间 ID 映射到容器 ID 时,这很方便,而将其他从属 ID 映射到 Podman 随意映射的 ID。

Passing only one of --uidmap or --gidmap

通常,从属的用户和组 ID 是同时分配的,对于任何用户,从属的用户 ID 都与从属的组 ID 相匹配。为了方便起见,如果只给出了 --uidmap--gidmap 中的一个,podman 会假定该映射同时引用 UID 和 GID,并将给定的映射应用于两者。如果只需要更改两个值中的一个,则映射应该包含 ug 标志来指定它们只适用于 UID 或 GID,并且不应该被复制过去。

标志

示例

描述

u

u20000:2000:1

该映射仅适用于 UID

g

g10000:1000:1

该映射仅适用于 GID

例如,给定以下命令

podman run --gidmap "0:0:1000" --gidmap "g2000:2000:1"

由于没有给出 --uidmap,因此 --gidmap 会被复制到 --uidmap,给出与以下命令等效的命令

podman run --gidmap "0:0:1000" --gidmap "2000:2000:1" --uidmap "0:0:1000"

使用 --gidmap "g2000:2000:1" 使用了 g 标志,因此它没有被复制到 --uidmap

Rootless mapping of additional host GIDs

rootless 用户可能希望映射一个特定的主机组,该主机组已经通过 /etc/subgid subordination,而无需指定其他映射。

这可以通过 --gidmap “+gcontainer_gid:@host_gid 来实现。

其中

  • 主机 GID 是通过 @ 符号给出的

  • 由于 g 标志的存在,此 GID 的映射不会被复制到 --usermap

  • 由于 + 标志的存在,其余容器 ID 将从 0 到 n 开始映射,使用所有剩余的从属 GID。

例如,如果用户属于组 2000,并且该组是该用户的从属组(使用 usermod --add-subgids 2000-2000 $USER),则用户可以使用以下命令将该组映射到容器中:--gidmap=+g100000:@2000

如果此映射与选项 --group-add=keep-groups 结合使用,容器中的进程将属于组 100000,而主机中属于组 2000 的文件将显示为容器内由组 100000 拥有。

podman run --group-add=keep-groups --gidmap="+g100000:@2000" ...

没有 从属 UID

即使用户在 /etc/subuid 中没有任何从属 UID,也可以通过运行 podman run --uidmap $container_uid:0:1 --user $container_uid ... 使用 --uidmap 将用户的普通 UID 映射到容器 UID。

Pod

--uidmap 选项不能与 --pod 选项一起使用,因为在 Pod 中无法在容器级别设置 uidmap。

--ulimit=option

Ulimit 选项。设置容器内的 ulimits 值。

--ulimit 使用软限制和硬限制,格式为=[:例如

$ podman run --ulimit nofile=1024:1024 --rm ubi9 ulimit -n 1024

将软限制或硬限制设置为 -1,可将限制设置为当前进程的最大限制。在有根模式下,这通常是无限的。

如果未设置 nofile 和 nproc,则将使用默认值 1048576,除非在 containers.conf(5) 中被覆盖。但是,如果默认值超过当前无根用户的硬限制,则将应用当前硬限制。

使用 host 复制主机上的当前配置。

不要将 nproc 与 ulimit 标志一起使用,因为 Linux 使用 nproc 来设置用户可用的最大进程数,而不是容器。

使用 --pids-limit 选项修改 cgroup 控制以限制容器内的进程数量。

--umask=umask

设置容器内的 umask。默认为 0022。远程连接使用本地 containers.conf 中的默认值。

--unsetenv=env

取消设置容器的默认环境变量。默认环境变量包括 Podman 本身提供的变量、映像配置的环境变量以及 containers.conf 中的环境变量。

--unsetenv-all

取消设置容器的所有默认环境变量。默认环境变量包括 Podman 本身提供的变量、映像配置的环境变量以及 containers.conf 中的环境变量。

--user, -u=user[:group]

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

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

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

--userns=mode

设置容器的用户命名空间模式。

如果未设置 --userns,则默认值将按以下方式确定。

  • 如果设置了 --pod,则忽略 --userns 并使用 Pod 的用户命名空间。

  • 如果设置了环境变量 PODMAN_USERNS,则使用其值。

  • 如果在 containers.conf 中指定了 userns,则使用此值。

  • 否则,假设 --userns=host

--userns=""(即空字符串)是 --userns=host 的别名。

此选项与 --gidmap--uidmap--subuidname--subgidname 不兼容。

无根用户 --userns=键映射

主机用户

容器用户

auto

$UID

nil(主机用户 UID 未映射到容器中。)

主机

$UID

0(默认用户帐户映射到容器中的 root 用户。)

keep-id

$UID

$UID(将用户帐户映射到容器中的相同 UID。)

keep-id:uid=200,gid=210

$UID

200:210(将用户帐户映射到容器中的指定 UID、GID 值。)

nomap

$UID

nil(主机用户 UID 未映射到容器中。)

有效的 mode 值为

auto[:OPTIONS,…]: 自动创建唯一的用户命名空间。

  • 有根模式: --userns=auto 标志要求在 /etc/subuid 和 /etc/subgid 文件中指定用户名 containers,并提供 Podman 容器允许分配的未使用从属用户 ID 范围。

     Example: `containers:2147483647:2147483648`.
    
  • 无根模式: 将使用 /etc/subuid 和 /etc/subgid 文件中的用户范围。请注意,运行单个容器而不使用 --userns=auto 将使用整个 UID 范围,并且不允许进一步细分。请参阅 subuid(5)。

Podman 从 containers 从属用户 ID 中分配唯一的 UID 和 GID 范围。范围的大小基于映像中所需的 UID 数量。可以使用 size 选项覆盖 UID 和 GID 的数量。

选项 --userns=keep-id 使用用户的全部 subuid 和 subgid。选项 --userns=nomap 使用用户的全部 subuid 和 subgid,但用户自己的 ID 除外。只要存在以 --userns=keep-id--userns=nomap 启动的任何容器,在启动新容器时使用 --userns=auto 就不起作用。

有效的 auto 选项

  • gidmapping=CONTAINER_GID:HOST_GID:SIZE: 强制在用户命名空间中存在 GID 映射。

  • size=SIZE: 指定自动用户命名空间的显式大小。例如 --userns=auto:size=8192。如果未指定 size,则 auto 会估计用户命名空间的大小。

  • uidmapping=CONTAINER_UID:HOST_UID:SIZE: 强制在用户命名空间中存在 UID 映射。

gidmappinguidmapping 中的主机 UID 和 GID 可选地以 @ 符号为前缀。在这种情况下,podman 将查找与主机 ID 对应的中间 ID,并将找到的中间 ID 映射到容器 ID。有关详细信息,请参阅 --uidmap

container:id: 加入指定容器的用户命名空间。

host“”(空字符串):在调用者的用户命名空间中运行。容器中运行的进程对主机的权限与调用者启动的任何其他进程相同。

keep-id: 创建一个用户命名空间,其中当前用户的 UID:GID 映射到容器中的相同值。对于由 root 创建的容器,当前映射将被创建到新的用户命名空间中。

有效的 keep-id 选项

  • uid=UID: 覆盖容器内用于将当前用户映射到的 UID。

  • gid=GID: 覆盖容器内用于将当前用户映射到的 GID。

nomap: 创建一个用户命名空间,其中当前无根用户的 UID:GID 未映射到容器中。对于由 root 用户创建的容器,此选项不允许。

ns:namespace: 在给定的现有用户命名空间中运行容器。

--uts=mode

设置容器的 UTS 命名空间模式。支持以下值

  • host: 在容器内使用主机的 UTS 命名空间。

  • private: 为容器创建一个新的命名空间(默认)。

  • ns:[path]: 在给定的现有 UTS 命名空间中运行容器。

  • container:[container]: 加入指定容器的 UTS 命名空间。

--variant=VARIANT

使用 VARIANT 代替容器映像的默认体系结构变体。一些映像可以使用 arm 体系结构的多个变体,例如 arm/v5 和 arm/v7。

--volume, -v=[[SOURCE-VOLUME|HOST-DIR:]CONTAINER-DIR[:OPTIONS]]

创建绑定挂载。如果指定了 -v /HOST-DIR:/CONTAINER-DIR,Podman 将从主机上的 /HOST-DIR 绑定挂载到 Podman 容器内的 /CONTAINER-DIR。类似地,-v SOURCE-VOLUME:/CONTAINER-DIR 将主机上的命名卷挂载到容器中。如果不存在此类命名卷,Podman 将创建一个。如果没有给出源,则该卷将作为匿名命名卷创建,并具有随机生成的名称,并且在使用 --rm 标志或 podman rm --volumes 命令删除容器时删除。

(请注意,当使用远程客户端(包括 Mac 和 Windows(不包括 WSL2)机器)时,卷将从远程服务器挂载,不一定从客户端机器挂载。)

OPTIONS 是一个逗号分隔的列表,可以包含以下一个或多个选项:

  • rw|ro

  • z|Z

  • [O]

  • [U]

  • [no]copy

  • [no]dev

  • [no]exec

  • [no]suid

  • [r]bind

  • [r]shared|[r]slave|[r]private[r]unbindable [1]

  • idmap[=options]

CONTAINER-DIR 必须是绝对路径,例如 /src/docs。该卷将挂载到容器中的此目录。

如果指定了卷源,它必须是主机上的路径或命名卷的名称。主机路径可以是绝对路径或相对路径;相对路径将相对于运行 Podman 的目录解析。如果源不存在,Podman 将返回错误。用户必须预先创建源文件或目录。

任何不以 ./ 开头的源都将被视为命名卷的名称。如果不存在具有该名称的卷,则将创建它。使用名称创建的卷不是匿名的,并且不会被 --rm 选项和 podman rm --volumes 命令删除。

指定多个 -v 选项以将一个或多个卷挂载到容器中。

写保护卷挂载

分别添加 :ro:rw 选项以只读或读写模式挂载卷。默认情况下,卷以读写模式挂载。请参阅示例。

chown 卷挂载

默认情况下,Podman 不会更改挂载到容器中的源卷目录的所有者和组。如果在新的用户命名空间中创建了容器,则容器中的 UID 和 GID 可能对应于主机上的另一个 UID 和 GID。

:U 后缀告诉 Podman 根据容器内的 UID 和 GID 使用正确的主机 UID 和 GID,以递归地更改源卷的所有者和组。Chowning 遍历卷下的文件系统并更改每个文件上的 UID/GID。如果卷具有数千个 inode,此过程将花费很长时间,从而延迟容器的启动。

警告 请谨慎使用,因为这会修改主机文件系统。

标签卷挂载

像 SELinux 这样的标签系统要求将正确的标签放在挂载到容器中的卷内容上。如果没有标签,安全系统可能会阻止容器内部运行的进程使用该内容。默认情况下,Podman 不会更改操作系统设置的标签。

要在容器上下文中更改标签,请在卷挂载中添加两个后缀之一 :z:Z。这些后缀告诉 Podman 重新标记共享卷上的文件对象。z 选项告诉 Podman 两个或多个容器共享卷内容。因此,Podman 使用共享内容标签标记内容。共享卷标签允许所有容器读写内容。Z 选项告诉 Podman 使用私有未共享标签标记内容,只有当前容器可以使用私有卷。注意:pod 中的所有容器共享相同的 SELinux 标签。这意味着所述 pod 中的所有容器都可以读写使用 :Z 在任何一个容器上创建的容器中共享的卷。重新标记会遍历卷下的文件系统并更改每个文件上的标签,如果卷具有数千个 inode,此过程将花费很长时间,从而延迟容器的启动。如果该卷以前使用 z 选项重新标记过,Podman 经过优化不会再次重新标记。如果将文件移动到卷中,则可以使用 chcon -Rt container_file_t PATH 命令手动更改标签。

注意:不要重新标记系统文件和目录。重新标记系统内容可能会导致机器上的其他受限服务失败。对于这些类型的容器,我们建议禁用 SELinux 隔离。选项 --security-opt label=disable 禁用容器的 SELinux 隔离。例如,如果用户想要将整个主目录挂载到容器中,则需要禁用 SELinux 隔离。

$ podman run --security-opt label=disable -v $HOME:/home/user fedora touch /home/user/file

覆盖卷挂载

:O 标志告诉 Podman 使用 overlay file system 将主机上的目录挂载为临时存储。容器进程可以修改挂载点内的内容,这些内容存储在容器存储中的单独目录中。用覆盖术语来说,源目录是下层,容器存储目录是上层。对挂载点的修改在容器完成执行后会销毁,类似于取消挂载 tmpfs 挂载点。

对于高级用户,overlay 选项还支持覆盖挂载的自定义非易失性 upperdirworkdir。自定义 upperdirworkdir 可以由用户自行完全管理,Podman 不会在生命周期完成时将其删除。例如 :O,upperdir=/some/upper,workdir=/some/work

容器的后续执行会看到原始源目录内容,以前容器执行的任何更改都不再存在。

覆盖挂载的一个用例是将主机上的包缓存共享到容器中,以加快构建速度。

注意:O 标志与上面列出的其他选项冲突。

挂载到容器中的内容使用私有标签标记。在 SELinux 系统上,源目录中的标签必须可由容器标签读取。通常,容器可以读取/执行 container_share_t 并且可以读取/写入 container_file_t。如果无法更改源卷上的标签,则必须禁用 SELinux 容器隔离才能使容器正常工作。

不要修改使用覆盖挂载挂载到容器中的源目录,这会导致意外故障。只有在容器运行完成后再修改目录。

挂载传播

默认情况下,绑定挂载的卷是 private。这意味着在容器内完成的任何挂载在主机上不可见,反之亦然。可以通过指定卷挂载传播属性来更改此行为。当卷为 shared 时,在容器内该卷下完成的挂载在主机上可见,反之亦然。将卷设为 slave[1] 仅允许单向挂载传播:在主机上该卷下完成的挂载在容器内可见,但反之则不行。

要控制卷的挂载传播属性,可以使用 [r]shared、[r]slave、[r]private 或 [r]unbindable 传播标志。传播属性只能为绑定挂载的卷指定,不能为内部卷或命名卷指定。要使挂载传播起作用,源挂载点(源目录挂载到的挂载点)必须具有正确的传播属性。对于共享卷,源挂载点必须是共享的。对于从属卷,源挂载点必须是共享的或从属的。[1]

要递归地将卷及其所有子挂载挂载到容器中,请使用 rbind 选项。默认情况下使用 bind 选项,源目录的子挂载不会挂载到容器中。

使用 copy 选项挂载卷会告诉 podman 将内容从基础目标目录复制到新创建的内部卷上。copy 只会在卷的初始创建时发生。当该卷随后在不同的容器上使用时,内容不会被复制上去。copy 选项在绑定挂载上被忽略,并且没有效果。

使用 nosuid 选项挂载卷意味着卷上的 SUID 可执行文件不能被应用程序用于更改其权限。默认情况下,卷使用 nosuid 挂载。

使用 noexec 选项挂载卷意味着卷上的任何可执行文件都不能在容器内执行。

使用 nodev 选项挂载卷意味着卷上的任何设备都不能被容器内的进程使用。默认情况下,卷使用 nodev 挂载。

如果 HOST-DIR 是一个挂载点,那么内核会忽略 devsuidexec 选项。

使用 df HOST-DIR 来找出源挂载,然后使用 findmnt -o TARGET,PROPAGATION source-mount-dir 来找出源挂载的传播属性。如果 findmnt(1) 实用程序不可用,则可以在 /proc/self/mountinfo 中查看源挂载点的挂载条目。查看“可选字段”,看看是否指定了任何传播属性。在那里,shared:N 表示挂载是共享的,master:N 表示挂载是从属的,如果没有,则挂载是私有的。[1]

要更改挂载点的传播属性,请使用 **mount**(8) 命令。例如,如果要绑定挂载源目录 * / foo *,则可以执行 **mount --bind / foo / foo** 和 **mount --make-private --make-shared / foo**。这将把 / foo 转换为共享挂载点。或者,可以直接更改源挂载的传播属性。假设 * / * 是 * / foo * 的源挂载,则使用 **mount --make-shared /** 将 * / * 转换为共享挂载。

注意:如果用户仅通过组具有访问权限,则从无根容器内部访问卷将失败。

Idmapped mount

如果指定了 idmap,则在容器中的目标用户命名空间中创建一个 idmap 挂载点。 idmap 选项支持自定义映射,该映射可能与容器使用的用户命名空间不同。 可以在 idmap 选项之后指定映射,例如:idmap=uids=0-1-10#10-11-10;gids=0-100-10。 对于每个三元组,第一个值是映射到主机上的第二个值的后备文件系统 ID 的起始位置。 此映射的长度在第三个值中给出。 多个范围用 # 分隔。

使用 **--group-add keep-groups** 选项将用户的补充组访问权限传递到容器中。

**--volumes-from**=CONTAINER[:OPTIONS]

从指定容器挂载卷。用于在容器之间共享卷。* options * 是一个逗号分隔的列表,其中包含以下可用元素

  • rw|ro

  • z

将已从源容器挂载的卷挂载到另一个容器。* CONTAINER * 可以是名称或 ID。要共享卷,请在运行目标容器时使用 --volumes-from 选项。即使源容器未运行,也可以共享卷。

默认情况下,Podman 以与它在源容器中挂载的相同模式(读写或只读)挂载卷。可以通过添加 rorw * option * 来更改此设置。

像 SELinux 这样的标签系统要求将正确的标签放在挂载到容器中的卷内容上。如果没有标签,安全系统可能会阻止容器内部运行的进程使用该内容。默认情况下,Podman 不会更改操作系统设置的标签。

要在容器上下文中更改标签,请将 z 添加到卷挂载。此后缀告诉 Podman 重新标记共享卷上的文件对象。 z 选项告诉 Podman 两个实体共享卷内容。结果,Podman 使用共享内容标签标记内容。共享卷标签允许所有容器读取/写入内容。

如果来自源容器的卷的位置与位于目标容器上的数据重叠,则该卷会隐藏目标上的该数据。

**--workdir**,**-w**=dir

容器内的工作目录。

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

退出状态

来自 **podman run** 的退出代码提供了有关容器无法运行或退出原因的信息。当 **podman run** 以非零代码退出时,退出代码遵循 **chroot**(1) 标准,见下文

**125** 错误来自 Podman 本身

$ podman run --foo busybox; echo $?
Error: unknown flag: --foo
125

**126** 无法调用 * 容器命令 *

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

**127** 找不到 * 容器命令 *

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

**退出代码** * 容器命令 * 退出代码

$ podman run busybox /bin/sh -c 'exit 3'; echo $?
3

示例

以只读模式运行容器

在容器映像开发期间,容器通常需要写入映像内容。例如,将软件包安装到 * / usr * 中。在生产环境中,应用程序很少需要写入映像。如果容器应用程序需要写入文件系统,则会写入卷。可以使用 **--read-only** 开关以只读模式运行应用程序,使其更安全。这可以保护容器的映像免遭修改。默认情况下,只读容器可以写入临时数据。Podman 在容器内的 * / run * 和 * / tmp * 上挂载 tmpfs。

$ podman run --read-only -i -t fedora /bin/bash

如果容器不写入容器内的任何文件系统,包括 tmpfs,请设置 --read-only-tmpfs=false。

$ podman run --read-only --read-only-tmpfs=false --tmpfs /run -i -t fedora /bin/bash

使用通配符将容器内的共享库公开为只读

$ podman run --mount type=glob,src=/usr/lib64/libnvidia\*,ro=true -i -t fedora /bin/bash

将容器的日志消息公开到主机的日志

绑定挂载 * / dev / log * 目录,以便在容器中记录的消息显示在主机的 syslog / journal 中。

$ podman run -v /dev/log:/dev/log -i -t fedora /bin/bash

从容器内部测试这一点,方法是向日志发送一条消息。

(bash)# logger "Hello from my container"

然后退出并检查日志。

(bash)# exit

$ journalctl -b | grep Hello

这将列出发送到记录器的消息。

从 STDIN、STDOUT、STDERR 中附加一个或多个

不指定 **-a** 选项,Podman 会附加所有内容(stdin、stdout、stderr)。通过指定 -a(stdin、stdout、stderr)来覆盖默认值,例如

$ podman run -a stdin -a stdout -i -t fedora /bin/bash

在容器之间共享 IPC

使用 **shm_server.c**,可在此处获取:https://www.cs.cf.ac.uk/Dave/C/node27.html

测试 **--ipc=host** 模式

主机显示一个具有 7 个 pid 附加的共享内存段,恰好来自 httpd

$ sudo ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x01128e25 0          root       600        1000       7

现在运行一个常规容器,它正确地**不**看到来自主机的共享内存段

$ podman run -it shm ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

使用新的 **--ipc=host** 选项运行容器,现在它可以看到来自主机 httpd 的共享内存段

$ podman run -it --ipc=host shm ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x01128e25 0          root       600        1000       7

测试 **--ipc=container:**id 模式

启动一个容器,其中包含一个程序来创建一个共享内存段

$ podman run -it shm bash
$ sudo shm/shm_server &
$ sudo ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x0000162e 0          root       666        27         1

创建一个第二个容器,它正确地显示没有来自第一个容器的共享内存段

$ podman run shm ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

使用 **--ipc=container:**id 选项创建第三个容器,现在它显示了来自第一个容器的共享内存段

$ podman run -it --ipc=container:ed735b2264ac shm ipcs -m
$ sudo ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x0000162e 0          root       666        27         1

为外部使用映射端口

可以使用 **-p** 标志将应用程序的公开端口映射到主机端口。例如,可以使用以下命令将 httpd 端口 80 映射到主机端口 8080

$ podman run -p 8080:80 -d -i -t fedora/httpd

挂载外部卷

要将主机目录作为容器卷挂载,请指定目录的绝对路径和容器目录的绝对路径,用冒号分隔。如果源是 Podman 维持的命名卷,建议使用其名称而不是卷的路径。否则,该卷将被视为孤儿,并将被 **podman volume prune** 命令清除

$ podman run -v /var/db:/data1 -i -t fedora bash

$ podman run -v data:/data2 -i -t fedora bash

$ podman run -v /var/cache/dnf:/var/cache/dnf:O -ti fedora dnf -y update

如果容器需要容器内非 root 用户可以写入的挂载卷,请使用 **U** 选项。此选项告诉 Podman 将源卷的 chown 更改为与容器内使用的默认 UID 和 GID 相匹配。

$ podman run -d -e MARIADB_ROOT_PASSWORD=root --user mysql --userns=keep-id -v ~/data:/var/lib/mysql:Z,U mariadb

或者,如果容器需要容器内非 root 用户可以写入的卷,则 --userns=keep-id 选项允许用户将执行 Podman 的用户的 UID 和 GID 指定为容器内的特定 UID 和 GID。由于在容器中运行的进程以用户的 UID 运行,因此它们可以读取/写入用户拥有的文件。

$ podman run -d -e MARIADB_ROOT_PASSWORD=root --user mysql --userns=keep-id:uid=999,gid=999 -v ~/data:/var/lib/mysql:Z mariadb

使用 **--mount** 标志将主机目录作为容器文件夹挂载,请指定目录的绝对路径或卷名,以及容器目录内的绝对路径

$ podman run --mount type=bind,src=/var/db,target=/data1 busybox sh

$ podman run --mount type=bind,src=volume-name,target=/data1 busybox sh

使用 SELinux 时,请注意主机不了解容器 SELinux 策略。因此,在上面的示例中,如果 SELinux 策略被强制执行,则 * / var / db * 目录无法写入容器。出现“权限被拒绝”消息,并且 **avc:** 消息将添加到主机的 syslog 中。

要解决此问题,在编写此手册页时,需要运行以下命令才能将正确的 SELinux 策略类型标签附加到主机目录

$ chcon -Rt svirt_sandbox_file_t /var/db

现在,允许写入容器中的 * / data1 * 卷,更改将在主机的 * / var / db * 中反映出来。

使用替代安全标签

通过指定 **--security-opt** 标志来覆盖每个容器的默认标签方案。例如,指定 MCS/MLS 级别(MLS 系统的要求)。在以下命令中指定级别允许在容器之间共享相同的内容。

podman run --security-opt label=level:s0:c100,c200 -i -t fedora bash

MLS 示例可能是

$ podman run --security-opt label=level:TopSecret -i -t rhel7 bash

要禁用此容器的安全标签,而不是使用

**--permissive** 标志,请使用以下命令:

$ podman run --security-opt label=disable -i -t fedora bash

通过为容器指定替代类型来收紧容器内进程的安全策略。例如,通过执行以下命令来运行一个容器,该容器只允许监听 Apache 端口

$ podman run --security-opt label=type:svirt_apache_t -i -t centos bash

请注意,必须编写定义 **svirt_apache_t** 类型的 SELinux 策略。

要屏蔽容器中其他特定路径,请使用 **--security-opt** 标志,并使用冒号分隔路径,使用 **mask** 选项指定路径。

$ podman run --security-opt mask=/foo/bar:/second/path fedora bash

要取消屏蔽默认情况下被屏蔽的所有路径,请将 **unmask** 选项设置为 **ALL**。或者,要只取消屏蔽特定路径,请如上所述使用 **mask** 选项指定路径。

$ podman run --security-opt unmask=ALL fedora bash

要取消屏蔽所有以 / proc 开头的路径,请将 **unmask** 选项设置为 ** / proc / ** *。

$ podman run --security-opt unmask=/proc/* fedora bash
$ podman run --security-opt unmask=/foo/bar:/sys/firmware fedora bash

通过 **--blkio-weight-device** 标志设置设备权重。

$ podman run -it --blkio-weight-device "/dev/sda:200" ubuntu

使用带有管道输入的 podman 容器

$ echo "asdf" | podman run --rm -i --entrypoint /bin/cat someimage
asdf

设置自动用户命名空间分离的容器

# podman run --userns=auto:size=65536 ubi8-micro cat /proc/self/uid_map
0 2147483647      65536
# podman run --userns=auto:size=65536 ubi8-micro cat /proc/self/uid_map
0 2147549183      65536

设置命名空间内核参数(Sysctls)

**--sysctl** 在容器中设置命名空间内核参数(sysctls)。例如,要打开容器网络命名空间中的 IP 转发,请运行以下命令

$ podman run --sysctl net.ipv4.ip_forward=1 someimage

请注意,并非所有 sysctls 都是命名空间的。Podman 不支持在容器内部更改也修改主机系统的 sysctls。随着内核的演变,我们预计将看到更多 sysctls 成为命名空间的。

有关当前支持的 sysctls 列表,请参阅上述 **--sysctl** 选项的定义。

在新的用户命名空间中设置 UID/GID 映射

在新的用户命名空间中运行容器需要将主机上的 UID 和 GID 进行映射。

$ podman run --uidmap 0:30000:7000 --gidmap 0:30000:7000 fedora echo hello

从命令行配置存储选项

Podman 允许通过更改 /etc/container/storage.conf 中的值或使用全局选项来配置存储。这展示了如何使用全局选项为 busybox 的一次性运行设置和使用 fuse-overlayfs。

podman --log-level=debug --storage-driver overlay --storage-opt "overlay.mount_program=/usr/bin/fuse-overlayfs" run busybox /bin/sh

在容器中配置时区

$ podman run --tz=local alpine date
$ podman run --tz=Asia/Shanghai alpine date
$ podman run --tz=US/Eastern alpine date

添加依赖容器

第一个容器 container1 不会在初始时启动,但必须在 container2 启动之前运行。 podman run 命令会在启动 container2 之前自动启动该容器。

$ podman create --name container1 -t -i fedora bash
$ podman run --name container2 --requires container1 -t -i fedora bash

可能需要多个容器。

$ podman create --name container1 -t -i fedora bash
$ podman create --name container2 -t -i fedora bash
$ podman run --name container3 --requires container1,container2 -t -i fedora bash

配置保留辅助组以访问卷

$ podman run -v /var/lib/design:/var/lib/design --group-add keep-groups ubi8

使用 personality 标志配置容器的执行域

$ podman run --name container1 --personality=LINUX32 fedora bash

运行一个容器,其中外部 rootfs 以覆盖的方式挂载

$ podman run --name container1 --rootfs /path/to/rootfs:O bash

在容器中处理 Java 应用程序中的时区。

为了在容器中运行 Java 应用程序时使用 UTC 之外的时区,必须在容器中设置 TZ 环境变量。Java 应用程序会忽略使用 --tz 选项设置的值。

# Example run
podman run -ti --rm  -e TZ=EST mytzimage
lrwxrwxrwx. 1 root root 29 Nov  3 08:51 /etc/localtime -> ../usr/share/zoneinfo/Etc/UTC
Now with default timezone:
Fri Nov 19 18:10:55 EST 2021
Java default sees the following timezone:
2021-11-19T18:10:55.651130-05:00
Forcing UTC:
Fri Nov 19 23:10:55 UTC 2021

运行一个连接到两个网络(名为 net1 和 net2)的容器,并使用静态 IP

$ podman run --network net1:ip=10.89.1.5 --network net2:ip=10.89.10.10 alpine ip addr

无根容器

Podman 在大多数系统上以非 root 用户身份运行。此功能要求安装新的 shadow-utils 版本。shadow-utils 包必须包含 newuidmap(1) 和 newgidmap(1) 可执行文件。

为了让用户运行无根容器,必须在 /etc/subuid/etc/subgid 中为他们的用户名添加一个条目,该条目列出了其用户命名空间的 UID。

如果安装了 fuse-overlayfs 和 slirp4netns 包,无根 Podman 的运行效果会更好。fuse-overlayfs 包提供了一个用户空间覆盖存储驱动程序,否则用户需要使用 vfs 存储驱动程序,它可能会占用大量磁盘空间,并且性能不如其他驱动程序。

要启用容器上的 VPN,需要指定 slirp4netns 或 pasta;如果没有指定,则需要使用 --network=host 标志运行容器。

环境

可以使用多种不同的选项在容器内设置环境变量,其优先级顺序如下(后面的条目会覆盖前面的条目)

  • 容器镜像:容器镜像中指定的任何环境变量。

  • --http-proxy:默认情况下,主机上的几个环境变量会被传递进来,例如 http_proxyno_proxy。有关详细信息,请参见 --http-proxy

  • --env-host:添加执行 Podman 的进程的主机环境。

  • --env-file:通过 env-files 指定的任何环境变量。如果指定了多个文件,则它们会按照条目顺序覆盖彼此。

  • --env:指定的任何环境变量会覆盖之前的设置。

运行容器并设置以 * 结尾的环境。只有在没有指定值的情况下,尾部 * 通配符功能才会生效。

$ export ENV1=a
$ podman run --env 'ENV*' alpine env | grep ENV
ENV1=a
$ podman run --env 'ENV*=b' alpine env | grep ENV
ENV*=b

CONMON

当 Podman 启动容器时,它实际上会执行 conmon 程序,然后 conmon 程序会执行 OCI 运行时。Conmon 是容器监视器。它是一个小程序,其工作是监视容器的主进程,如果容器死亡,则保存退出代码。它还会保持打开容器的 tty,以便以后可以附加到它。这就是 Podman 可以在分离模式(后台)下运行的原因,因此 Podman 可以退出,而 conmon 继续运行。每个容器都有自己的 conmon 实例。Conmon 等待容器退出,收集并保存退出代码,然后启动 Podman 进程以通过关闭网络和存储来完成容器清理。有关 conmon 的更多信息,请参见 conmon(8) 手册页。

文件

/etc/subuid

/etc/subgid

注意:使用环境变量 TMPDIR 更改下载的容器镜像的临时存储位置。Podman 默认使用 /var/tmp

另请参见

podman(1), podman-save(1), podman-ps(1), podman-attach(1), podman-pod-create(1), podman-port(1), podman-start(1), podman-kill(1), podman-stop(1), podman-generate-systemd(1), podman-rm(1), subgid(5), subuid(5), containers.conf(5), systemd.unit(5), setsebool(8), slirp4netns(1), pasta(1), fuse-overlayfs(1), proc(5), conmon(8), personality(2)

故障排除

有关常见问题的解决方案,请参见 podman-troubleshooting(7)

有关无根问题的解决方案,请参见 podman-rootless(7)

历史

2018 年 9 月,由 Kunal Kushwaha <[email protected]> 更新。

2017 年 10 月,由 Dan Walsh 为 Podman 从 Docker 文档转换为 Podman <[email protected]>

2015 年 11 月,由 Sally O’Malley 更新 <[email protected]>

2014 年 6 月,由 Sven Dowideit 更新 <[email protected]>

2014 年 4 月,最初由 William Henry 编写 <[email protected]>,基于 docker.com 源材料和内部工作。

脚注

1:Podman 项目致力于包容性,这是开源的核心价值观。这里使用的 masterslave 挂载传播术语是有问题的,而且具有争议性,需要更改。但是,这些术语目前在 Linux 内核中使用,必须在当前情况下按原样使用。当内核维护者纠正这种用法时,Podman 将立即效仿。