名称

podman-container.unit - 使用 Podman Quadlet 管理容器的 systemd 单元文件

简介

名称.container

描述

容器单元是 .container 文件,由 Podman Quadlet 解释,用于生成 systemd .service 单元,将容器作为 systemd 服务进行管理。

.container 文件格式通过一个 [Container] 部分扩展了常规的 systemd 单元文件,允许对要运行的容器进行详细配置。

生成的服务文件包含一行类似于 ExecStart=podman run image-name 的内容,本节中的大多数键控制传递给 Podman 的命令行选项。然而,一些选项也影响 systemd 设置运行和与容器交互的细节。

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

只有一个必需的键,Image,它定义了服务运行的容器镜像。

使用摘要

.container 文件在启动或重新加载时由 podman-system-generator 解析,生成一个运行 podman run 的 systemd .service。该服务可以像任何其他单元一样进行管理。

systemctl --user start myimage-container.service

选项

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

[Container] 选项

podman run 等效项

AddCapability=CAP

--cap-add CAP

AddDevice=/dev/foo

--device /dev/foo

AddHost=example.com:192.168.10.11

--add-host example.com:192.168.10.11

Annotation=”XYZ”

--annotation “XYZ”

AutoUpdate=registry

--label “io.containers.autoupdate=registry”

CgroupsMode=no-conmon

--cgroups=no-conmon

ContainerName=name

--name name

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

DropCapability=CAP

--cap-drop=CAP

Entrypoint=/foo.sh

--entrypoint=/foo.sh

Environment=foo=bar

--env foo=bar

EnvironmentFile=/tmp/env

--env-file /tmp/env

EnvironmentHost=true

--env-host

Exec=/usr/bin/command

镜像规范后的命令 - /usr/bin/command

ExposeHostPort=50-59

--expose 50-59

GIDMap=0:10000:10

--gidmap=0:10000:10

GlobalArgs=--log-level=debug

--log-level=debug

Group=1234

--user UID:1234

GroupAdd=keep-groups

--group-add=keep-groups

HealthCmd=/usr/bin/command

--health-cmd=/usr/bin/command

HealthInterval=2m

--health-interval=2m

HealthLogDestination=/foo/log

--health-log-destination=/foo/log

HealthMaxLogCount=5

--health-max-log-count=5

HealthMaxLogSize=500

--health-max-log-size=500

HealthOnFailure=kill

--health-on-failure=kill

HealthRetries=5

--health-retries=5

HealthStartPeriod=1m

--health-start-period=period=1m

HealthStartupCmd=command

--health-startup-cmd=command

HealthStartupInterval=1m

--health-startup-interval=1m

HealthStartupRetries=8

--health-startup-retries=8

HealthStartupSuccess=2

--health-startup-success=2

HealthStartupTimeout=1m33s

--health-startup-timeout=1m33s

HealthTimeout=20s

--health-timeout=20s

HostName=example.com

--hostname example.com

HttpProxy=true

--http-proxy=true

Image=ubi8

镜像规范 - ubi8

IP=192.5.0.1

--ip 192.5.0.1

IP6=2001:db8::1

--ip6 2001:db8::1

Label=”XYZ”

--label “XYZ”

LogDriver=journald

--log-driver journald

LogOpt=path=/var/log/mykube.json

--log-opt path=/var/log/mykube.json

Mask=/proc/sys/foo:/proc/sys/bar

--security-opt mask=/proc/sys/foo:/proc/sys/bar

Memory=20g

--memory 20g

Mount=type=…

--mount type=…

Network=host

--network host

NetworkAlias=name

--network-alias name

NoNewPrivileges=true

--security-opt no-new-privileges

Notify=true

--sdnotify container

PidsLimit=10000

--pids-limit 10000

Pod=pod-name

--pod=pod-name

PodmanArgs=--publish 8080:80

--publish 8080:80

PublishPort=8080:80

--publish 8080:80

Pull=never

--pull never

ReadOnly=true

--read-only

ReadOnlyTmpfs=true

--read-only-tmpfs

ReloadCmd=/usr/bin/command

添加 ExecReload 并使用该值运行 exec

ReloadSignal=SIGHUP

添加 ExecReload 并使用信号运行 kill

Retry=5

--retry=5

RetryDelay=5s

--retry-delay=5s

Rootfs=/var/lib/rootfs

--rootfs /var/lib/rootfs

RunInit=true

--init

SeccompProfile=/tmp/s.json

--security-opt seccomp=/tmp/s.json

Secret=secret

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

SecurityLabelDisable=true

--security-opt label=disable

SecurityLabelFileType=usr_t

--security-opt label=filetype:usr_t

SecurityLabelLevel=s0:c1,c2

--security-opt label=level:s0:c1,c2

SecurityLabelNested=true

--security-opt label=nested

SecurityLabelType=spc_t

--security-opt label=type:spc_t

ShmSize=100m

--shm-size=100m

StartWithPod=true

如果定义了 Pod=,则容器由 pod 启动

StopSignal=SIGINT

--stop-signal=SIGINT

StopTimeout=20

--stop-timeout=20

SubGIDMap=gtest

--subgidname=gtest

SubUIDMap=utest

--subuidname=utest

Sysctl=name=value

--sysctl=name=value

Timezone=local

--tz local

Tmpfs=/work

--tmpfs /work

UIDMap=0:10000:10

--uidmap=0:10000:10

Ulimit=nofile=1000:10000

--ulimit nofile=1000:10000

Unmask=ALL

--security-opt unmask=ALL

User=bin

--user bin

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

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

Volume=/source:/dest

--volume /source:/dest

WorkingDir=$HOME

--workdir $HOME

[Container] 部分的描述如下

AddCapability=capability

添加 Linux 功能。

授予额外的功能会增加容器内运行进程的权限,并可能允许其突破限制。CAP_SYS_ADMINCAP_SYS_PTRACECAP_MKNODCAP_SYS_MODULE 等功能在用户命名空间内不使用时尤其危险。有关用户命名空间和功能之间交互的更详细解释,请参阅 user_namespaces(7)

在添加任何功能之前,请审查其安全隐患,并确保它对于容器的功能确实是必需的。有关更多信息,请参阅 capabilities(7)

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

向容器添加一个主机设备。其格式为 HOST-DEVICE[:CONTAINER-DEVICE][:PERMISSIONS],其中 HOST-DEVICE 是主机上设备节点的路径,CONTAINER-DEVICE 是容器中设备节点的路径,PERMISSIONS 是权限列表,结合了“r”表示读取,“w”表示写入,“m”表示 mknod(2)。

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

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

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

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

$ sudo setsebool -P container_use_devices=true

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 地址。

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

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

Annotation=key=value

为容器添加一个注解。此选项可以多次设置。

AutoUpdate=registry

指示容器是否将自动更新(podman-auto-update(1))。支持以下值

  • registry: 需要使用完全限定的镜像引用(例如,quay.io/podman/stable:latest)来创建容器。此强制是必要的,以便知道实际检查和拉取的镜像是哪个。如果使用了镜像 ID,Podman 将不再知道要检查/拉取哪个镜像。

  • local: 告诉 Podman 将容器使用的镜像与本地存储中具有其原始名称的镜像进行比较。如果镜像在本地更新,Podman 只需重新启动执行容器的 systemd 单元。

CgroupsMode=how

确定容器是否创建 CGroups。

默认情况下,Quadlet 创建的容器的 cgroups 模式是 split,这与 Podman CLI 使用的默认模式 (enabled) 不同。

如果容器加入一个 pod(即指定了 Pod=),您可能希望将其更改为 no-conmonenabled,以便 pod 级别的 cgroup 资源限制可以生效。

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

ContainerName=name

为容器分配一个名称。

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

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

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

  • 名称(“jonah”)。

Podman 为每个容器生成一个 UUID,如果未使用 ContainerName= 为容器分配名称,Podman 会生成一个随机字符串名称。该名称可以作为更人性化的方式来识别容器。这适用于后台和前台容器。容器的名称也使用容器的主要 IP 地址添加到 /etc/hosts 文件中(另请参见 AddHost= 选项)。

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=. 删除搜索域。

DropCapability=capability

从默认的 podman 功能集中删除这些功能,或者 all 以删除所有功能。

这是一个以空格分隔的功能列表。

Entrypoint="command"

覆盖镜像的默认 ENTRYPOINT。

镜像的 ENTRYPOINT 类似于 COMMAND,因为它指定容器启动时要运行的可执行文件,但它(故意地)更难覆盖。ENTRYPOINT 赋予容器其默认性质或行为。设置 ENTRYPOINT 后,容器运行起来就像它是该二进制文件一样,具有默认选项。可以通过 COMMAND 传递更多选项。但是,如果用户想在容器内运行其他东西,**Entrypoint=**选项允许指定新的 ENTRYPOINT。

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

Environment=env=value [env=value ...]

设置环境变量。

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

EnvironmentFile=file

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

EnvironmentHost=

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

Exec=command

容器的附加参数;这与在 podman run <image> <arguments> 调用之后传递更多参数的效果完全相同。

格式与 systemd 命令行 相同,但是,与在环境根文件系统上操作的同名 systemd ExecStart= 动词的使用场景不同,容器镜像通常有自己的 ENTRYPOINTCMD 元数据,此字段与之交互。

许多镜像的默认期望是镜像将包含带有默认二进制文件的 ENTRYPOINT,此字段将向该入口点添加参数。

另一种描述方式是,它的工作方式与 Kubernetes pod 中的 args 字段 相同。

ExposeHostPort=port[/protocol]

公开一个端口或一系列端口(例如 Expose=3300-3310)。协议可以是 tcpudpsctp,如果未给出,则假定为 tcp。此选项与镜像构建的 EXPOSE 指令匹配,并且除非使用 -P/--publish-all 将所有公开端口从随机主机端口转发,否则对实际网络规则没有影响。要将特定端口从主机转发到容器中,请改用 PublishPort= 选项。

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

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

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

GlobalArgs=

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

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

此键可以列出多次。

Group=gid

在容器内运行的(数字)GID。这不需要与主机上的 GID 匹配,后者可以通过 UserNS 修改,但如果未指定,则此 GID 也用于主机上。

GroupAdd=group | keep-groups

为在容器进程内运行的主用户分配额外的组。

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

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

HealthCmd="command"

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

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

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

HealthInterval=interval

设置健康检查的间隔。intervaldisable 表示不自动设置计时器。默认值为 30s

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

HealthLogDestination=directory_path

设置 HealthCheck 日志的目标位置。目录路径,本地或 events_logger(本地使用容器状态文件)(默认:本地)

  • local: (默认) 健康检查日志存储在叠加容器中。(例如:$runroot/healthcheck.log

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

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

HealthMaxLogCount=number

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

HealthMaxLogSize=size

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

HealthOnFailure=action

容器转换为不健康状态后采取的操作。默认值为 none

  • none: 不采取任何行动。

  • kill: 杀死容器。

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

  • stop: 停止容器。

HealthRetries=retries

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

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

HealthStartPeriod=period

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

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

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

HealthStartupCmd="command"

为容器设置启动健康检查命令。此命令在容器内部执行,用于控制常规健康检查。当启动命令成功时,常规健康检查开始,启动健康检查停止。可选地,如果命令失败达到设定的尝试次数,则容器将重新启动。启动健康检查可用于确保具有延长启动时间的容器在完全启动之前不会被标记为不健康。启动健康检查只能在也设置了常规健康检查(来自容器镜像或 HealthCmd= 选项)时使用。

HealthStartupInterval=interval

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

HealthStartupRetries=retries

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

HealthStartupSuccess=retries

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

HealthStartupTimeout=timeout

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

HealthTimeout=timeout

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

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

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

HostName=name

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

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

HttpProxy=

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

默认为 true

Image=name

要在容器中运行的镜像。建议使用完全限定的镜像名称而不是短名称,这既是为了性能也是为了健壮性。

名称的格式与传递给 podman pull 时相同。因此,它支持使用 :tag 或摘要来保证特定的镜像版本。

特殊情况

  • 如果镜像的 name.image 结尾,Quadlet 将使用由相应的 .image 文件拉取的镜像,并且生成的 systemd 服务包含对 $name-image.service(或在 .image 文件中设置的服务名称)的依赖。请注意,相应的 .image 文件必须存在。

  • 如果镜像的 name.build 结尾,Quadlet 将使用由相应的 .build 文件构建的镜像,并且生成的 systemd 服务包含对 $name-build.service 的依赖。注意:相应的 .build 文件必须存在。

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 模式。

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

向容器添加元数据。

LogDriver=driver

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

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

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

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

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

LogOpt=name=value

日志驱动特定选项。

设置自定义日志配置。支持以下 names

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

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

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

Mask=/path/1:/path/2

指定要屏蔽的路径,用冒号分隔。Mask=/path/1:/path/2。被屏蔽的路径在容器内部无法访问。

Memory=number[unit]

内存限制。unit 可以是 b (字节),k (千字节),m (兆字节),或 g (吉字节)。

允许限制容器可用的内存。如果主机支持交换内存,则 Memory= 内存设置可以大于物理 RAM。如果指定限制为 0(不使用 Memory=),则容器的内存不受限制。实际限制可能会向上取整到操作系统页面大小的倍数(该值非常大,即数万亿)。

在 cgroups V1 的无根(rootless)系统上不支持此选项。

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

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

特殊情况

  • 对于 type=volume,如果 source.volume 结尾,则使用由相应的 .volume 文件生成的 Podman 命名卷。

  • 对于 type=image,如果 source.image 结尾,则使用由相应的 .image 文件生成的镜像。

在这两种情况下,生成的 systemd 服务都将包含对相应单元生成的服务的依赖。注意:相应的 .volume.image 文件必须存在。

目前支持的挂载类型有 artifactbinddevptsglobimageramfstmpfsvolume

所有挂载类型通用的选项

  • src, source: bind, globvolume 的挂载源规范。artifact, bind, glob, imagevolume 必需。

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

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

特定于 type=artifact 的选项

  • digest: 如果 artifact source 包含多个 blob,可以指定 digest 以仅挂载具有该 digest 的特定 blob。

  • title: 如果 artifact source 包含多个 blob,可以设置一个 title,该 title 将与 org.opencontainers.image.title 注解进行比较。

  • name: 这可以用于覆盖我们在容器内部用于挂载的文件名。对于单个 blob 伪影,如果 dst 是目录,则名称按原样使用,否则忽略。对于多 blob 伪影,名称将与索引后缀 <name>-x 一起使用,其中 x 是伪影中从 0 开始的层索引。

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

但是,如果 dst 路径是容器中已有的文件,则 blob 将直接挂载到该文件上。这仅在 artifact 包含单个 blob 或指定了 digesttitle 时才有效。

如果 dst 路径在容器中不存在,那么如果伪影包含单个 blob,它会像现有文件情况一样,直接挂载到该路径。如果伪影包含多个 blob,它会像现有目录情况一样,将每个 blob 作为文件挂载到 dst 路径中。

特定于 type=volume 的选项

  • ro, readonly: truefalse(未指定时的默认值:false)。

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

  • idmap: 如果指定,则在容器中的目标用户命名空间创建 id 映射挂载。idmap 选项仅由 Podman 在有根模式下支持。Linux 内核不允许非特权用户使用 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: sharedslaveprivateunbindablersharedrslaverunbindablerprivate (默认)。[1] 另请参阅 mount(2)。

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

  • relabel: shared, private

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

  • 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 的复制。默认使用。

  • noatime: 读取文件时禁用更新文件访问时间。

  • 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=artifact,src=quay.io/libpod/testartifact:20250206-single,dst=/data

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

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

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

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

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

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

  • private:为容器创建新的命名空间。这对于 rootful 容器使用 bridge 模式,对于 rootless 容器使用 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 接口名称,都从主机复制。端口转发保留原始源 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

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

NoNewPrivileges=bool (默认为 false)

如果启用,这将禁用容器进程通过 setuid 和文件功能等方式获取额外权限。

Notify=bool (默认为 false)

默认情况下,Podman 以这样一种方式运行,即 systemd 启动通知命令由容器运行时处理。换句话说,当容器运行时在容器中启动子进程时,服务被视为已启动。然而,如果容器应用程序支持 sd_notify,则将 Notify 设置为 true 会将通知详细信息传递给容器,允许其自行通知启动。

此外,将 Notify 设置为 healthy 将推迟启动通知,直到容器被标记为健康,这由 Podman 健康检查确定。请注意,这需要设置容器健康检查,有关更多信息,请参阅 HealthCmd 选项。

PidsLimit=limit

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

Pod=name

指定一个 Quadlet .pod 单元以将容器链接到。该值必须采用 <name>.pod 的形式,并且 .pod 单元必须存在。

Quadlet 将添加所有必要的参数,以在容器和 pod 之间以及它们相应的服务之间建立链接。

PodmanArgs=

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

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

此键可以列出多次。

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

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

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

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

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

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

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

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

Pull=policy

拉取镜像策略。默认为 missing

  • always:总是拉取镜像,如果拉取失败则抛出错误。

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

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

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

ReadOnly=

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

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

ReadOnlyTmpfs=

当运行--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

ReadOnly=trueReadOnlyTmpfs=true 时,会在 /tmp、/run 和 /var/tmp 目录上挂载额外的 tmpfs。

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

默认情况下,当 ReadOnly=false 时,/dev 和 /dev/shm 是读/写,并且 /tmp、/run 和 /var/tmp 是容器镜像中的读/写目录。

ReloadCmd=/usr/bin/command

Service 中添加 ExecReload 行,该行在此容器中运行带此命令的 podman exec

要执行重新加载,请运行 systemctl reload <Service>

ReloadSignal 互斥

ReloadSignal=signal

Service 中添加 ExecReload 行,该行运行带此信号的 podman kill,并将信号发送到主容器进程。

要执行重新加载,请运行 systemctl reload <Service>

ReloadCmd 互斥

Retry=attempts

在仓库和本地存储之间拉取或推送镜像失败时重试的次数。默认为 3

RetryDelay=duration

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

Rootfs=

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

此选项与 Image 选项冲突。

这对于运行不需要任何镜像管理的容器很有用,容器的rootfs假定由外部管理。

Overlay 根文件系统 挂载

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

注意:在SELinux系统上,rootfs需要正确的标签,默认是unconfined_u:object_r:container_file_t:s0

idmap

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

RunInit=

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

SeccompProfile=path

设置容器中要使用的 seccomp 配置文件。如果未设置,则使用默认的 podman 配置文件。设置为 JSON 文件的路径,或设置为 unconfined 以禁用 seccomp 过滤器。

Secret=secret[,opt=opt ...]

授予容器访问机密的权限。可以指定多次。

密文是容器在运行时需要但未存储在镜像或源代码管理中的敏感数据 blob,例如用户名和密码、TLS 证书和密钥、SSH 密钥或其他重要的通用字符串或二进制内容(大小高达 512 kB)。

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

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

机密选项

  • type=mount|env : 密文如何暴露给容器。mount 将密文作为文件挂载到容器中。env 将密文作为环境变量暴露。默认为 mount

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

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

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

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

示例

以UID 1挂载到/my/location/mysecret

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

以模式0777挂载到/run/secrets/customtarget

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

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

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

SecurityLabelDisable=bool

关闭容器的标签分离。

SecurityLabelFileType=label

设置容器文件的标签文件类型。

SecurityLabelLevel=s0:c1,c2

设置容器进程的标签进程级别。

SecurityLabelNested=bool

允许安全标签在容器内发挥作用。这允许在容器内创建的容器之间进行分离。

SecurityLabelType=type

设置容器进程的标签进程类型。

ShmSize=number[unit]

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

StartWithPod=bool

在关联的 pod 创建后启动容器。默认为 true

如果为 true,容器将与 pod 一起启动/停止/重启。

如果为 false,则容器在 pod 启动时不会启动。容器将与 pod 一起停止。只要容器之前也在运行,重启 pod 也会重启容器。

请注意,通过配置 [Install] 部分,容器仍然可以手动或通过目标启动。无论如何,pod 都将按需启动。

StopSignal=signal

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

StopTimeout=seconds

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

请注意,此值应低于实际的 systemd 单元超时,以确保 podman rm 命令不会被 systemd 杀死。

SubGIDMap=name

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

SubUIDMap=name

在新用户命名空间中运行容器,使用 /etc/subuid 文件中名为 name 的映射。如果以无根方式运行,用户需要有权使用该映射。请参阅 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

注意:不允许上述sysctls。

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

注意:不允许上述sysctls。

Timezone=timezone

在容器中设置时区。此标志接受基于区域的时区、GMT 时间以及 local,后者将容器中的时区设置为与主机匹配。有关有效时区,请参阅 /usr/share/zoneinfo/。远程连接使用本地 containers.conf 作为默认值。

Tmpfs=

创建tmpfs挂载。

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

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

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

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

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

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

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

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

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

    Rootful 映射

当特权用户调用 **podman ** 时,选项 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

无根 映射

当非特权用户调用 **podman ** 时(即无根运行),值 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,用户需要在/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

在无根模式下运行时,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

引用 父命名空间中的主机ID

作为无根用户,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 必须已下属(否则它首先不会映射到中间空间)。

如果长度大于一,例如 --gidmap 100000:@2000:2,Podman 将主机 ID 20002001 分别映射到 100000100001,无论中间映射如何定义。

扩展先前的映射

一些映射修改可能很麻烦。例如,用户开始时使用映射 --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"

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

仅传递 --uidmap --gidmap 之一

通常,下属用户 ID 和组 ID 同时分配,并且对于任何用户,下属用户 ID 与下属组 ID 匹配。为方便起见,如果仅给出 UIDMap=GIDMap= 中的一个,podman 会假定映射同时引用 UID 和 GID,并将给定映射应用于两者。如果只需要更改两个值中的一个,则映射应包含 ug 标志,以指定它们仅适用于 UID 或 GID,不应复制。

标志

示例

描述

u

u20000:2000:1

映射仅适用于UID

g

g10000:1000:1

映射仅适用于GID

例如,给定命令

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

由于没有给出 UIDMap=GIDMap= 被复制到 UIDMap=,给出的命令等效于

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

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

无根 附加主机GID映射

无根用户可能希望映射一个已在/etc/subgid中作为辅助组的特定主机组,而无需指定其余映射。

这可以通过 GIDMap=”+g容器_gid:@主机_gid 来完成

其中

  • 主机GID通过@符号给出

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

  • 由于+标志,其余容器ID将从0到n映射,并包含所有剩余的辅助GID。

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

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

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

无辅助UID

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

Podman

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

Ulimit=option

Ulimit 选项。设置容器内部的 ulimit 值。

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

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

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

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

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

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

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

Unmask=

指定要取消屏蔽的路径,以冒号分隔。unmask=ALL 或 /path/1:/path/2,或 shell 展开的路径 (/proc/*)

如果设置为 ALL,Podman 将取消屏蔽默认被屏蔽或设置为只读的所有路径。

默认屏蔽路径为 /proc/acpi, /proc/kcore, /proc/keys, /proc/latency_stats, /proc/sched_debug, /proc/scsi, /proc/timer_list, /proc/timer_stats, /sys/firmware, 和 /sys/fs/selinux。

默认只读路径为 /proc/asound, /proc/bus, /proc/fs, /proc/irq, /proc/sys, /proc/sysrq-trigger, /sys/fs/cgroup。

User=user[:group]

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

如果没有此参数,命令将以容器镜像中指定的用户运行。除非被 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=, SubUIDMap=SubGIDMap= 不兼容。

无根用户 --userns=Key 映射

主机用户

容器用户

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,…]:自动创建唯一的命名空间。

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

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

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

选项 --userns=keep-id 使用用户的所有 subuids 和 subgids。选项 --userns=nomap 使用用户的所有 subuids 和 subgids,除了用户自己的 ID。当任何容器已使用 --userns=nomap--userns=keep-id 启动且未限制用户命名空间大小时,使用 --userns=auto 启动新容器不起作用。

有效的auto选项

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

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

  • 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,用于映射当前用户。

  • size=SIZE:覆盖配置用户命名空间的大小。这对于避免耗尽所有可用ID很有用。在以root身份运行时不支持。

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

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

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”

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

如果在新的用户命名空间中创建,容器中的 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 术语中,源目录是 lower,容器存储目录是 upper。对挂载点的修改在 执行完成后销毁,类似于 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,则在容器中的目标用户命名空间创建 id 映射挂载。idmap 选项支持自定义映射,该映射可以与容器使用的用户命名空间不同。映射可以在 idmap 选项之后指定,例如:idmap=uids=0-1-10#10-11-10;gids=0-100-10。对于每个三元组,第一个值是映射到主机上第二个值的后端文件系统 ID 的起始值。此映射的长度在第三个值中给出。多个范围用 # 分隔。

WorkingDir=dir

容器内的工作目录。

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

服务类型

默认情况下,生成器将 .container 单元的 Type=notify 设置为。

这可以通过在 [Service] 部分中显式设置 Type= 来覆盖。

对于一次性容器(例如,init 任务),使用

[Service]
Type=oneshot
RemainAfterExit=yes

有关服务类型和相关行为的完整详细信息,请参阅 systemd.service(5)

安装部分

为确保容器在启动时启动,请包含 [Install] 部分

[Install]
WantedBy=multi-user.target

仅支持 Alias=, WantedBy=, RequiredBy=UpheldBy= 键。

超时

容器启动可能会超过 systemd 的默认 90 秒超时(例如,拉取镜像时)。使用

[Service]
TimeoutStartSec=900

注意:TimeoutStartSec 对于 Type=oneshot 被忽略。

网络依赖

Quadlet 添加

  • After=network-online.target(对于 root 单元)

  • After=podman-user-wait-network-online.service(对于用户单元)

要禁用此功能,请添加

[Quadlet]
DefaultDependencies=false

资源命名

默认情况下,容器名为 systemd-<unitname>。使用 ContainerName= 覆盖。

避免在资源名称中使用 systemd 说明符(如 %N)——它们会破坏资源间的链接。

模板单元

Quadlet 支持模板容器单元,例如,foo@.container 创建 foo@.service

您可以通过以下方式实例化

systemctl start foo@bar.service

您还可以将实例符号链接

ln -s foo@.container foo@bar.container

使用插入文件进行实例特定定制

foo@bar.container.d/10-override.conf

插入文件

Quadlet 支持 .container.d/ 目录中的插入配置。

例如,一个插入文件

test.container.d/10-extra.conf

可以覆盖或扩展主单元文件。

插入文件遵循与 systemd 单元相同的覆盖和合并行为。

示例

最小容器单元

[Unit]
Description=A minimal container

[Container]
Image=quay.io/centos/centos:latest
Exec=sleep 60

[Install]
WantedBy=multi-user.target

另请参阅

systemd.unit(5), systemd.service(5), systemd-analyze(1), podman-run(1), [podman-quadlet(7)]