NAME

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

SYNOPSIS

podman run [options] image [command [arg ...]]

podman container run [options] image [command [arg ...]]

DESCRIPTION

在新容器中运行进程。 podman run 使用自己的文件系统、自己的网络和自己的隔离进程树启动进程。这个 image 该进程可以定义与将在容器中运行的进程、要公开的网络等相关的缺省值,但是 podman run 将最终控制权交给从图像启动容器的操作员或管理员。出于这个原因, podman run 比任何其他 Podman 命令都有更多的选项。

如果 image 那么尚未加载 podman run 将拉动 image, 和所有图像依赖项,从存储库中以相同的方式运行 podman pull image, 然后从该图像启动容器。

将在容器中自动创建几个文件。这些措施包括 /etc/hosts, /etc/hostname, 和 /etc/resolv.conf 管理网络。这些文件将基于主机的文件版本,但可以使用选项进行定制(例如, --dns 将覆盖创建的 resolv.conf) 。此外,在每个容器中创建容器环境文件,以向程序指示它们正在容器中运行。此文件位于 /run/.containerenv (或 /var/run/.containerenv 对于FreeBSD容器)。使用--Privileged标志时,.tainerenv包含名称/值对,指示容器引擎版本、引擎是否在无根模式下运行、容器名称和ID以及容器所基于的映像名称和ID。注: /run/.containerenv 在/Run上装入卷时不会创建。

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

默认设置在中定义 containers.conf 。远程连接的大多数设置都使用服务器tainers.conf,手册页中记录的情况除外。

IMAGE

使用TRANSPORT:PATH格式指定图像。如果未指定传输,则 docker (容器注册表)默认使用传输。对于远程Podman,包括Mac和Windows(不包括WSL2)计算机, docker 是唯一允许的交通工具。

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

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

docker:// docker-ference(默认)存储在远程容器镜像注册表中的镜像引用。例如:“quay.io/podman/STRATE:LATE”。该引用可以包括指向特定注册表的路径;如果没有,则查询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: path [:docker-reference] 中存储的图像 docker save 格式化的文件。 docker-reference 仅在创建此类文件时使用,并且不能包含摘要。

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

docker-daemon: _docker-引用_中的图像 docker-reference 存储在停靠器守护程序内部存储器中的格式。这个 docker-reference 也可以是镜像ID(docker-daemon:algo:digest)。

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

oci-archive: path : _tag_目录中符合指定位置的“Open Container Image Layout Specification”的图像 path 并使用 tag.

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

OPTIONS

--add-host = hostname[;hostname[;...]] : ip

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

该选项需要将一个或多个以逗号分隔的主机名映射到单个IPv4或IPv6地址,用逗号分隔。它还可用于覆盖Podman添加的主机名的IP地址 /etc/hosts 默认情况下(另请参阅 --name--hostname 选项)。可以多次指定此选项以添加其他映射 /etc/hosts .海葬有违 --no-hosts 选择和冲突 no_hosts=truecontainers.conf .

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

host-gateway Podman还使用地址自动添加 host.containers.internalhost.docker.internal 主机名 /etc/hosts .您可以通过提供 --no-hosts 选项,或通过设置 host_containers_internal_ip="none"containers.conf .如果没有 host-gateway 地址是手动配置的,并且Podman无法自动确定IP地址,Podman将悄悄跳过将这些内部主机名添加到 /etc/hosts .如果Podman在虚拟机中运行 podman machine (this包括Mac和Windows主机),Podman将悄悄跳过将内部主机名添加到 /etc/hosts ,除非手动配置IP地址;内部主机名由gvpro DNS解析程序解析。

波德曼将使用 /etc/hosts 默认情况下,主机的文件作为基础,即该文件中存在的任何主机名也将存在于 /etc/hosts 容器的文件。可以使用配置不同的基本文件 base_hosts_file 配置入 containers.conf .

--annotation = key=value

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

--arch = ARCH

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

--attach-a = stdin | stdout | stderr

附着到STDIN、STDOUT或STDERR。

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

--authfile = path

身份验证文件的路径。缺省值为 ${XDG_RUNTIME_DIR}/containers/auth.json 在Linux上,以及 $HOME/.config/containers/auth.json 在Windows/MacOS上。该文件由创建 podman login 。如果在那里找不到授权状态, $HOME/.docker/config.json 被选中,它是使用 docker login

注意:还可以通过设置 REGISTRY_AUTH_FILE 环境变量这可以通过以下方式完成 export REGISTRY_AUTH_FILE=path

--blkio-weight = 重量

数据块IO相对权重。这个 weight 是介于 101000

Cgroup V1无根系统不支持此选项。

--blkio-weight-device = device:weight

数据块IO相对设备权重。

--cap-add = 能力

添加Linux功能。

授予额外的功能会增加容器内运行的进程的特权,并可能使其突破限制。 等能力 CAP_SYS_ADMIN , CAP_SYS_PTRACE , CAP_MKNODCAP_SYS_MODULE 当它们不在用户命名空间内使用时,尤其危险。 请参阅 user_namespaces(7) 以更详细地解释用户名称空间和功能之间的交互。

在添加任何功能之前,请审查其安全影响,并确保其对于容器的功能确实是必要的。 看到 capabilities(7) for more information.

--cap-drop = 能力

放弃Linux功能。

--cgroup-conf = KEY=VALUE

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

--cgroup-parent = path

在其下创建容器的cgroup的cgroup的路径。如果该路径不是绝对路径,则该路径被视为相对于初始化进程的cgroup路径。如果Cgroup尚不存在,则会创建它们。

--cgroupns = mode

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

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

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

  • 私人 :创建新的cgroup命名空间。

  • ns: PATH:在指定路径下加入命名空间。

如果主机使用cgroup v1,则缺省值设置为 host 。在cgroup v2上,缺省值为 私人

--cgroups = how

确定容器是否创建CGGroup。

默认值为 已启用

这个 enabled 选项在cgroup-parent下创建一个新的cgroup。这个 disabled 选项强制容器不创建CGgroup,因此与cgroup选项( --cgroupns--cgroup-parent )。这个 no-conmon 选项仅禁用新的cgroup conmon 进程。这个 split 选项将当前cgroup拆分为两个子cgroup:一个用于conmon,一个用于容器有效负载。无法设置 --cgroup-parent 使用 split

--chrootdirs = path

容器内的目录的路径,该目录被视为 chroot 目录。挂载到根目录中的任何Podman管理的文件(例如,/etc/Resolv.conf、/etc/hosts等/host name)也会挂载到该位置。多个目录之间用逗号分隔。

--cidfile = file

将容器ID写入 file 。文件随容器一起删除,除非与podman一起使用--在分离的容器上远程运行。

--conmon-pidfile = file

写下 召唤 进程转换为文件。AS 召唤 在与Podman不同的进程中运行,这在使用system d重新启动Podman容器时是必需的。(此选项不适用于远程Podman客户端,包括Mac和Windows(不包括WSL2)计算机)

--cpu-period = 限制

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

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--cpu-quota = 限制

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

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

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--cpu-rt-period = 微秒级

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

限制容器的实时CPU使用率。该选项告诉内核将容器的实时CPU使用率限制在指定的时间段内。

此选项仅在cgroup V1 Rootful系统上受支持。

--cpu-rt-runtime = 微秒级

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

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

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

此选项仅在cgroup V1 Rootful系统上受支持。

--cpu-shares-c = 股票

CPU占有率(相对权重)。

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

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

例如,假设有三个容器,其中一个的CPU份额为1024,另外两个的CPU份额设置为512。当所有三个容器中的进程尝试使用100%的CPU时,第一个容器获得总CPU时间的50%。如果添加的第四个容器的CPU份额为1024,则第一个容器仅获得33%的CPU。其余容器分别获得16.5%、16.5%和33%的CPU。

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

例如,假设一个系统有三个以上的核心。如果容器 C0 开头是 --cpu-shares=512 运行一个进程和另一个容器 C1 使用 --cpu-shares=1024 运行两个进程时,这可能会导致以下CPU份额划分:

PID

容器

CPU

CPU占有率

100

C0

0

100%CPU0

101

C1

1

CPU1的100%

102

C1

2

CPU2的100%

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--cpus =

CPU数量。缺省值为 0.0 这意味着没有限制。这是以下的速记 --cpu-period--cpu-quota ,因此不能使用指定该选项 --cpu-period--cpu-quota

在某些系统上,可能不允许非超级用户更改CPU限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--cpuset-cpus =

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

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--cpuset-mems = 节点

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

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

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--decryption-key = [Key[:密码短语]]

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

--detach-d

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

在任何时间运行 podman ps 在另一个Shell中查看运行容器的列表。使用重新连接到分离的容器 podman attach 指挥部。

当通过tty模式连接时,使用可配置的按键顺序从容器分离(并保持其运行)。默认序列为 ctrl-p,ctrl-q 。属性指定键序列。 --detach-keys 选项,或在 containers.conf 文件:请参阅 containers.conf(5) 以获取更多信息。

--detach-keys = 序列

指定拆卸容器的按键顺序。格式为单字符 [a-Z] or one or more ctrl-<value> characters where <value> is one of: a-z, @, ^, [, , or _ 。指定“”将禁用此功能。缺省值为 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=真

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

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

将规则添加到cgroup允许的设备列表。该规则应采用Linux内核文档中指定的格式 [admin-guide/cgroup-v1/devices] (https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/devices.html):

  • typea (所有), c (字符),或 b (阻止);

  • majorminor :一个数字,或 * 为所有人服务;

  • mode :组成: r (阅读), w (写入),以及 m (mnud(2))。

--device-read-bps = path:rate

限制设备的读取速率(以字节/秒为单位)(例如 --device-read-bps=/dev/sda:1mb )。

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--device-read-iops = path:rate

限制设备的读取速率(以每秒IO操作数为单位)(例如 --device-read-iops=/dev/sda:1000 )。

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--device-write-bps = path:rate

限制设备的写入速率(以字节/秒为单位)(例如 --device-write-bps=/dev/sda:1mb )。

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--device-write-iops = path:rate

限制设备的写入速率(以每秒IO操作数为单位)(例如 --device-write-iops=/dev/sda:1000 )。

在某些系统上,可能不允许非超级用户更改资源限制。欲了解更多详情,请访问https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

Cgroup V1无根系统不支持此选项。

--disable-content-trust

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

--dns = IP地址

设置自定义的DNS服务器。

此选项可用于覆盖传递给容器的DNS配置。通常这在主机DNS配置对于容器无效时是必要的(例如, 127.0.0.1 )。在这种情况下, --dns 旗帜对于每一次跑步都是必要的。

特殊的价值 none 可以指定为禁用创建 /etc/resolv.conf 在波德曼的集装箱里。这个 /etc/resolv.conf 在没有更改的情况下使用图像中的文件。

此选项不能与 --network 它被设置为 nonecontainer:id.

--dns-option = 选项

设置自定义的DNS选项。如果使用则无效 --dns-option 使用 --network 它被设置为 nonecontainer:id.

--dns-search =

设置自定义DNS搜索域。如果使用则无效 --dns-search 使用 --network 它被设置为 nonecontainer:id. 使用 --dns-search=. 要删除搜索域,请执行以下操作。

--entrypoint = “命令” | [‘[“命令”,“arg1”,...]’]

覆盖图像中的默认入口点。

映像的入口点类似于命令,因为它指定容器启动时要运行的可执行文件,但它(故意)更难覆盖。入口点为容器提供其默认性质或行为。当设置入口点时,容器就像它是该二进制文件一样运行,并带有默认选项。可以通过该命令传入更多选项。但是,如果用户想要在容器内运行其他内容, --entrypoint 选项允许指定新的入口点。

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

--env-e = env

设置环境变量。

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

看见 [Environment] (#Environment)下面的说明了解优先顺序和示例。

--env-file = file

读入以行分隔的环境变量文件。

看见 [Environment] (#Environment)下面的说明了解优先顺序和示例。

--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 ).该协议可以 tcp , udpsctp 如果没有给出 tcp 假设。此选项与图像构建的EXPOSE指令相匹配,并且对实际的网络规则没有影响,除非 -P/--publish-all 用于从随机主机端口转发到所有暴露的端口。要将特定端口从主机转发到容器,请使用 -p/--publish 相反,选项。

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

使用提供的GID映射在新的用户命名空间中运行容器。此选项与 --userns--subgidname 选择。此选项提供了一种将主机GID映射到容器GID的方法,其方式与 --uidmap 将主机UID映射到容器UID。有关详情,请参阅 --uidmap.

注: --gidmap 选项不能与 --pod 在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

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

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

--health-cmd = “命令” | [‘[“命令”,“arg1”,...]’]

设置或更改容器的运行状况检查命令。该命令是在容器内执行的确定容器健康的命令。要应用其他运行状况检查选项,该命令是必需的。价值为 none 禁用现有运行状况检查。

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

注意:即使在图像中配置了健康检查,也会使用默认值。

--health-interval = 间隔

设置运行状况检查的间隔。一个 interval禁用 导致不会自动设置计时器。默认为 30s

注意:此参数将覆盖图像中的相关健康检查配置。

--health-log-destination = directory_path

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

  • local :(默认)HealthCheck日志存储在覆盖容器中。(For例如: $runroot/healthcheck.log )

  • directory :创建一个名为 <container-ID>-healthcheck.log HealthCheck日志位于指定目录中。

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

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

在HealthCheck日志文件中设置最大尝试次数。(“0”值意味着日志文件中的尝试次数无限)(默认:5次尝试)

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

设置存储的HealthCheck日志的最大字符长度。(“0”值意味着日志长度无限)(默认:500个字符)

--health-on-failure = action

容器转换到不正常状态后要执行的操作。缺省值为 none

  • none :不采取行动。

  • kill :杀死集装箱。

  • restart :重启容器。请不要将 restart 使用 --restart 旗帜。当在system d单元内运行时,请考虑使用 killstop 操作,以利用systemd的重启策略。

  • stop :停止集装箱。

--health-retries = 重试

在运行状况检查被视为不健康之前允许的重试次数。默认值为 3

注意:此参数可以覆盖图像中的健康检查配置。

--health-start-period = 期间

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

注意:只要启动容器,就会执行健康检查命令,如果健康检查成功,容器的健康状态将更新为 healthy 。但是,如果运行状况检查失败,则运行状况状态将保持为 starting 直到运行状况检查成功或直到 --health-start-period 时间到了。如果运行状况检查命令在 --health-start-period 时间已过,健康状态将更新为 unhealthy 。运行状况检查命令根据的值定期执行 --health-interval

注意:此参数将覆盖图像中的相关健康检查配置。

--health-startup-cmd = "command" | '["command", "arg1", ...]'

为容器设置启动运行状况检查命令。该命令在容器内执行,用于控制常规的运行状况检查。启动命令成功后,将开始定期运行状况检查,并停止启动运行状况检查。或者,如果命令在设定的尝试次数后失败,容器将重新启动。启动健康检查可用于确保启动期延长的容器在完全启动之前不会被标记为不健康。启动运行状况检查只能在常规运行状况检查(从容器的映像或 --health-cmd 选项)也被设置。

--health-startup-interval = interval

设置启动运行状况检查的间隔。一个 intervaldisable 导致不会自动设置计时器。缺省值为 30s

--health-startup-retries = retries

在启动运行状况检查重新启动容器之前允许的尝试次数。如果设置为 0 ,容器永远不会重新启动。缺省值为 0

--health-startup-success = retries

启动运行状况检查成功并开始常规运行状况检查之前所需的成功运行次数。价值为 0 意味着任何成功都是定期健康检查的开始。缺省值为 0

--health-startup-timeout = timeout

启动运行状况检查命令在标记为失败之前必须完成的最长时间。该值可以用如下所示的时间格式表示 2m3s 。缺省值为 30s

--health-timeout = 超时

在间隔被视为失败之前允许完成运行状况检查的最长时间。与Start-Period类似,该值可以用如下所示的时间格式表示 1m22s 。默认值为 30s

注意:超时将健康检查标记为失败。如果healthcheck命令本身运行的时间超过指定的 timeout ,将发送一个 SIGKILL 信号了

注意:此参数将覆盖图像中的相关健康检查配置。

--help

打印用法报表

--hostname-h = name

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

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

--hosts-file = path | none | image

用于创建 /etc/hosts 容器内的文件。这必须是主机系统上某个文件的绝对路径,或者是以下特殊标志之一: "" 遵循 base_hosts_file 配置 containers.conf (the默认) none 不要使用基本文件(即从空文件开始) image 使用容器图像的 /etc/hosts 文件作为基文件

--hostuser = name

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

--http-proxy

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

默认为 true

--image-volume = bind | tmpfs | ignore

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

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

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

  • 忽略 :所有卷都被忽略,不采取任何操作。

--init

在容器内运行一个init,用于转发信号和获取进程。容器初始二进制文件挂载在 /run/podman-init 。安装在 /run 中断容器执行。

--init-path = path

容器初始化二进制文件的路径。

--interactive-i

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

如果已附加,stdin将通过管道传输到包含的进程。如果已分离,读取标准输入将被阻止,直到稍后连接。

Caveat: 一旦stdin的输入可用,Podman就会立即使用它,即使包含的进程没有请求它。

--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 选项,为每个选项指定一个静态IPv6地址 ip6 该选项的模式。

--ipc = ipc

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

  • “”:使用Podman的默认设置,在tainers.conf中定义。

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

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

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

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

  • private :私有IPC命名空间。

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

--label-l = key=value

将元数据添加到容器。

--label-file = file

读入以行分隔的标签文件。

--log-driver = driver

容器的日志记录驱动程序。目前可用的选项有 k8s-filejournaldnonepassthroughpassthrough-ttyjson-file 别名为 k8s-file 用于脚本兼容性。(默认 journald )。

下面的podman info命令显示系统的默认日志驱动程序。

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

这个 通过 驱动程序将标准流(stdin、stdout、stderr)向下传递到容器。远程Podman客户端(包括Mac和Windows(不包括WSL2)计算机)以及TTY上不允许存在该漏洞,因为它容易受到通过TIOCSTI的攻击。

这个 passthrough-tty 驱动程序与 passthrough 除了它还允许在TTY上使用它,如果用户真的想要它的话。

--log-opt = name=value

记录驱动程序特定选项。

设置自定义日志记录配置。以下是 name 支持:

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地址必须唯一。根据RFC4862,IPv6本地链路地址基于设备的MAC地址。

若要为每个容器指定多个静态MAC地址,请使用 --network 选项,为每个选项指定静态MAC地址 mac 该选项的模式。

--memory-m = number[unit]

内存限制。一个 unitb (字节), k (千比字节), m (兆字节),或 g (千兆字节)。

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

Cgroup V1无根系统不支持此选项。

--memory-reservation = number[unit]

内存软限制。一个 unitb (字节), k (千比字节), m (兆字节),或 g (千兆字节)。

设置内存预留后,当系统检测到内存争用或内存不足时,会强制容器将其消耗限制为其预留。因此,请始终将该值设置为 --memory ,否则以硬限制为准。默认情况下,内存预留与内存限制相同。

Cgroup V1无根系统不支持此选项。

--memory-swap = number[unit]

一个等于内存加交换空间的限制值。一个 unitb (字节), k (千比字节), m (兆字节),或 g (千兆字节)。

必须与 -m ( --memory )旗帜。参数值必须大于 -m ( --memory )默认情况下,它被设置为值的两倍 --memory

设置 number-1 以启用无限制交换。

Cgroup V1无根系统不支持此选项。

--memory-swappiness =

调整容器的内存交换行为。接受介于以下范围的整数 0100

此标志仅在cgroup V1 Rootful系统上受支持。

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

将文件系统安装到容器。

当前支持的安装类型包括 artifact , bind , devpts , glob , image , ramfs , tmpfsvolume .

所有装载类型通用的选项:

  • src , source :装载源规范 bind , glob ,而且 volume .强制 artifact , bind , glob , imagevolume .

  • dstdestinationtarget :装载目标规范。

如果指定的源GLOB没有目标目录,则文件和目录将使用其在容器中的完整路径进行挂载。指定目标后,将装载与目标目录上的基本文件名上的GLOB匹配的文件和目录。该选项 type=glob,src=/foo*,destination=/tmp/bar 通知容器引擎将匹配/foo*的主机文件挂载到容器中的/tmp/bar/目录。

特定于类型的选项= artifact :

  • digest :如果工件源包含多个blob,则可以指定摘要仅用摘要装载一个特定的blob。

  • title :如果工件源包含多个斑点,可以设置一个标题,并与之进行比较 org.opencontainers.image.title 注释。

src 参数包含工件的名称,该名称必须已经在本地存在。的 dst 如果容器中的路径是目录或不存在blob标题,则参数包含目标路径 (org.opencontainers.image.title 注释)将用作文件名并连接到路径。如果注释不存在,则摘要将用作文件名。这导致工件的所有斑点都以给定路径安装到容器中。

但如果 dst 路径是容器中的现有文件,那么blob将直接装载到该文件上。这仅在工件包含单个blob或两者之一时起作用 digesttitle 已指定。

特定于类型的选项= volume

  • roreadonlytruefalse (如果未指定,则默认为: false )。

  • Uchowntruefalse (如果未指定,则默认为: false )。根据容器的UID和GID递归更改源卷的所有者和组。

  • idmap :如果指定,请在容器中创建到目标用户命名空间的idmapping装载。Podman仅在根模式下支持idmap选项。Linux内核不允许无特权用户使用idmapped文件系统。idmap选项支持自定义映射,该映射可以与容器使用的用户命名空间不同。可以在idmap选项之后指定映射,例如: idmap=uids=0-1-10#10-11-10;gids=0-100-10 . 对于每个三重组,第一个值是映射到主机上第二个值的备份文件系统ID的开始。 此映射的长度在第三个值中给出。多个范围以#分隔。 如果指定的映射前置有“@”,则相对于容器用户命名空间来考虑该映射。映射的主机ID会更改以考虑容器用户在容器用户命名空间中的相对位置。

特定于类型的选项= image

  • rwreadwritetruefalse (如果未指定,则默认为: false )。

  • subpath :仅安装图像内的特定路径,而不是整个图像。

特定于以下项的选项 bindglob

  • roreadonlytruefalse (如果未指定,则默认为: false )。

  • bind-propagationsharedslaveprivateunbindablersharedrslaverunbindable ,或 rprivate (默认)。 [[1] ](#Footnote 1)另见mount(2)。

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

  • relabelsharedprivate

  • idmap : truefalse (如果未指定,默认为: false ). 如果为true,则在容器中创建到目标用户命名空间的idmapped挂载。Podman仅在根模式下支持idmap选项。

  • Uchowntruefalse (如果未指定,则默认为: false )。根据容器的UID和GID递归更改源卷的所有者和组。

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

特定于类型的选项= tmpfsramfs

  • roreadonlytruefalse (如果未指定,则默认为: false )。

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

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

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

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

  • Uchowntruefalse (如果未指定,则默认为: false )。根据容器的UID和GID递归更改源卷的所有者和组。

特定于类型的选项= 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=artifact,src=quay.io/libpod/testartifact:20250206-single,dst=/data

  • type=artifact,src=quay.io/libpod/testartifact:20250206-multi,dst=/data,title=test1

--name = name

为容器指定一个名称。

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

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

  • UUID短标识(“f78375b1c487”);

  • 姓名(“约拿”)。

Podman为每个容器生成UID,如果没有为容器分配名称,则使用 --name ,Podman生成随机字符串名称。该名称可以作为一种更人性化的识别容器的方法。这适用于背景和前景容器。容器的名称也添加到 /etc/hosts 使用容器的主IP地址(另请参阅 --add-host 选项)。

--network = mode--net

设置容器的网络模式。

有效 mode 值包括:

  • [bridge[:OPTIONS,...]] :在默认网桥上创建网络堆栈。这是Rootful Containers的默认设置。可以指定以下附加选项:

    • alias= 名称:添加容器的网络范围别名。

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

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

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

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

    • host_interface_name= 名称:为容器外部创建的网络接口指定名称。

    任何其他选项都将未经验证而传递给netavark。这对于将参数传递给netavark插件可能很有用。

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

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

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

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

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

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

  • private :为容器创建新的命名空间。这使用了 bridge Rootful Containers和 slirp4netns 对于没有根基的人。

  • slirp4netns[:OPTIONS,...] :使用 slirp4netns (1)创建用户网络堆栈。可以指定这些附加选项,也可以设置为 network_cmd_options in containers. inf:

    • allow_host_loopback=true|false :允许illrp4netns到达主机环回IP(默认为10.0.2.2或更改后的illrp4netns CIDR子网中的第二个IP,请参阅下面的CIDR选项)。默认值为FALSE。

    • mtu= TU:指定要用于此网络的RTI。(默认为 65520 ).

    • cidr= CIDR:指定此网络使用的ip范围。(默认为 10.0.2.0/24 ).

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

    • outbound_addr= INTERFACE:指定sirp绑定到的传出接口(仅限ipv4流量)。

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

    • outbound_addr6= INTERFACE:指定sirp绑定到的传出接口(仅限ipv6流量)。

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

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

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

  • pasta[:OPTIONS,...]: use pasta(1) to create a user-mode networking stack.
    This is the default for rootless containers and only supported in rootless mode.
    By default, IPv4 and IPv6 addresses and routes, as well as the pod interface name, are copied from the host. Port forwarding preserves the original source IP address. Options described in pasta(1) can be specified as comma-separated arguments.
    In terms of pasta(1) options, --config-net is given by default, in order to configure networking when the container is started, and --no-map-gw is also assumed by default, to avoid direct access from container to host using the gateway address. The latter can be overridden by passing --map-gw in the pasta-specific options (despite not being an actual pasta(1) option).
    For better integration with DNS handling, --dns-forward 169.254.1.1 is passed, and this address is added to resolv.conf(5) as first resolver. It is possible to pass --dns-forward explicitly in case a different IP address should be used. To make the host.containers.internal /etc/hosts entry work and allow connections to the host, --map-guest-addr 169.254.1.2 is passed. Again, it can be set explicitly to choose a different IP address.
    Also, -t none and -u none are passed if, respectively, no TCP or UDP port forwarding from host to container is configured (via Podman's --publish or by passing the pasta -t/-u options directly), to disable automatic port forwarding based on bound ports. Similarly, -T none and -U none are given to disable the same functionality from container to host.
    All options can also be set in containers.conf(5); see the pasta_options key under the network section in that file.
    Some examples:

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

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

    • 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 ,相当于默认的glirp4netns(1)选项:禁用IPv6、分配 10.0.2.0/24 发送到 tap0 容器内接口,带网关 10.0.2.3 ,启用可在以下位置访问的DNS转发器 10.0.2.3 ,将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 ,相当于默认的glirp4netns(1)带有Podman覆盖的选项:与上面相同,但将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 = 别名

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

--no-healthcheck

禁用任何已定义的容器运行状况检查。

--no-hostname

不创建 /etc/hostname 文件放入容器中。

默认情况下,Podman管理 /etc/hostname 文件,添加容器自己的主机名。 当 --no-hostname 选项已设置,图像的 /etc/hostname 如果存在,将不加修改地保留。

--no-hosts

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

波德曼控制集装箱 /etc/hosts 默认情况下,文件并添加容器名称的条目(请参阅 --name 选项)和主机名(请参阅 --hostname 选项)、内部 host.containers.internalhost.docker.internal 主机,以及使用添加的任何主机名 --add-host 选项.参阅 --add-host 详细信息选项。通过 --no-hosts 禁用此功能,以便图像 /etc/hosts 文件保持未修改。通过设置,全球范围内也可以实现同样的目标 no_hosts=truecontainers.conf .

此选项与 --add-host

--oom-kill-disable

是否禁用容器的OOM Killer。

Cgroup V2系统不支持此标志。

--oom-score-adj = num

调整主机的容器的OOM首选项(接受来自 -10001000 )。

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

--os = OS

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

--passwd

当与--user选项结合使用时,允许Podman将条目添加到/etc/passwd和/etc/group。它用于覆盖Podman提供的用户设置,以支持诸如libnss-Extra用户之类的入口点配置。

--passwd-entry = ENTRY

自定义写入 /etc/passwd 在容器内放置文件时 --passwd 是使用的。

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

--personality = 人物角色

个性通过Linux个性设置执行域(2)。

--pid = mode

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

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

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

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

  • 私人 :为容器创建新的命名空间(默认)。

--pidfile = path

当指定了pidfile位置时,容器进程的id被写入到pidfile中。(此选项在远程Podman客户端上不可用,包括Mac和Windows(不包括WSL2)计算机)如果未指定pidfile选项,则容器进程的ID将写入/run/containers/storage/${storage-driver}-containers/$CID/userdata/pidfile.

启动容器后,可以通过以下命令发现pidfile的位置 podman inspect 命令:

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

--pids-limit = 限制

调整容器的PID限制。设置为 -1 为集装箱提供无限的PID。缺省值为 2048 在支持“PIDS”cgroup控制器的系统上。

--platform = OS/ARCH

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

--pod = name

在现有Pod中运行容器。如果Pod名称前面加上前缀,则Podman会自动生成Pod new: 。要使用更细粒度的选项创建Pod,请使用 podman pod create 命令,然后再创建容器。当容器与带有下容器的吊舱一起运行时,首先启动下容器。

--pod-id-file = file

在现有Pod中运行容器,并从指定的 file 。当容器在具有下容器的吊舱内运行时,下容器首先启动。

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

将扩展权限授予此容器。默认为 错误

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

特权容器关闭将容器与主机隔离的安全功能。删除的功能、有限的设备、只读装载点、Apparmor/SELinux分离和Seccomp筛选器都被禁用。由于禁用的安全功能,几乎不应该设置特权区域,因为容器很容易突破限制。

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

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

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

两者都有 hostPortcontainerPort 可以指定为端口范围。为这两个范围指定范围时,范围内的集装箱端口数必须与范围内的主机端口数匹配。

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

默认情况下,Podman发布TCP端口。若要改为发布UDP端口,请指定 udp 作为协议。要同时发布TCP和UDP端口,请设置 --publish 两次,带 tcp ,以及 udp 分别作为协议。Rootful容器还可以使用 sctp 协议。

不必指定主机端口(例如 podman run -p 127.0.0.1::80 )。如果不是,则随机为该集装箱端口分配主机上的一个端口。

使用 podman port 要查看实际映射,请执行以下操作: podman port $CONTAINER $CONTAINERPORT

请注意,网络驱动程序 macvlanipvlan 不支持端口转发,因此此选项对此类网络没有影响。

Note: 如果容器运行在实例中,则无需发布实例中容器的端口。端口只能由Pod本身发布。Pod网络堆栈的作用类似于主机上的网络堆栈-这意味着Pod中的各种容器和容器中的程序都共享单个接口、IP地址和关联的端口。如果一个容器绑定到一个端口,则当该端口正在使用时,其他任何容器都不能使用Pod内的该端口。Pod中的容器还可以通过将一个容器绑定到Pod中的本地主机,并将另一个容器连接到该端口来通过本地主机进行通信。

--publish-all-P

将所有暴露的端口发布到主机接口上的随机端口。默认为 错误

当设置为时 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设置容器在其中运行的服务类别(CLO或COS)。基于作为英特尔资源导向器技术(RDT)功能集一部分的缓存分配技术(CAT)功能,所有容器进程都将在预配置的COS中运行,代表缓存的一部分。必须使用伪文件系统创建和配置COS(通常安装在 /sys/fs/resctrl ),由REStrl内核驱动程序提供。将容器分配给COS需要根权限,因此在无根环境下不起作用。目前,该功能仅支持使用 runc 作为运行时。在为对象存储分配容器之前,创建对象存储的详细信息请参考https://docs.kernel.org/arch/x86/resctrl.html

--read-only

将容器的根文件系统挂载为只读。

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

--read-only-tmpfs

运行只读容器时,将读写tmpf挂载到 /dev, /dev/shm, /run, /tmp, 和 /var/tmp. 缺省值为 true

--只读

--只读-tmpfs

/

/run、/tmp、/var/tmp

真的

真的

读/写

读/写

真的

错误

读/写

读/写

错误

错误

读/写

读/写

错误

真的

读/写

读/写

什么时候 --read-only=true--read-only-tmpfs=true 其他tmpf挂载在/tmp、/run和/var/tmp目录中。

什么时候 --read-only=true--read-only-tmpfs=false /dev和/dev/shm标记为只读,没有tmpf挂载到/tmp、/run和/var/tmp上。这些目录是从基础图像中公开的,这意味着默认情况下它们是只读的。这使得容器完全是只读的。容器中不存在可写目录。在此模式下,需要通过外部卷或挂载添加可写目录。

默认情况下,当 --read-only=false 、/dev和/dev/shm是读/写目录,/tMP、/run和/var/tMP是容器镜像的读/写目录。

--replace

如果已存在具有相同名称的另一个容器,请替换并删除它。默认为 错误

--requires = container

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

--restart = 政策

重新启动策略以在容器退出时遵循。重新启动策略不会生效,如果通过 podman killpodman stop 命令。

有效 policy 值包括:

  • no :退出时不重新启动容器

  • never :同义词 no ;退出时不重新启动容器

  • on-failure[:max_retries] :当容器以非零退出代码退出时重新启动容器,无限期重试或直到可选的 max_retries 命中计数

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

  • unless-stopped :等同于 始终

Podman提供了一个系统单元文件podman-restart.service,它在系统重新启动后重新启动Containers。

在系统d服务中运行容器时,请使用系统d提供的重启功能。换句话说,不要在容器单位中使用此选项,而是将 Restart= 中的系统ID指令 [Service] 一节。看见 podman-systemd.unit (5)及 systemd.service (5)。

--retry = attempts

失败时在注册表和本地存储之间重试拉取或推送映像的次数。缺省值为 3

--retry-delay = duration

如果失败,在注册表和本地存储之间拉取或推送图像时,重试尝试之间的延迟持续时间。默认情况下,开始时间为两秒,然后以指数方式后退。设置此值时使用延迟,并且不会发生指数回退。

--rm

当容器退出时,自动删除该容器以及与该容器关联的任何匿名未命名卷。缺省值为 false

--rmi

退出容器后,除非另一个容器正在使用该图像,否则请将其移除。表示新容器上的--rm。缺省值为 false

--rootfs

如果指定,第一个参数将引用文件系统上的分解容器。

这对于在不需要任何镜像管理的情况下运行容器非常有用,假定容器的根文件系统是从外部管理的。

Overlay Rootfs Mounts

这个 :O 标志告诉Podman将rootfs路径中的目录装载为使用 overlay file system 。容器进程可以修改装载点内的内容,该装载点存储在容器存储中的单独目录中。在重叠术语中,源目录位于较低位置,容器存储目录位于较高位置。当容器完成执行时,对挂载点的修改将被销毁,这与卸载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,与SYSTEM d和Type=NOTIFY一起传递。

缺省值为 container 这意味着允许OCI运行时将套接字代理到容器中以接收就绪通知。Podman将MAINPID设置为COMON的PID。这个 conmon 选项将MAINPID设置为COMON的PID,并在容器启动时发送READY。套接字永远不会传递给运行库或容器。这个 healthy 选项将MAINPID设置为COMON的PID,并在容器恢复健康时发送READY;需要设置运行状况检查。套接字永远不会传递给运行库或容器。这个 ignore 选项从自身和子进程的环境中删除NOTIFY_SOCKET,用于Podman上面的其他进程使用NOTIFY_SOCKET而Podman不使用它的情况。

--seccomp-policy = 政策

指定策略以选择seccomp配置文件。如果设置为 image 中,Podman在容器映像配置中查找“io.tainers.seccom.profile”标签,并将其值用作seccomp配置文件。否则,波德曼就会遵循 default 策略:应用默认配置文件,除非通过 --security-opt seccomp 如下所述。

请注意,此功能是试验性的,将来可能会更改。

--secret = secret[,opt=opt ...]

为容器提供访问秘密的权限。可以多次指定。

秘密是容器在运行时需要但未存储在图像或源代码控制中的一大块敏感数据,例如用户名和密码、SSL证书和密钥、SSL密钥或其他重要的通用字符串或二进制内容(大小最大512 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 = 选项

安全选项

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

  • apparmor =Alternate-Profile:设置容器的设备限制配置文件

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

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

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

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

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

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

Note: Labeling can be disabled for all containers by setting label=false in the containers.conf (/etc/containers/containers.conf or $HOME/.config/containers/containers.conf) file.

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

  • mask =/Path/1:/Path/2:要屏蔽的路径用冒号分隔。无法在容器内访问掩码路径。

  • no-new-privileges :禁止容器进程通过 execve(2) 系统调用(例如通过setuid或setgid位,或通过文件功能)。依赖于在其可执行文件上设置的setuid/setgid位来更改用户ID或组ID的程序不再能够这样做,并且任何文件功能都添加到可执行文件中(例如通过 setcap )不会添加到允许的能力集中。有关更多详细信息,请参阅:https://docs.kernel.org/userspace-api/no_new_privs.html。

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

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

  • proc-opts =Options:用于/proc挂载的选项的逗号分隔列表。有关可能的装载选项的更多详细信息,请参阅 过程(5) 手册页。

  • unmask =_全部_或 /path/1:/path/2, 或Shell展开的路径(/proc/ *): Paths to unmask separated by a colon. If set to * ALL *, it unmasks all the paths that are masked or made read-only by default. The default masked paths are * /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 *. The default paths that are read-only are * /proc/asound *, * /proc/bus *, * /proc/fs *, * /proc/irq *, * /proc/sys *, * /proc/sysrq-trigger *, * /sys/fs/cgroup *。

注意:可以通过设置为所有容器禁用标签 label=falsecontainers.conf (5)归档。

--shm-size = number[unit]

大小 /dev/shm. A unitb (字节), k (千比字节), m (兆字节),或 g (千兆字节)。如果省略单位,则系统使用字节。如果省略大小,则默认为 64m 。什么时候 size0 ,容器对IPC使用的内存量没有限制。此选项与 --ipc=host

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

特定于system d的tmpf挂载的大小,例如/run、/run/lock、/var/log/Journal和/tmp。一个 unitb (字节), k (千比字节), m (兆字节),或 g (千兆字节)。如果省略单位,则系统使用字节。如果省略大小,则默认为 64m 。什么时候 size0 ,使用量被限制为主机可用内存的50%。

--sig-proxy

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

缺省值为 true

--stop-signal = 信号

发出停止容器的信号。默认值为 SIGTERM

--stop-timeout = 一秒

停止容器的超时。缺省值为 10 。远程连接使用本地tainers.conf作为默认设置。

--subgidname = name

使用映射在新的用户命名空间中运行容器 name/etc/subgid 文件。如果运行无根用户,则用户需要具有使用映射的权限。看见 subgid (5)。此标志与 --userns--gidmap

--subuidname = name

使用映射在新的用户命名空间中运行容器 name/etc/subuid 文件。如果运行无根用户,则用户需要具有使用映射的权限。看见 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开头的系统。*

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

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

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

--systemd = true | false | always

在SYSTEM D模式下运行容器。默认为 true

  • true 仅当在容器内执行的命令为 systemd/usr/sbin/init/sbin/init/usr/local/sbin/init

  • false 禁用系统d模式。

  • always 强制启用system d模式。

在SYSTEM D模式下运行容器会导致以下更改:

  • Podman将tmpfs文件系统挂载到以下目录

    • /run

    • /run/lock

    • /tmp

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

    • /var/lib/journal

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

  • 波德曼集 container_uuid 环境变量设置为容器ID的前32个字符。

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

  • 在cgroup v2上, /sys/fs/cgroup 安装为可写的。

这使得system d无需任何修改即可在受限容器中运行。

请注意,打开 SELinux 系统中,系统d尝试写入cgroup文件系统。默认情况下,写入cgroup文件系统的容器被拒绝。这个 container_manage_cgroup 必须启用布尔值,才能在SELinux独立的系统上执行此操作。

setsebool -P container_manage_cgroup true

--timeout = 一秒

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

--tls-verify

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

--tmpfs = fs

创建一个tmpfs装载。

装载临时文件系统( Tmpf )安装到容器中,例如:

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

此命令将装载一个 tmpfs 在… /tmp 在集装箱里。支持的挂载选项与Linux默认挂载标志相同。如果未指定选项,系统将使用以下选项: rw,noexec,nosuid,nodev

--tty-t

分配一个伪TTY。默认为 错误

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

NOTE :--tty标志防止重定向标准输出。它结合了STDOUT和STDERR,可以插入控制字符,还可以悬挂管道。仅当在终端中以交互方式运行时才使用此选项。向Podman提供输入时,请使用-I Only,Not-It。

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

--tz = 时区

在容器中设置时区。此标志采用基于区域的时区、GMT时间以及 local ,它设置容器中的时区以匹配主机。看见 /usr/share/zoneinfo/ 对于有效的时区。远程连接使用本地容器.conf作为默认设置

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

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

可选属性的可能值 flags 在本页下面进行了进一步的讨论。这个 amount 值是可选的,并且假定为 1 如果不给的话。

这个 from_uid 值基于运行该命令的用户,有根用户或无根用户。

  • Rootful用户: [flags] container_uidhost_uid [:amount]

  • 无根用户: [flags] container_uidintermediate_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

什么时候 podman run 由非特权用户(即无根运行)调用,则值 from_uid 被解释为“中间UID”。在无根的情况下,主机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,用户需要在中配置从属UID /etc/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

当以无根用户身份运行时,Podman使用在 /etc/subuid 文件。

当前用户ID被映射到无根用户命名空间中的UID=0。之后按顺序添加每个额外的范围:

主机

无根用户命名空间

长度

$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

作为无根用户,中的给定主机ID --uidmap--gidmap 是从 intermediate namespace 由波德曼制作。有时,最好直接在 host namespace 。可以通过运行以下命令手动执行此操作 podman unshare cat /proc/self/gid_map 在输出的第二列找到所需的主机ID,并从第一列获得相应的中间ID。

Podman可以通过在映射中的主机ID前面加上 @ 象征。例如,通过指定 --gidmap 100000:@2000:1 ,Podman将查找与主机ID对应的中间ID 2000 并将找到的中间id映射到容器id。 100000 。给定的主机ID必须是从属的(否则它一开始就不会被映射到中间空间)。

如果长度大于1,例如 --gidmap 100000:@2000:2 ,Podman将映射主机ID 20002001100000100001 ,而不管中间映射是如何定义的。

Extending previous mappings

一些映射修改可能会很麻烦。例如,用户从如下映射开始 --gidmap="0:0:65000" ,它需要更改,如父ID 1000 映射到容器ID 100000 相反,保留容器ID 1 未分配。相应的 --gidmap vbl.成为 --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"

此标志的一个特定用例是在无根用户的上下文中。无根用户可以使用 + 旗帜如中 --gidmap="+100000:1:1" 。然后,Podman将用所有剩余的中间ID从零开始“填补空白”。当用户想要将特定的中间ID映射到容器ID时,这很方便,而剩下的从属ID则由Podman随意映射。

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

无根用户可能希望映射已经从属于 /etc/subgid 而不指定映射的其余部分。

这可以通过以下方式完成 --gidmap "+gcontainer_gid:@host_gid"

在哪里:

  • 主机GID通过 @ 符号

  • 此GID的映射不会复制到 --usermap 多亏了 g 旗帜。

  • 其余的容器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" ...

No subordinate UIDs

Even if a user does not have any subordinate UIDs in /etc/subuid, --uidmap can be used to map the normal UID of the user to a container UID by running podman run --uidmap $container_uid:0:1 --user $container_uid ....

Pods

这个 --uidmap 选项不能与 --pod 在Pod中时,不能在容器级别将选项设置为uidmap。

--ulimit = 选项

ULimit选项。设置容器内部的ulimits值。

--ulimit带有软限制和硬限制,格式为= [:] 。例如:

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

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

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

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

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

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

--umask = 无掩码

将母罩放入容器内。默认为 0022 .远程连接使用本地 containers.conf 对于默认情况。

--unsetenv = env

取消设置容器的默认环境变量。默认环境变量包括由Podman本地提供的变量、由映像配置的环境变量和来自tainers.conf的环境变量。

--unsetenv-all

取消设置容器的所有默认环境变量。默认环境变量包括由Podman本地提供的变量、由映像配置的环境变量和来自tainers.conf的环境变量。

--user-u = user[:group]

设置所使用的用户名或UID,还可以设置指定命令的组名或GID。两者都有 usergroup 可以是符号的也可以是数字的。

如果没有此参数,该命令将以容器映像中指定的用户身份运行。除非被 USER 命令,或者通过传递给该选项的值,则该用户通常默认为根用户。

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

--userns = mode

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

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

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

  • 如果环境变量 PODMAN_USERNS 则使用其值。

  • 如果 userns 中指定的 containers.conf 使用此值。

  • 否则, --userns=host 都是假定的。

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

此选项与 --gidmap--uidmap--subuidname--subgidname

无根用户--userns=键映射:

钥匙

主机用户

容器用户

自动

$UID

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

主机

$UID

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

保持ID

$UID

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

Keep-id:uid=200,gid=210

$UID

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

Nommap

$UID

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

有效 mode 值包括:

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

  • rootful mode :The --userns=auto 标志要求用户名 containers 在/等等/subuid和/等等/subgid文件中指定,并允许Podman容器分配的未使用的下级用户ID范围。 示例: containers:2147483647:2147483648 .

  • rootless mode :将使用/etc/subuid和/etc/subgid文件中的用户。注运行单个容器而不使用--userns=AUTO将使用整个范围的UID,并且不允许进一步细分。参见子ID(5)。

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

的选项 --userns=keep-id 使用用户的所有子设备和子设备。的选项 --userns=nomap 使用用户的所有子ID和子ID(用户自己的ID除外)。使用 --userns=auto 只要存在任何启动的容器,启动新容器就不起作用 --userns=nomap--userns=keep-id 而不限制用户命名空间大小。

有效 auto 选项:

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

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

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

中的主机UID和GID gidmappinguidmapping 可以选择性地使用前缀 @ 象征。在这种情况下,Podman将查找与主机ID对应的中间ID,并将找到的中间ID映射到容器ID。有关详情,请参阅 --uidmap

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

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

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

有效 keep-id 选项:

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

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

  • size =SIZE:重写配置的用户命名空间的大小。 不要使所有可用ID饱和是有用的。 以根用户身份运行时不支持。

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

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

--uts = mode

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

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

  • 私人 :为容器创建新的命名空间(默认)。

  • [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 从主机进入 /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 将一个或多个卷装载到容器中的选项。

Write Protected Volume Mounts

增列 :ro:rw 分别以只读或读写模式装入卷的选项。默认情况下,卷以读写方式装载。请参见示例。

Chowning Volume Mounts

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

这个 :U Suffix告诉Podman根据容器内的UID和GID使用正确的主机UID和GID,以递归方式更改源卷的所有者和组。Chowning遍历卷下的文件系统并更改每个文件的UID/GID。如果卷具有数千个inode,则此过程需要很长时间,从而延迟容器的开始。

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

Labeling Volume Mounts

像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

Overlay Volume Mounts

这个 :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容器分离才能使容器工作。

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

Mounts propagation

默认情况下,绑定装载的卷是 private 。这意味着在容器内完成的任何装载在主机上不可见,反之亦然。可以通过指定卷装载传播属性来更改此行为。当一个卷是 shared ,则在容器内的该卷下完成的装载在主机上可见,反之亦然。制作一本书 slave [[1] ](#footnote 1)仅启用单向挂载传播:在该卷下的主机上完成的挂载在容器内可见,但反过来则不可见。

要控制卷的装载传播属性,可以使用 [r] 共享 , [r] 奴隶 , [r] 私人 或者 [r] 不可绑定 传播标志。只能为绑定装载的卷指定传播属性,而不能为内部卷或命名卷指定传播属性。要使挂载传播工作,源挂载点(挂载源目录所在的挂载点)必须具有正确的传播属性。对于共享卷,源装载点必须是共享的。对于从卷,源装载点必须是共享的或从属的。 [1]

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

使用以下命令装载卷 copy 选项告诉podman将内容从底层目标目录复制到新创建的内部卷。这个 copy 仅在最初创建卷时发生。随后在不同容器上使用该卷时,不会复制内容。这个 copy 选项在绑定装载上被忽略,并且不起作用。

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

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

使用装载卷 nodev 选项表示容器内的进程不能使用卷上的任何设备。默认情况下,使用装载卷 nodev

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

使用 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 /foomount --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]

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

  • rw | ro

  • z

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

默认情况下,Podman以与在源容器中装载卷相同的模式(读写或只读)装载卷。这可以通过添加一个 rorw option.

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

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

如果源容器中卷的位置与驻留在目标容器上的数据重叠,则该卷会将该数据隐藏在目标容器上。

--workdir-w = dir

容器内的工作目录。

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

退出状态

退出代码 podman 提供有关容器无法运行或退出的原因的信息。什么时候 podman run 以非零代码退出,则退出代码跟在 chroot (1)标准,见下文:

125 错误出在Podman本身

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

126 包含的_ command_ 无法调用

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

127 包含的_ command_ 找不到

$ 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

退出代码 contained command 退出代码

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

EXAMPLES

以只读模式运行容器

在容器镜像开发过程中,容器经常需要写入镜像内容。将程序包安装到 /usr, 例如。在生产中,应用程序很少需要写入映像。如果容器应用程序需要写入文件系统,则它们会写入卷。在只读模式下运行应用程序,可以提高应用程序的安全性 --read-only 换一下。这可以保护容器的图像不被修改。默认情况下,只读容器可以写入临时数据。Podman将一个tmpps安装在 /run/tmp 在集装箱里。

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

如果容器没有写入容器内的任何文件系统,包括tmpf,则设置--Read-only-tmpfs=FALSE。

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

使用GLOB将容器内的共享库公开为只读

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

将来自容器的日志消息公开给主机的日志

绑定挂载 /dev/log 目录,使容器中记录的消息显示在主机的系统日志/日志中。

$ 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:_i** 模式:

使用程序启动容器以创建共享内存段:

$ 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:_i** 选项,现在它显示了第一个共享内存段:

$ 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

如果容器需要由非根用户在容器内安装可写卷,请使用 U 选项.此选项告诉Podman将源卷设置为与容器内使用的默认UID和DID相匹配。

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

或者,如果容器内的非根用户需要可写卷,则--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: 消息将添加到主机的系统日志中。

要解决此问题,在编写此手册页时,需要运行以下命令,以便将正确的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

通过为容器指定替代类型来加强对容器内进程的安全策略。例如,通过执行以下命令来运行只允许监听阿帕奇端口的容器:

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

请注意,定义 svirt_apache_t 必须写入类型。

若要屏蔽容器中的其他特定路径,请使用 mask 选项与 --security-opt 旗帜。

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

若要取消屏蔽默认情况下被屏蔽的所有路径,请将 取消掩码 选项以执行以下操作 ALL 。或者,若要仅取消屏蔽特定路径,请使用 mask 选项。

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

若要取消屏蔽所有以/proc开头的路径,请将 取消掩码 选项以执行以下操作 /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)。例如,要在Containers网络命名空间中打开IP转发,请运行以下命令:

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

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

请参阅 --sysctl 选项,以获取当前支持的sysctls列表。

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

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

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

从命令行配置存储选项

Podman允许通过更改 /etc/container/storage.conf 或者通过使用全局期权。这展示了如何使用全局选项为一次性运行的Busybox设置和使用fuse-overlayf。

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 命令在启动容器2之前自动启动容器。

$ 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

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

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

运行一个容器,并将外部rootf挂载为覆盖

$ 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

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

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

无根容器

Podman在大多数系统上以非根用户身份运行。此功能需要一个足够新的版本 shadow-utils 安装好。这个 shadow-utils 程序包必须包括 Newuidmap (1)及 Newgidmap (1)可执行文件。

为了让用户在无根目录下运行,在中必须有其用户名的条目 /etc/subuid/etc/subgid 其中列出了其用户命名空间的UID。

如果安装了fuse-overlayfs和slrp4netns包,则无根Podman运行得更好。这个 fuse-overlayfs 包提供了一个用户空间覆盖存储驱动程序,否则用户需要使用 vfs 存储驱动程序,与其他驱动程序相比,该驱动程序的磁盘空间昂贵且性能较差。

要在容器上启用VPN,需要指定glirp4netns或appa;如果不指定两者,则需要使用--network=host标志运行容器。

ENVIRONMENT

容器内的环境变量可以使用多个不同的选项按以下优先顺序设置(较晚的条目将覆盖较早的条目):

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

  • --http-proxy :默认情况下,从主机传入几个环境变量,例如 http_proxyno_proxy 。看见 --http-proxy 了解更多细节。

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

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

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

运行容器并将环境设置为 *. 拖后腿 * 只有在未指定值的情况下,GLOB功能才处于活动状态:

$ 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程序,该程序然后执行OCI运行时。康蒙是集装箱监控器。这是一个小程序,它的工作是查看容器的主进程,如果容器死了,保存退出代码。它还可以打开容器的TTY,以便以后可以连接到容器上。这就是为什么波德曼可以在分离模式下运行(背景),所以波德曼可以退出,但召唤继续运行。每个容器都有自己的COMON实例。Conmon等待容器退出,收集并保存退出代码,然后启动Podman进程,通过关闭网络和存储来完成容器清理。有关conmon的更多信息,请参见conmon(8)手册页。

FILES

/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)] (https://github.com/containers/podman/blob/main/outloting.MD)获取常见问题的解决方案。

看到 [podman-rootless(7)] (https://github.com/containers/podman/blob/main/rootless.md)来解决无根问题。

HISTORY

2018年9月,库纳尔·库什瓦哈更新 <kushwaha_kunal_v7@lab.ntt.co.jp>

2017年10月,Dan Walsh为Podman将Docker文档转换为Podman <dwalsh@redhat.com>

2015年11月,Sally O‘Malley更新 <somalley@redhat.com>

2014年6月,由Sven Dowideit更新 <SvenDowideit@home.org.au>

2014年4月,最初由威廉·亨利汇编 <whenry@redhat.com> 基于docker.com的原始材料和内部工作。

FOOTNOTES

<a name=“Footnote 1”>1:Podman项目致力于包容性,这是开源的核心价值。这个 masterslave 这里使用的装载传播术语有问题且容易引起分歧,需要更改。然而,这些术语目前在Linux内核中使用,目前必须按原样使用。当内核维护人员纠正这种用法时,Podman会立即效仿。