名称

podman-pod.unit - 使用 Quadlet 管理 Podman Pod 的 systemd 单元文件

简介

名称.pod

描述

Pod 单元以 .pod 扩展名命名,并包含一个 [Pod] 部分,描述作为服务创建和运行的 Pod。生成的服务文件包含一行类似于 ExecStartPre=podman pod create 的内容,此部分中的大多数键控制传递给 Podman 的命令行选项。

默认情况下,Podman Pod 的名称与单元相同,但带有 systemd- 前缀,即 $name.pod 文件会创建 $name-pod.service 单元和 systemd-$name Podman Pod。PodName 选项允许使用用户提供的名称覆盖此默认名称。

选项

[Pod] 的有效选项如下所示

[Pod] 选项

等效于 podman pod create

AddHost=example.com:192.168.10.11

--add-host example.com:192.168.10.11

ContainersConfModule=/etc/nvd.conf

--module=/etc/nvd.conf

DNS=192.168.55.1

--dns=192.168.55.1

DNSOption=ndots:1

--dns-option=ndots:1

DNSSearch=example.com

--dns-search example.com

ExitPolicy=stop

--exit-policy stop

GIDMap=0:10000:10

--gidmap=0:10000:10

GlobalArgs=--log-level=debug

--log-level=debug

HostName=name

--hostname=name

IP=192.5.0.1

--ip 192.5.0.1

IP6=2001:db8::1

--ip6 2001:db8::1

Label=”XYZ”

--label “XYZ”

Network=host

--network host

NetworkAlias=name

--network-alias name

PodmanArgs=--cpus=2

--cpus=2

PodName=name

--name=name

PublishPort=8080:80

--publish 8080:80

ServiceName=name

将 systemd 单元命名为 name.service

ShmSize=100m

--shm-size=100m

SubGIDMap=gtest

--subgidname=gtest

SubUIDMap=utest

--subuidname=utest

UIDMap=0:10000:10

--uidmap=0:10000:10

UserNS=keep-id:uid=200,gid=210

--userns keep-id:uid=200,gid=210

Volume=/source:/dest

--volume /source:/dest

[Pod] 部分中支持的键有

AddHost=hostname[;hostname[;...]]: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 地址。

Podman 还使用 host-gateway 地址自动将 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 主机),除非手动配置了 IP 地址,否则 Podman 将默默地跳过将内部主机名添加到 /etc/hosts;内部主机名由 gvproxy DNS 解析器解析。

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

ContainersConfModule=module

加载指定的 containers.conf(5) 模块。

此选项可以列出多次。

DNS=ipaddr

设置自定义 DNS 服务器。

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

可以指定特殊值 none 来禁止 Podman 在容器中创建 /etc/resolv.conf。然后,镜像中的 /etc/resolv.conf 文件将不加修改地使用。

请注意,ipaddr 可以直接添加到容器的 /etc/resolv.conf。但这并非必然。例如,将 dns_enabled 设置为 true 的自定义网络传递给 --network 将导致 /etc/resolv.conf 仅引用 aardvark-dns 服务器。然后 aardvark-dns 将所有非容器名称查询转发到提供的 ipaddr

DNSOption=option

设置自定义 DNS 选项。如果将 DNSOption= 与设置为 nonecontainer:idNetwork= 一起使用,则无效。

DNSSearch=domain

设置自定义 DNS 搜索域。如果将 DNSSearch= 与设置为 nonecontainer:idNetwork= 一起使用,则无效。使用 DNSSearch=. 来删除搜索域。

ExitPolicy=stop

设置当最后一个容器退出时 Pod 的退出策略。Quadlet 的默认值为 stop

要保持 Pod 活跃,请设置 ExitPolicy=continue

GIDMap=[flags]container_uid:from_uid[:amount]

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

注意:当容器在 Pod 中时,由于无法在容器级别设置 gidmap,因此不能将 GIDMap= 选项与 Pod= 选项一起调用。

GlobalArgs=

此键包含直接在生成文件中的 podman 命令之后传递的参数列表。它可用于访问生成器否则不支持的 Podman 功能。由于生成器不了解这些参数可能导致的意外交互,因此不建议使用此选项。

其格式是空格分隔的参数列表,可以选择单独转义以允许包含空格和其他控制字符。

此键可以列出多次。

HostName=name

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

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

IP=ipv4

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

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

IP6=ipv6

为 Pod 指定静态 IPv6 地址,例如 fd46:db93:aa76:ac37::10。此选项只能在 Pod 仅连接到单个网络(即 Network=network-name 最多使用一次)且 Pod 未通过 Network=container:id 加入另一个容器的网络命名空间时使用。该地址必须在网络的 IPv6 地址池内。

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

Label=key=value [key=value ...]

向容器添加元数据。

Network=mode

设置容器的网络模式。

特殊情况

  • 如果网络的 name.network 结尾,则使用名为 systemd-$name 的 Podman 网络,并且生成的 systemd 服务包含对 $name-network.service 的依赖。通过使用 $name.network Quadlet 文件可以自动创建此类网络。注意:相应的 .network 文件必须存在。

  • 如果 name.container 结尾,则容器将重用由 $name.container 创建的另一个容器的网络堆栈。生成的 systemd 服务包含对 $name.service 的依赖。注意:相应的 .container 文件必须存在。

有效的 mode 值为:

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

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

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

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

  • host:使用主机的网络命名空间而不是创建隔离的命名空间来运行容器。警告:这将使容器完全访问抽象的 Unix 域套接字以及绑定到 localhost 的 TCP/UDP 套接字。由于这些机制通常用于防止外部实体访问敏感的系统服务,因此使用此选项可能被视为安全漏洞。

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

  • private:为容器创建新的命名空间。这对于 rootful 容器使用 bridge 模式,对于 rootless 容器使用 slirp4netns

  • slirp4netns[:选项,...]:使用 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 接口名称,都从主机复制。端口转发保留原始源 IP 地址。pasta(1) 中描述的选项可以作为逗号分隔的参数指定。
    就 pasta(1) 选项而言,默认给出 --config-net,以便在容器启动时配置网络,并且默认也假定 --no-map-gw,以避免容器使用网关地址直接访问主机。后者可以通过在 pasta 特定选项中传递 --map-gw 来覆盖(尽管它不是实际的 pasta(1) 选项)。
    为了更好地与 DNS 处理集成,传递 --dns-forward 169.254.1.1,并将此地址作为第一个解析器添加到 resolv.conf(5) 中。如果应使用不同的 IP 地址,则可以显式传递 --dns-forward。为了使 host.containers.internal /etc/hosts 条目正常工作并允许连接到主机,传递 --map-guest-addr 169.254.1.2。同样,可以显式设置它以选择不同的 IP 地址。
    此外,如果分别未配置从主机到容器的 TCP 或 UDP 端口转发(通过 Podman 的 --publish 或直接传递 pasta -t/-u 选项),则传递 -t none-u none,以禁用基于绑定端口的自动端口转发。类似地,给出 -T none-U none 以禁用从容器到主机的相同功能。
    所有选项也可以在 containers.conf(5) 中设置;请参阅该文件中网络部分下的 pasta_options 键。
    一些示例:

    • 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,将 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,等同于带有 Podman 覆盖的默认 slirp4netns(1) 选项:与上面相同,但将 MTU 保留为 65520 字节

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

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

NetworkAlias=alias

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

PodmanArgs=

此键包含直接传递到生成文件中的 podman 命令末尾的参数列表。它可用于访问生成器否则不支持的 Podman 功能。由于生成器不了解这些参数可能导致的意外交互,因此不建议使用此选项。

其格式是空格分隔的参数列表,可以选择单独转义以允许包含空格和其他控制字符。

此键可以列出多次。

PodName=name

Podman Pod 的(可选)名称。如果未指定,默认值与单元的名称相同,但带有 systemd- 前缀,即 $name.pod 文件创建 systemd-$name Podman Pod,以避免与用户管理的 Pod 冲突。

请注意,Pod 和容器不能有相同的名称。因此,如果设置了 PodName,它不能与任何容器冲突。

PublishPort=[[ip:][hostPort]:]containerPort[/protocol]

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

hostPortcontainerPort 都可以指定为端口范围。当同时指定两者的范围时,范围内的容器端口数必须与范围内的主机端口数匹配。

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

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

不必指定主机端口(例如 podman run -p 127.0.0.1::80)。如果未指定,容器端口将随机分配主机上的一个端口。

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

端口发布仅支持通过 bridge 网络或 pastaslirp4netns 网络模式利用其自身网络命名空间的容器。

ServiceName=name

默认情况下,Quadlet 会通过将 -pod 附加到 Quadlet 的名称来命名 systemd 服务单元。设置此键将通过指示 Quadlet 使用提供的名称来覆盖此行为。

请注意,名称不应包含 .service 文件扩展名

ShmSize=number[unit]

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

SubGIDMap=name

使用 /etc/subgid 文件中名为 name 的映射在新用户命名空间中运行容器。如果以无根方式运行,用户需要有权使用该映射。请参阅 subgid(5)。此标志与 UserNS=GIDMap= 冲突。

SubUIDMap=name

使用 /etc/subuid 文件中名为 name 的映射在新用户命名空间中运行容器。如果以无根方式运行,用户需要有权使用该映射。请参阅 subuid(5)。此标志与 UserNS=UIDMap= 冲突。

UIDMap=container_uid:from_uid:amount

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

UserNS=mode

设置 Pod 中所有容器的用户命名空间模式。它默认为 PODMAN_USERNS 环境变量。空值(“”)表示用户命名空间已禁用。

无根用户 UserNS=Key 映射

主机用户

容器用户

“”

$UID

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

主机

$UID

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

keep-id

$UID

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

auto

$UID

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

nomap

$UID

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

有效的 mode 值为:

  • auto[:选项,...]:自动创建命名空间。可以为 auto 指定这些选项

    • gidmapping=容器_GID:主机_GID:大小 强制在用户命名空间中存在 GID 映射。

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

    • uidmapping=容器_UID:主机_UID:大小 强制在用户命名空间中存在 UID 映射。

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

  • keep-id:创建一个用户命名空间,其中当前无根用户的 UID:GID 映射到容器中的相同值。此选项不允许由 root 用户创建的容器使用。

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

Volume=[[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 命令移除容器时移除。

特殊情况

  • 如果 SOURCE-VOLUME.volume 结尾,则使用名为 systemd-$name 的 Podman 命名卷作为源,并且生成的 systemd 服务包含对 $name-volume.service 的依赖。请注意,相应的 .volume 文件必须存在。

(请注意,当使用远程客户端时,包括 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 选项,分别以只读或读写模式挂载卷。默认情况下,卷以读写方式挂载。请参阅示例。

Chowning Volume Mounts(更改卷挂载的属主)

当命名卷首次挂载到容器时,Podman 在容器初始化期间自动调整卷挂载点的所有权。此 chown 操作在以下条件下发生:

  • 卷尚未被使用(NeedsChown 设置为 true)

  • 卷为空或尚未复制

  • 卷不由外部卷驱动程序管理

  • 卷驱动程序不是“image”

对于具有 idmapped 挂载(使用 idmap 选项)的卷,所有权更改会考虑容器的用户命名空间映射,但 idmapped 卷保留正确的 UID/GID 映射。对于没有 idmapping 的卷,挂载点会更改所有者以匹配容器的进程用户和组,如果启用了用户命名空间重映射,则映射到主机用户命名空间。

如果在新的用户命名空间中创建,容器中的 UID 和 GID 可能对应主机上的另一个 UID 和 GID。

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

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

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  --security-opt label=disable -v $HOME:/home/user fedora touch /home/user/file

Overlay Volume Mounts(覆盖卷挂载)

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

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

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

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

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

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

请勿通过 overlay 挂载修改挂载到 的源目录,这可能会导致意外故障。仅在容器运行完成后修改目录。

挂载传播

默认情况下,绑定挂载的卷是 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 /foomount --make-private --make-shared /foo。这将把 /foo 转换为共享挂载点。或者,可以直接更改源挂载点的传播属性。假设 //foo 的源挂载点,则使用 mount --make-shared // 转换为共享挂载点。

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

ID映射挂载

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

示例

Pod 中的容器示例

test.pod

[Pod]
PodName=test
centos.container

centos.container

[Container]
Image=quay.io/centos/centos:latest
Exec=sh -c "sleep inf"
Pod=test.pod

另请参阅

systemd.unit(5)podman-kube-play(1)、[podman-quadlet(7)]