名称

podman-systemd.unit - 使用 Podman Quadlet 的 systemd 单元

概要

name.container, name.volume, name.network, name.kube name.image, name.build name.pod

Podman rootful 单元搜索路径

针对 root 用户的 Quadlet 文件可以放置在以下目录中,按优先级排序。这意味着在 /run 中找到的名称重复的 quadlet 优先于 /etc 中的,以及 /usr 中的。

临时 quadlet,通常用于测试

  • /run/containers/systemd/

系统管理员定义的 quadlet

  • /etc/containers/systemd/

发行版定义的 quadlet

  • /usr/share/containers/systemd/

Podman rootless 单元搜索路径

针对非 root 用户的 Quadlet 文件可以放置在以下目录中

  • $XDG_RUNTIME_DIR/containers/systemd/

  • $XDG_CONFIG_HOME/containers/systemd/ 或 ~/.config/containers/systemd/

  • /etc/containers/systemd/users/$(UID)

  • /etc/containers/systemd/users/

描述

Podman 通过使用 systemd 生成器 支持通过 systemd 构建和启动容器(以及创建卷)。这些文件在启动时(以及运行 systemctl daemon-reload 时)被读取,并生成相应的常规 systemd 服务单元文件。支持系统和用户 systemd 单元。标准 systemd 单元文件中提供的所有选项和表格都支持。例如,在 [Service] 表和 [Install] 表中定义的选项直接传递给 systemd,并由它处理。有关更多信息,请参阅 systemd.unit(5) 手册页。

Podman 生成器读取上面的搜索路径,并读取扩展名为 .container .volume.network.build.pod.kube 的文件,并为每个文件生成一个同名 .service 文件。请注意,如果现有供应商服务(即 /usr/ 中的服务)具有相同的名称,它们将被替换。生成的单元文件可以使用 systemctl 启动和管理,就像任何其他 systemd 服务一样。systemctl {--user} list-unit-files 列出系统上现有的单元文件。

Podman 文件使用与 常规 systemd 单元文件 相同的格式。每种文件类型都有一个自定义部分(例如,[Container]),该部分由 Podman 处理,所有其他部分都原封不动地传递,允许使用任何正常的 systemd 配置选项,如依赖项或 cgroup 限制。

源文件还支持与 systemd 相同的方式 的 drop-in。对于给定的源文件 (foo.container),对应的 .d 目录 (foo.container.d) 将被扫描以查找扩展名为 .conf 的文件,这些文件将按字母顺序合并到基本文件中。顶级类型 drop-in (container.d) 也将被包含。如果单元在名称中包含连字符(“-”)(foo-bar-baz.container),则还会搜索通过在连字符后截断名称生成的 drop-in 目录 (foo-.container.dfoo-bar-.container.d)。层次结构中更下层的同名 drop-in 文件会覆盖层次结构中更上层的文件 (foo-bar-baz.container.d/10-override.conf 覆盖 foo-bar-.container.d/10-override.conf,它覆盖 foo-.service.d/10-override.conf,它覆盖 container.d/10-override.conf)。这些 drop-in 文件的格式与基本文件相同。这对于更改或添加单元的配置设置非常有用,而无需修改单元文件。

对于 rootless 容器,当管理员将 Quadlet 文件放置在 /etc/containers/systemd/users 目录中时,所有用户的会话在登录会话开始时都会执行 Quadlet。如果管理员将 Quadlet 文件放置在 /etc/containers/systemd/users/${UID}/ 目录中,则只有与 UID 匹配的用户在登录会话开始时才会执行 Quadlet。对于放置在 /etc/containers/systemd/user/${UID}/ 内的子目录和其它用户单元搜索路径中的单元文件,Quadlet 将递归搜索并运行这些子目录中存在的单元文件。

注意:当 Quadlet 启动时,Podman 经常会拉取或构建一个或多个容器映像,这可能需要相当长的时间。Systemd 将服务启动时间的默认值设置为 90 秒,或让服务失败。通过使用 *TimeoutStartSec* Service 选项预先拉取映像或延长服务的 systemd 超时时间可以解决此问题。注意:*TimeoutStartSec* 不适用于 Type=oneshot 单元。有关如何处理不需要在主进程完成工作后保持活动的单元的长启动时间的更多信息,请参阅 systemd.service(5)

在 Quadlet 文件中添加以下代码段将 systemd 超时时间延长到 15 分钟。

[Service]
TimeoutStartSec=900

Quadlet 要求使用 cgroup v2,使用 podman info --format {{.Host.CgroupsVersion}} 在系统上检查。

服务类型

默认情况下,Quadlet 文件的 Service 部分的 Type 字段不需要设置。Quadlet 会为 .container.kube 文件将其设置为 notify,为 .pod 文件设置为 forking,为 .volume.network.build.image 文件设置为 oneshot

但是,当没有容器在 podman 退出后预期运行时,可以将 Type 显式设置为 oneshot 用于 .container.kube 文件。

在设置 Type=oneshot 时,建议也设置 RemainAfterExit=yes,以防止服务状态变为 inactive (dead)。但是,当通过计时器单元激活服务时,使用 RemainAfterExit=yes 会将作业保留在“已启动”状态,这会阻止计时器后续激活。有关更多信息,请参阅 systemd.service(5) 手册页。

此类情况的示例

  • .container 文件包含在它们的入口点完成工作后退出的映像 ``

  • .kube 文件指向没有定义任何容器的 Kubernetes Yaml 文件。例如,仅限 PVC

启用单元文件

由 Podman 创建的服务被 systemd 视为瞬态服务,这意味着它们没有与常规单元相同的持久性规则。特别地,不可能“systemctl enable”它们,以便在下次启动时自动启用它们。

为了弥补这一点,生成器在生成过程中手动应用容器定义单元文件的 [Install] 部分,与稍后运行 systemctl enable 相同。

例如,要启动一个在引导时启动的容器,请在文件中添加类似这样的内容

[Install]
WantedBy=default.target

目前,仅支持 AliasWantedByRequiredBy 键。

Install 部分可以是主文件的一部分,也可以放在如上所述的单独的 drop-in 文件中。后者允许你安装一个未启用的单元,然后通过安装 drop-in 稍后启用它。

注意:要表达容器之间的依赖关系,请使用服务的生成名称。换句话说,WantedBy=other.service,而不是 WantedBy=other.container。其他类型的依赖项也是如此,例如 After=other.service

模板文件

Systemd 支持 模板文件 的概念。它们是运行时名为“[email protected]”的单元,但可以从单个“[email protected]”文件多次实例化。还可以通过使用具有完整实例名称的 drop-in 文件来使各个实例不同。

Quadlet 以两种方式支持它们。首先,具有模板形式的 quadlet 单元将生成具有模板形式的 systemd 服务,并且模板 systemd 服务可以作为常规模板使用。例如,“[email protected]”将生成“[email protected]”,然后你可以“systemctl start [email protected]”。

其次,如果你创建类似“[email protected]”的符号链接,它将生成一个实例化的模板文件。在生成此文件时,quadlet 将从实例化目录 ([email protected]) 和模板目录 ([email protected]) 中读取 drop-in 文件。这允许定制各个实例。

实例化模板文件(如 [email protected])可以像非模板文件一样启用。但是,模板文件([email protected])则不同,因为它们需要进行实例化。如果 [Install] 部分包含 DefaultInstance= 键,那么该实例将被启用,但如果没有,则不会发生任何事情,这些选项将仅用作使用符号链接实例化的单元的默认值。

例如,模板文件 [email protected] 可能如下所示

[Unit]
Description=A templated sleepy container

[Container]
Image=quay.io/fedora/fedora
Exec=sleep %i

[Service]
# Restart service when sleep finishes
Restart=always

[Install]
WantedBy=multi-user.target
DefaultInstance=100

如果安装了这个文件,那么在启动时,将有一个 [email protected] 运行,它会休眠 100 秒。然后,你可以执行类似 systemctl start [email protected] 的操作来启动另一个休眠 50 秒的实例,或者,另一个服务可以通过类似 [email protected] 的依赖项来启动它。

此外,如果你执行 ln -s [email protected] [email protected],你也会在启动时有一个 10 秒的休眠运行。并且,如果你希望该特定实例使用另一个镜像运行,你可以创建一个像 [email protected]/10-image.conf 的下拉文件

[Container]
Image=quay.io/centos/centos

相对路径

为了支持 Systemd 指定符,Quadlet 不会解析以 % 开头的相对路径。要解析这样的路径,请在前面加上 ./

例如,不要使用 EnvironmentFile=%n/env,而应使用 EnvironmentFile=./%n/env

调试单元文件

将单元文件放置在某个单元搜索路径(上面提到过)之后,你可以使用 systemctl start {--user} 启动它。如果它失败,并显示“Failed to start example.service: Unit example.service not found.”,那么可能是你使用了错误的语法,或者你使用了来自 Podman Quadlet 的较新版本的选项,并且生成器未能创建服务文件。

使用以下命令查看生成的程序文件和/或错误消息

/usr/lib/systemd/system-generators/podman-system-generator {--user} --dryrun

调试一组有限的单元文件

如果你希望调试一组有限的单元文件,你可以将它们复制到一个单独的目录中,并在运行以下命令时将 QUADLET_UNIT_DIRS 环境变量设置为该目录

QUADLET_UNIT_DIRS=<Directory> /usr/lib/systemd/system-generators/podman-system-generator {--user} --dryrun

这将指示 Quadlet 在该目录中而不是在公共目录中查找单元,从而将输出限制为仅你正在调试的单元。

隐式网络依赖项

Quadlet 将通过向单元添加 After=Wants= 属性来添加对 network-online.target(作为 root)或 podman-user-wait-network-online.service(作为用户)的依赖项。这是为了确保在需要拉取镜像并启动容器时,网络是可达的。

特殊情况 podman-user-wait-network-online.service 单元需要作为用户使用,因为用户单元无法等待系统(root)单元,因此 network-online.target 在那里没有任何作用,而是被忽略。由于这引起了大量问题,我们决定使用自己的特殊用途单元来解决这个问题,该单元只是检查 network-online.target 单元是否使用 systemctl is-active network-online.target 处于活动状态。

可以通过在 Quadlet 部分添加 DefaultDependencies=false 来禁用此行为。

容器单元 [Container]

容器单元以 .container 扩展名命名,并包含一个 [Container] 部分,描述作为服务运行的容器。生成的 service 文件包含一行类似 ExecStart=podman run image-name 的内容,并且该部分中的大多数键都控制传递给 Podman 的命令行选项。但是,某些选项还会影响 systemd 设置运行和与容器交互的方式的详细信息。

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

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

下面列出了 [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

Command after image specification - /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

Image=ubi8

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

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

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=

除了默认的 Podman 功能集之外,将这些功能添加到容器中。

这是一个用空格分隔的功能列表。此键可以多次列出。

例如

AddCapability=CAP_DAC_OVERRIDE CAP_IPC_OWNER

AddDevice=

将主机中的设备节点添加到容器中。其格式为 HOST-DEVICE[:CONTAINER-DEVICE][:PERMISSIONS],其中 HOST-DEVICE 是主机上设备节点的路径,CONTAINER-DEVICE 是容器中设备节点的路径,PERMISSIONS 是权限列表,结合 ‘r’ 表示读、‘w’ 表示写和 ‘m’ 表示 mknod(2)。- 前缀告诉 Quadlet 仅在主机上存在设备节点时才添加它。

此键可以多次列出。

AddHost=

将主机到 IP 的映射添加到 /etc/hosts。格式为 hostname:ip

等同于 Podman 的 --add-host 选项。此键可以列出多次。

Annotation=

在容器上设置一个或多个 OCI 注释。格式为 key=value 项目列表,类似于 Environment

此键可以多次列出。

AutoUpdate=

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

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

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

CgroupsMode=

Podman 容器的 cgroups 模式。等同于 Podman 的 --cgroups 选项。

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

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

ContainerName=

Podman 容器的(可选)名称。如果未指定,则使用 systemd-%N 的默认值,这与服务名称相同,但带有 systemd- 前缀以避免与用户管理的容器冲突。

ContainersConfModule=

加载指定的 containers.conf(5) 模块。等同于 Podman 的 --module 选项。

此键可以多次列出。

DNS=

为该网络中的容器设置网络范围的 DNS 解析器/名称服务器。

此键可以多次列出。

DNSOption=

设置自定义 DNS 选项。

此键可以多次列出。

DNSSearch=

设置自定义 DNS 搜索域。使用 DNSSearch=. 来删除搜索域。

此键可以多次列出。

DropCapability=

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

这是一个用空格分隔的功能列表。此键可以多次列出。

例如

DropCapability=CAP_DAC_OVERRIDE CAP_IPC_OWNER

Entrypoint=

覆盖镜像中的默认 ENTRYPOINT。等同于 Podman 的 --entrypoint 选项。以 json 字符串的形式指定多选项命令。

Environment=

在容器中设置环境变量。这使用与 systemd 中的服务 相同的格式,并且可以列出多次。

EnvironmentFile=

使用以行为分隔符的文件在容器中设置环境变量。路径可以是相对于单元文件位置的绝对路径或相对路径。此键可以使用多次,并且顺序在传递到 podman run 时保持不变。

EnvironmentHost=

在容器内使用主机环境。

Exec=

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

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

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

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

ExposeHostPort=

将主机上的端口或端口范围(例如 50-59)暴露到容器。等同于 Podman 的 --expose 选项。

此键可以多次列出。

GIDMap=

使用提供的 GID 映射在新用户命名空间中运行容器。等同于 Podman 的 --gidmap 选项。

此键可以多次列出。

GlobalArgs=

此键包含直接在生成的

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

此键可以多次列出。

Group=

要在容器内运行的(数字)GID。它不需要与主机上的 GID 匹配,这可以使用 UsersNS 修改,但是如果未指定,此 GID 也在主机上使用。

GroupAdd=

将附加组分配给在容器进程中运行的主要用户。还支持 keep-groups 特殊标志。等同于 Podman 的 --group-add 选项。

HealthCmd=

设置或更改容器的运行状况检查命令。值为 none 将禁用现有运行状况检查。等同于 Podman 的 --health-cmd 选项。

HealthInterval=

设置运行状况检查的间隔。间隔为 disable 导致不设置任何自动计时器。等同于 Podman 的 --health-interval 选项。

HealthLogDestination=

设置运行状况检查日志的目标。目录路径,本地或 events_logger(本地使用容器状态文件)(默认:本地)等同于 Podman 的 --health-log-destination 选项。

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

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

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

HealthMaxLogCount=

设置运行状况检查日志文件中的最大尝试次数。(“0”值表示日志文件中的尝试次数无限) (默认:5 次尝试) 等同于 Podman 的 --Health-max-log-count 选项。

HealthMaxLogSize=

设置存储的运行状况检查日志的最大长度(以字符为单位)。(“0”值表示日志长度无限) (默认:500 个字符) 等同于 Podman 的 --Health-max-log-size 选项。

HealthOnFailure=

当容器进入不健康状态时要采取的操作。 “kill” 操作与 systemd 最佳集成。 一旦容器变得不健康,它就会被杀死,systemd 会重新启动服务。 等同于 Podman 的 --health-on-failure 选项。

HealthRetries=

在健康检查被认为不健康之前允许的重试次数。 等同于 Podman 的 --health-retries 选项。

HealthStartPeriod=

容器启动所需的初始化时间。 等同于 Podman 的 --health-start-period 选项。

HealthStartupCmd=

为容器设置启动健康检查命令。 等同于 Podman 的 --health-startup-cmd 选项。

HealthStartupInterval=

设置启动健康检查的间隔。 间隔为禁用,则不会设置自动计时器。 等同于 Podman 的 --health-startup-interval 选项。

HealthStartupRetries=

在启动健康检查重新启动容器之前允许的尝试次数。 等同于 Podman 的 --health-startup-retries 选项。

HealthStartupSuccess=

启动健康检查成功前所需的成功运行次数,之后会开始常规健康检查。 等同于 Podman 的 --health-startup-success 选项。

HealthStartupTimeout=

启动健康检查命令完成之前允许的最大时间,超过此时间将被标记为失败。 等同于 Podman 的 --health-startup-timeout 选项。

HealthTimeout=

在间隔被认为失败之前允许完成健康检查的最大时间。 等同于 Podman 的 --health-timeout 选项。

HostName=

设置容器内部可用的主机名。 等同于 Podman 的 --hostname 选项。

Image=

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

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

作为特殊情况,如果镜像的 name.image 结尾,Quadlet 将使用由相应的 .image 文件拉取的镜像,生成的 systemd 服务包含对 $name-image.service 的依赖项。 请注意,相应的 .image 文件必须存在。

IP=

为容器指定一个静态 IPv4 地址,例如 **10.88.64.128**。 等同于 Podman 的 --ip 选项。

IP6=

为容器指定一个静态 IPv6 地址,例如 **fd46:db93:aa76:ac37::10**。 等同于 Podman 的 --ip6 选项。

Label=

在容器上设置一个或多个 OCI 标签。 格式是一个 key=value 项目列表,类似于 Environment

此键可以多次列出。

LogDriver=

设置 Podman 在运行容器时使用的日志驱动程序。 等同于 Podman 的 --log-driver 选项。

LogOpt=

设置 Podman 在运行容器时使用的日志选项。 等同于 Podman 的 --log-opt 选项。 此键可以列出多次。

Mask=

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

Mount=

将文件系统挂载附加到容器。 这等同于 Podman 的 --mount 选项,通常具有 type=TYPE,TYPE-SPECIFIC-OPTION[,...] 的形式。

有两个特殊情况。

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

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

在这两种情况下,生成的 systemd 服务将包含对为相应单元生成的服务的依赖项。

此键可以多次列出。

Network=

为容器指定一个自定义网络。 这与 podman run--network 选项具有相同的格式。 例如,使用 host 在容器中使用主机网络,或使用 none 在容器中不设置网络。

作为特殊情况,如果网络的 name.network 结尾,将使用名为 systemd-$name 的 Podman 网络,生成的 systemd 服务包含对 $name-network.service 的依赖项。 此类网络可以通过使用 $name.network Quadlet 文件自动创建。

另一个特殊情况是,如果 name.container 结尾,容器将重用由 $name.container 创建的另一个容器的网络栈。 生成的 systemd 服务包含对 $name.service 的依赖项。

此键可以多次列出。

NetworkAlias=

为容器添加一个网络范围的别名。 这与 podman run--network-alias 选项具有相同的格式。 别名可用于在 DNS 解析中将容器分组在一起:例如,在多个容器上设置 NetworkAlias=web 将使对 web 的 DNS 查询解析到具有该别名的所有容器。

此键可以多次列出。

NoNewPrivileges= (默认为 false)

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

Notify= (默认为 false)

默认情况下,Podman 的运行方式使得 systemd 启动通知命令由容器运行时处理。 换句话说,当容器运行时启动容器中的子进程时,服务被认为已启动。 但是,如果容器应用程序支持 sd_notify,那么将 Notify 设置为 true 将通知详细信息传递给容器,使其能够自行通知启动。

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

PidsLimit=

调整容器的 pids 限制。 这等同于 Podman 的 --pids-limit 选项。

Pod=

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

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

PodmanArgs=

此键包含一个参数列表,这些参数直接传递到生成的 文件中 podman run 命令的末尾(在命令行中的镜像名称之前)。它 可以用于访问生成器不支持的 Podman 功能。由于生成器 无法识别这些参数可能导致的意外交互,因此不建议 使用此选项。

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

此键可以多次列出。

PublishPort=

将容器中的端口或端口范围(例如 50-59)暴露给 主机。等效于 Podman --publish 选项。格式与 Podman 选项类似,形式为 ip:hostPort:containerPortip::containerPorthostPort:containerPortcontainerPort,其中主机和容器端口的数量必须相同(在 范围的情况下)。

如果 IP 设置为 0.0.0.0 或根本没有设置,则端口绑定在主机的 所有 IPv4 地址上;对于 IPv6,使用 [::]。

请注意,不列出主机端口意味着 Podman 会自动选择一个端口, 并且它可能在每次调用服务时都不同。这使得该选项 变得不那么有用。可以使用 podman port 命令找到分配的 端口。

此键可以多次列出。

Pull=

设置镜像拉取策略。这等效于 Podman --pull 选项。

ReadOnly=(默认为 false

如果启用,则使镜像只读。

ReadOnlyTmpfs=(默认为 true

如果 ReadOnly 设置为 true,则在 /dev、/dev/shm、/run、/tmp 和 /var/tmp 上挂载一个读写 tmpfs。

Rootfs=

容器要使用的 rootfs。Rootfs 指向系统上包含 要在容器内运行的内容的目录。此选项与 Image 选项冲突。

rootfs 的格式与传递给 podman run --rootfs 时相同,因此它也支持覆盖挂载。

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

RunInit=(默认为 false

如果启用,则容器在容器内有一个最小的 init 进程, 它会转发信号并回收进程。

SeccompProfile=

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

Secret=

在容器中使用 Podman 密钥,作为文件或环境变量。 这等效于 Podman --secret 选项,通常具有 secret[,opt=opt ...] 的形式。

SecurityLabelDisable=

关闭容器的标签分离。

SecurityLabelFileType=

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

SecurityLabelLevel=

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

SecurityLabelNested=

允许 SecurityLabels 在容器内起作用。这允许分离 在容器内创建的容器。

SecurityLabelType=

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

ShmSize=

/dev/shm 的大小。

这等效于 Podman --shm-size 选项,通常具有 number[unit] 的形式。

StartWithPod=

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

如果为 true,容器将在 pod 旁边启动/停止/重启。

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

请注意,容器仍然可以通过配置 [Install] 部分手动启动或通过目标启动。pod 将在任何情况下根据需要启动。

StopSignal=

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

这等效于 Podman --stop-signal 选项。

StopTimeout=

在强制停止容器之前等待的秒数。

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

这等效于 Podman --stop-timeout 选项。

SubGIDMap=

使用 /etc/subgid 文件中的名称映射在新的用户命名空间 中运行容器。等效于 Podman --subgidname 选项。

SubUIDMap=

使用 /etc/subuid 文件中的名称映射在新的用户命名空间 中运行容器。等效于 Podman --subuidname 选项。

Sysctl=

为容器配置命名空间内核参数。格式为 Sysctl=name=value

这是一个以空格分隔的内核参数列表。此键可以多次列出。

例如

Sysctl=net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.all.use_tempaddr=1

Timezone=(如果未设置,则使用系统配置的默认值)

容器要运行的时区。

Tmpfs=

在容器中挂载一个 tmpfs。这等效于 Podman --tmpfs 选项, 通常具有 CONTAINER-DIR[:OPTIONS] 的形式。

此键可以多次列出。

UIDMap=

使用提供的 UID 映射在新的用户命名空间中运行容器。 等效于 Podman --uidmap 选项。

此键可以多次列出。

Ulimit=

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

此键可以多次列出。

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=

在容器内以(数字)UID 运行。这不需要与主机上的 UID 匹配,可以使用 UserNS 修改, 但如果没有指定,则此 UID 也用于主机。

UserNS=

设置容器的用户命名空间模式。这等效于 Podman --userns 选项, 通常具有 MODE[:OPTIONS,...] 的形式。

Volume=

在容器中挂载一个卷。这等效于 Podman --volume 选项, 通常具有 [[SOURCE-VOLUME|HOST-DIR:]CONTAINER-DIR[:OPTIONS]] 的形式。

如果 SOURCE-VOLUME. 开头,Quadlet 将解析相对于单元文件位置的路径。

作为一个特殊情况,如果 SOURCE-VOLUME.volume 结尾,则使用名为 systemd-$name 的 Podman 命名卷作为源,生成的 systemd 服务包含对 $name-volume.service 的依赖。这种卷可以通过使用 $name.volume Quadlet 文件自动懒惰创建。

此键可以多次列出。

WorkingDir=

容器内的工作目录。

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

Pod 单位 [Pod]

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

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

[Pod] 中的有效选项列在下面

[Pod] 选项

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

GIDMap=0:10000:10

--gidmap=0:10000:10

GlobalArgs=--log-level=debug

--log-level=debug

IP=192.5.0.1

--ip 192.5.0.1

IP6=2001:db8::1

--ip6 2001:db8::1

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

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=

将主机到 IP 的映射添加到 /etc/hosts。格式为 hostname:ip

等同于 Podman 的 --add-host 选项。此键可以列出多次。

ContainersConfModule=

加载指定的 containers.conf(5) 模块。等同于 Podman 的 --module 选项。

此键可以多次列出。

DNS=

为此 pod 中的容器设置网络范围的 DNS 解析器/名称服务器。

此键可以多次列出。

DNSOption=

设置自定义 DNS 选项。

此键可以多次列出。

DNSSearch=

设置自定义 DNS 搜索域。使用 DNSSearch=. 来删除搜索域。

此键可以多次列出。

GIDMap=

使用提供的 GID 映射在新用户命名空间中创建 pod。等效于 Podman --gidmap 选项。

此键可以多次列出。

GlobalArgs=

此键包含直接在生成的 podmanpod 之间传递的一系列参数。它可以用于访问生成器不支持的 Podman 功能。由于生成器不知道这些参数会导致什么意外交互,因此不建议使用此选项。

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

此键可以多次列出。

IP=

为 pod 指定一个静态 IPv4 地址,例如 **10.88.64.128**。等效于 Podman --ip 选项。

IP6=

为 pod 指定一个静态 IPv6 地址,例如 **fd46:db93:aa76:ac37::10**。等效于 Podman --ip6 选项。

Network=

为 pod 指定一个自定义网络。这与 podman pod create--network 选项格式相同。例如,使用 host 在 pod 中使用主机网络,或使用 none 在 pod 中不设置网络。

作为一个特殊情况,如果网络的 name.network 结尾,Quadlet 将查找相应的 .network Quadlet 单位。如果找到,Quadlet 将使用在单位中设置的网络名称,否则,将使用 systemd-$name。生成的 systemd 服务包含对为该 .network 单位生成的 service 单位的依赖,或者在没有找到 .network 单位的情况下,依赖于 $name-network.service

此键可以多次列出。

NetworkAlias=

为 pod 添加一个网络范围的别名。这与 podman pod create--network-alias 选项格式相同。别名可用于在 DNS 解析中将容器分组在一起:例如,在多个容器上设置 NetworkAlias=web 将使对 web 的 DNS 查询解析到具有该别名的所有容器。

此键可以多次列出。

PodmanArgs=

此键包含直接传递到生成的 podman pod create 命令末尾的一系列参数。它可以用于访问生成器不支持的 Podman 功能。由于生成器不知道这些参数会导致什么意外交互,因此不建议使用此选项。

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

此键可以多次列出。

PodName=

Podman pod 的(可选)名称。如果未指定此名称,将使用 systemd-%N 的默认值,该值与服务名称相同,但带有 systemd- 前缀,以避免与用户管理的容器发生冲突。

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

PublishPort=

将 pod 中的端口或端口范围(例如 50-59)暴露到主机。等效于 Podman --publish 选项。格式类似于 Podman 选项,其形式为 ip:hostPort:containerPortip::containerPorthostPort:containerPortcontainerPort,其中主机端口和容器端口的数量必须相同(在范围情况下)。

如果 IP 设置为 0.0.0.0 或根本没有设置,则端口绑定在主机的 所有 IPv4 地址上;对于 IPv6,使用 [::]。

请注意,不列出主机端口意味着 Podman 会自动选择一个端口, 并且它可能在每次调用服务时都不同。这使得该选项 变得不那么有用。可以使用 podman port 命令找到分配的 端口。

当通过 Network=host 使用 host 网络时,不能使用 PublishPort= 选项。

此键可以多次列出。

ServiceName=

默认情况下,Quadlet 会通过在 Quadlet 名称后面添加 -pod 来命名 systemd service 单位。设置此键会覆盖此行为,指示 Quadlet 使用提供的名称。

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

SubGIDMap=

使用 /etc/subgid 文件中具有名称的映射在新用户命名空间中创建 pod。等效于 Podman --subgidname 选项。

SubUIDMap=

使用 /etc/subuid 文件中具有名称的映射在新用户命名空间中创建 pod。等效于 Podman --subuidname 选项。

UIDMap=

使用提供的 UID 映射在新用户命名空间中创建 pod。等效于 Podman --uidmap 选项。

此键可以多次列出。

UserNS=

为 pod 设置用户命名空间模式。这等效于 Podman --userns 选项,通常采用 MODE[:OPTIONS,...] 的形式。

Volume=

在 pod 中挂载卷。这等效于 Podman --volume 选项,通常采用 [[SOURCE-VOLUME|HOST-DIR:]CONTAINER-DIR[:OPTIONS]] 的形式。

如果 SOURCE-VOLUME. 开头,Quadlet 将解析相对于单元文件位置的路径。

作为一个特殊情况,如果 SOURCE-VOLUME.volume 结尾,Quadlet 将查找相应的 .volume Quadlet 单位。如果找到,Quadlet 将使用在单位中设置的卷名称,否则,将使用 systemd-$name。生成的 systemd 服务包含对为该 .volume 单位生成的 service 单位的依赖,或者在没有找到 .volume 单位的情况下,依赖于 $name-volume.service

此键可以多次列出。

Kube 单位 [Kube]

Kube 单位使用 .kube 扩展名命名,并包含一个 [Kube] 部分,描述了 podman kube play 如何作为服务运行。生成的 service 文件包含类似于 ExecStart=podman kube play file.yml 的行,而此部分中的大多数键控制传递给 Podman 的命令行选项。但是,某些选项还会影响 systemd 如何设置以运行并与容器交互。

只有一个必需键 Yaml,它定义了 Kubernetes YAML 文件的路径。

[Kube] 的有效选项列在下面

[Kube] 选项

podman kube play 等效

AutoUpdate=registry

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

ConfigMap=/tmp/config.map

--config-map /tmp/config.map

ContainersConfModule=/etc/nvd.conf

--module=/etc/nvd.conf

ExitCodePropagation=how

如何传播容器错误状态

GlobalArgs=--log-level=debug

--log-level=debug

KubeDownForce=true

--force (适用于 podman kube down)

LogDriver=journald

--log-driver journald

Network=host

--network host

PodmanArgs=--annotation=key=value

--annotation=key=value

PublishPort=8080:80

--publish 8080:80

SetWorkingDirectory=yaml

将单位文件的 WorkingDirectory 设置为 YAML 文件的位置

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

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

Yaml=/tmp/kube.yaml

podman kube play /tmp/kube.yaml

[Kube] 部分中支持的键是

AutoUpdate=

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

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

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

  • name/(local|registry):告诉 Podman 对指定的容器名称执行 localregistry 自动更新。

ConfigMap=

通过 --configmap 参数将 Kubernetes ConfigMap YAML 路径传递给 podman kube play。与 configmap 参数不同,该值可能只包含一个路径,但它可以是绝对路径或相对于单位文件位置的路径。

此键可以多次使用

ContainersConfModule=

加载指定的 containers.conf(5) 模块。等同于 Podman 的 --module 选项。

此键可以多次列出。

ExitCodePropagation=

控制 systemd 服务的主 PID 应如何退出。支持以下值

  • all:如果所有容器都失败(即退出非零),则退出非零

  • any:如果任何容器失败,则退出非零

  • none:退出零并忽略失败的容器

当前默认值为 none

GlobalArgs=

此键包含在生成的 service 文件中直接传递给 podmankube 之间的参数列表。它可用于访问生成器不支持的其他 Podman 功能。由于生成器不知道这些参数会导致哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

KubeDownForce=

在调用 podman kube down 时删除所有资源,包括卷。等效于 Podman --force 选项。

LogDriver=

设置 Podman 在运行容器时使用的 log-driver。等效于 Podman --log-driver 选项。

Network=

为容器指定自定义网络。这与 podman kube play--network 选项具有相同的格式。例如,使用 host 在容器中使用主机网络,或使用 none 在容器中不设置网络。

作为特殊情况,如果网络的 name.network 结尾,将使用名为 systemd-$name 的 Podman 网络,生成的 systemd 服务包含对 $name-network.service 的依赖项。 此类网络可以通过使用 $name.network Quadlet 文件自动创建。

此键可以多次列出。

PodmanArgs=

此键包含在生成的 service 文件中直接传递到 podman kube play 命令末尾的参数列表(就在命令行中 YAML 文件的路径之前)。它可用于访问生成器不支持的其他 Podman 功能。由于生成器不知道这些参数会导致哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

PublishPort=

将容器中的端口或端口范围(例如 50-59)暴露到主机。等效于 podman kube play--publish 选项。格式类似于 Podman 选项,其形式为 ip:hostPort:containerPortip::containerPorthostPort:containerPortcontainerPort,其中主机端口和容器端口的数量必须相同(在范围的情况下)。

如果 IP 设置为 0.0.0.0 或根本没有设置,则端口绑定在主机的 所有 IPv4 地址上;对于 IPv6,使用 [::]。

单位文件中指定的已发布端口列表与 Kubernetes YAML 文件中指定的端口列表合并。如果在两者中都指定了相同的容器端口和协议,则单位文件中的条目优先

此键可以多次列出。

SetWorkingDirectory=

设置 Systemd 服务单位文件 Service 组的 WorkingDirectory 字段。用于允许 podman kube play 正确解析相对路径。支持的值为 yamlunit,分别将工作目录设置为 YAML 或 Quadlet 单位文件的位置。

或者,用户可以在 .kube 文件中显式设置 Service 组的 WorkingDirectory 字段。请注意,如果设置了 Service 组的 WorkingDirectory 字段,即使设置了 SetWorkingDirectory,Quadlet 也不会设置它

UserNS=

设置容器的用户命名空间模式。这等效于 Podman --userns 选项, 通常具有 MODE[:OPTIONS,...] 的形式。

Yaml=

要使用的 Kubernetes YAML 文件的路径,该路径可以是绝对路径或相对于单位文件位置的路径。

网络单位 [Network]

网络文件使用 .network 扩展名命名,并包含一个 [Network] 部分,描述命名的 Podman 网络。生成的 service 是一个一次性命令,它确保网络存在于主机上,如果需要则创建网络。

默认情况下,Podman 网络与单位具有相同的名称,但带有 systemd- 前缀,即对于名为 $NAME.network 的网络文件,生成的 Podman 网络称为 systemd-$NAME,生成的 service 文件为 $NAME-network.serviceNetworkName 选项允许使用用户提供的名称覆盖此默认名称。

请注意,停止相应的 service 不会删除 podman 网络。此外,不支持更新现有网络。为了更新网络参数,您需要先手动删除 podman 网络,然后重新启动 service。

使用网络单位允许容器依赖于自动预创建的网络。当使用特殊选项来控制网络创建时,这特别有趣,因为 Podman 否则会使用默认选项创建网络。

[Network] 的有效选项列在下面

[Network] 选项

podman network create 等效

ContainersConfModule=/etc/nvd.conf

--module=/etc/nvd.conf

DisableDNS=true

--disable-dns

DNS=192.168.55.1

--dns=192.168.55.1

Driver=bridge

--driver bridge

Gateway=192.168.55.3

--gateway 192.168.55.3

GlobalArgs=--log-level=debug

--log-level=debug

Internal=true

--internal

IPAMDriver=dhcp

--ipam-driver dhcp

IPRange=192.168.55.128/25

--ip-range 192.168.55.128/25

IPv6=true

--ipv6

Label=”XYZ”

--label “XYZ”

NetworkName=foo

podman network create foo

Options=isolate=true

--opt isolate=true

PodmanArgs=--dns=192.168.55.1

--dns=192.168.55.1

Subnet=192.5.0.0/16

--subnet 192.5.0.0/16

[Network] 部分中支持的键为

ContainersConfModule=

加载指定的 containers.conf(5) 模块。等同于 Podman 的 --module 选项。

此键可以多次列出。

DisableDNS=(默认为 false

如果启用,则禁用此网络的 DNS 插件。

这等效于 Podman --disable-dns 选项

DNS=

为该网络中的容器设置网络范围的 DNS 解析器/名称服务器。

此键可以多次列出。

Driver=(默认为 bridge

用于管理网络的驱动程序。目前支持 bridgemacvlanipvlan

这等效于 Podman --driver 选项

Gateway=

为子网定义一个网关。如果您想提供网关地址,您还必须提供子网选项。

这等效于 Podman --gateway 选项

此键可以多次列出。

GlobalArgs=

此键包含在生成的配置文件中直接在 podmannetwork 之间传递的参数列表。它可用于访问生成器不支持的 Podman 功能。由于生成器不知道这些参数会造成哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

Internal=(默认为 false

限制此网络的外部访问。

这等效于 Podman --internal 选项

IPAMDriver=

设置网络的 IPAM 驱动程序(IP 地址管理驱动程序)。目前支持 host-localdhcpnone

这等效于 Podman --ipam-driver 选项

IPRange=

从一个范围中分配容器 IP。该范围必须是 CIDR 表示法中的完整子网,或者采用 <startIP>-<endIP> 语法,与 CIDR 子网相比,这种语法允许更灵活的范围。ip-range 选项必须与子网选项一起使用。

这等效于 Podman --ip-range 选项

此键可以多次列出。

IPv6=

启用 IPv6(双栈)网络。

这等效于 Podman --ipv6 选项

Label=

在网络上设置一个或多个 OCI 标签。格式为 key=value 项目列表,类似于 Environment

此键可以多次列出。

NetworkName=

Podman 网络的(可选)名称。如果未指定,则使用默认值 systemd-%N,它与单元名称相同,但有一个 systemd- 前缀,以避免与用户管理的网络冲突。

Options=

设置驱动程序特定选项。

这等效于 Podman --opt 选项

PodmanArgs=

此键包含在生成的配置文件中直接传递到 podman network create 命令末尾的参数列表(在命令行中网络名称之前)。它可用于访问生成器不支持的 Podman 功能。由于生成器不知道这些参数会造成哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

Subnet=

CIDR 表示法中的子网。

这等效于 Podman --subnet 选项

此键可以多次列出。

卷单位 [卷]

卷文件使用 .volume 扩展名命名,并包含一个名为 [Volume] 的部分,描述了命名的 Podman 卷。生成的 service 是一个一次性命令,它确保卷存在于主机上,如果需要则创建它。

默认情况下,Podman 卷的名称与单元名称相同,但带有一个 systemd- 前缀,即对于名为 $NAME.volume 的卷文件,生成的 Podman 卷名为 systemd-$NAME,生成的 service 文件名为 $NAME-volume.serviceVolumeName 选项允许使用用户提供的名称覆盖此默认名称。

使用卷单元允许容器依赖于自动预先创建的卷。这在使用特殊选项控制卷创建时尤其有用,因为 Podman 否则会使用默认选项创建卷。

[Volume] 中的有效选项如下所示

[卷] 选项

podman volume create 等效项

ContainersConfModule=/etc/nvd.conf

--module=/etc/nvd.conf

Copy=true

--opt copy

Device=tmpfs

--opt device=tmpfs

Driver=image

--driver=image

GlobalArgs=--log-level=debug

--log-level=debug

Group=192

--opt group=192

Image=quay.io/centos/centos:latest

--opt image=quay.io/centos/centos:latest

Label=”foo=bar”

--label “foo=bar”

Options=XYZ

--opt “o=XYZ”

PodmanArgs=--driver=image

--driver=image

Type=type

Device 的文件系统类型

User=123

--opt uid=123

VolumeName=foo

podman volume create foo

[Volume] 部分中支持的键为

ContainersConfModule=

加载指定的 containers.conf(5) 模块。等同于 Podman 的 --module 选项。

此键可以多次列出。

Copy=(默认为 true

如果启用,则在第一次运行时将位于卷挂载点处的映像内容复制到卷中。

Device=

挂载卷的设备路径。

Driver=

指定卷驱动程序名称。当设置为 image 时,Image 键也必须设置。

这等效于 Podman --driver 选项。

GlobalArgs=

此键包含在生成的配置文件中直接在 podmanvolume 之间传递的参数列表。它可用于访问生成器不支持的 Podman 功能。由于生成器不知道这些参数会造成哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

Group=

主机(数字)GID 或用作卷组的组名

Image=

Driver 设置为 image 时,指定卷基于的映像。建议使用完全限定的映像名称,而不是短名称,这既是为了性能,也是为了鲁棒性。

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

作为特殊情况,如果镜像的 name.image 结尾,Quadlet 将使用由相应的 .image 文件拉取的镜像,生成的 systemd 服务包含对 $name-image.service 的依赖项。 请注意,相应的 .image 文件必须存在。

Label=

在卷上设置一个或多个 OCI 标签。格式为 key=value 项目列表,类似于 Environment

此键可以多次列出。

Options=

用于文件系统挂载选项,由 mount(8) 命令 -o 选项使用。

PodmanArgs=

此键包含直接传递到生成的 文件(在命令行中的卷名称之前)中的 podman volume create 命令末尾的参数列表。它可用于访问 Podman 功能,而这些功能在生成器中不受支持。由于生成器不知道这些参数会导致哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

Type=

mount(8) 命令的 -t 选项使用的 Device 的文件系统类型。

User=

主机 (数字) UID 或用户名,用作卷的所有者

VolumeName=

Podman 卷的(可选)名称。如果未指定,则使用默认值 systemd-%N,它与单元名称相同,但带有 systemd- 前缀以避免与用户管理的卷冲突。

构建单元 [构建]

构建文件以 .build 扩展名命名,并包含一个描述镜像构建命令的 [Build] 部分。生成的 服务是一个一次性命令,它确保镜像从提供的 Containerfile 和上下文目录在主机上构建。随后对生成的构建服务的(重新)启动通常会很快完成,因为镜像层缓存将跳过未更改的构建步骤。

一个最小的 .build 单元至少需要 ImageTag= 键,以及 File=SetWorkingDirectory= 键之一。

使用构建单元允许容器和卷依赖于本地构建的镜像。这对于创建容器注册表中不可用的容器镜像或本地测试和开发非常有用。

以下是 [Build] 的有效选项

[构建] 选项

podman 构建等效

Annotation=annotation=value

--annotation=annotation=value

Arch=aarch64

--arch=aarch64

AuthFile=/etc/registry/auth.json

--authfile=/etc/registry/auth.json

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

Environment=foo=bar

--env foo=bar

File=/path/to/Containerfile

--file=/path/to/Containerfile

ForceRM=false

--force-rm=false

GlobalArgs=--log-level=debug

--log-level=debug

GroupAdd=keep-groups

--group-add=keep-groups

ImageTag=localhost/imagename

--tag=localhost/imagename

Label=label

--label=label

Network=host

--network=host

PodmanArgs=--pull never

--pull never

Pull=never

--pull never

Secret=secret

--secret=id=mysecret,src=path

SetWorkingDirectory=unit

设置 systemd 单元文件的 WorkingDirectory

Target=my-app

--target=my-app

TLSVerify=false

--tls-verify=false

Variant=arm/v7

--variant=arm/v7

Volume=/source:/dest

--volume /source:/dest

Annotation=

向镜像元数据添加一个镜像 注释(例如 annotation=value)。可以多次使用。

这等效于 podman build--annotation 选项。

Arch=

覆盖要构建的镜像的体系结构,默认为主机的体系结构。

这等效于 podman build--arch 选项。

AuthFile=

身份验证文件的路径。

这等效于 podman build--authfile 选项。

ContainersConfModule=

加载指定的 containers.conf(5) 模块。等同于 Podman 的 --module 选项。

此键可以多次列出。

DNS=

为构建容器设置网络范围的 DNS 解析器/名称服务器。

此键可以多次列出。

这等效于 podman build--dns 选项。

DNSOption=

设置自定义 DNS 选项。

此键可以多次列出。

这等效于 podman build--dns-option 选项。

DNSSearch=

设置自定义 DNS 搜索域。使用 DNSSearch=. 来删除搜索域。

此键可以多次列出。

这等效于 podman build--dns-search 选项。

Environment=

向构建的镜像添加一个值(例如 env=value)。它使用与 systemd 中的服务 相同的格式,并且可以列出多次。

File=

指定一个 Containerfile,其中包含构建镜像的指令。以 http(s):// 开头的 URL 允许您指定要下载的远程 Containerfile。请注意,对于 Containerfile 的给定相对路径,或使用 http(s):// URL 时,您还必须设置 SetWorkingDirectory=,以便 podman build 找到 Containerfile 中指定的资源的有效上下文目录。

请注意,除非 SetWorkingDirectory(或 Service 组中的 WorkingDirectory)也已设置,否则为 .build 文件设置 File= 字段是强制性的。

这等效于 podman build--file 选项。

ForceRM=

在构建后始终删除中间容器,即使构建失败(默认值为 true)。

这等效于 podman build--force-rm 选项。

GlobalArgs=

此键包含直接在生成的 文件中 podmanbuild 之间传递的参数列表。它可用于访问 Podman 功能,而这些功能在生成器中不受支持。由于生成器不知道这些参数会导致哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

GroupAdd=

将附加组分配给在容器进程中运行的主用户。还支持 keep-groups 特殊标志。

这等效于 podman build--group-add 选项。

ImageTag=

指定如果构建过程成功完成,将分配给结果镜像的名称。

这等效于 podman build--tag 选项。

此键可以列出多次。当 .build 文件被另一个 Quadlet 单元引用时,第一个实例将用作创建的工件的名称。

Label=

向镜像元数据添加一个镜像 标签(例如 label=value)。可以多次使用。

这等效于 podman build--label 选项。

Network=

在处理 RUN 指令时设置网络命名空间的配置。这与 podman build--network 选项具有相同的格式。例如,使用 host 使用主机网络,或使用 none 不设置网络。

作为一种特殊情况,如果网络的name.network结尾,Quadlet将查找对应的.network Quadlet单元。如果找到,Quadlet将使用单元中设置的网络名称,否则将使用systemd-$name。生成的systemd服务包含对为该.network单元生成的service单元的依赖,或者如果未找到.network单元,则依赖于$name-network.service

此键可以多次列出。

PodmanArgs=

此键包含直接传递到生成的 文件中podman build 命令末尾(命令行中的镜像名称之前)的 参数列表。它可以用于访问生成器不支持的Podman功能。由于生成器不知道这些参数可能导致哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

Pull=

设置镜像拉取策略。

这等效于podman build--pull 选项。

Secret=

以安全的方式传递 Containerfile 构建阶段中使用的秘密信息。

这等效于podman build--secret 选项,通常采用secret[,opt=opt ...] 的形式。

SetWorkingDirectory=

podman build 提供上下文(工作目录)。支持的值是路径、URL 或特殊键fileunit,分别将上下文目录设置为File= 键中的文件或 Quadlet .build 单元文件的父目录。这允许 Quadlet 解析相对路径。

当使用特殊键之一(fileunit)时,Systemd 服务单元的Service 组的WorkingDirectory 字段也将相应地设置。或者,用户可以在.build 文件中显式设置Service 组的WorkingDirectory 字段。请注意,如果用户设置了Service 组的WorkingDirectory 字段,即使SetWorkingDirectory 设置为fileunit,Quadlet 也不会覆盖它。

通过为SetWorkingDirectory= 提供 URL,您可以指示podman build 克隆 Git 存储库或下载由podman build 提取到临时位置的存档文件作为构建上下文。请注意,在这种情况下,Systemd 服务单元的WorkingDirectory 会被 Quadlet 保持不变。

请注意,除非也提供了File= 键,否则.build 文件需要提供上下文目录。

Target=

设置要构建的目标构建阶段。Containerfile 中目标阶段后的命令将被跳过。

这等效于podman build--target 选项。

TLSVerify=

在联系注册表时,要求 HTTPS 并验证证书。

这等效于podman build--tls-verify 选项。

Variant=

覆盖要构建的容器镜像的默认体系结构变体。

这等效于podman build--variant 选项。

Volume=

在构建过程中执行 RUN 指令时,将卷挂载到容器。这等效于podman build--volume 选项,通常采用[[SOURCE-VOLUME|HOST-DIR:]CONTAINER-DIR[:OPTIONS]] 的形式。

如果 SOURCE-VOLUME. 开头,Quadlet 将解析相对于单元文件位置的路径。

作为一个特殊情况,如果 SOURCE-VOLUME.volume 结尾,Quadlet 将查找相应的 .volume Quadlet 单位。如果找到,Quadlet 将使用在单位中设置的卷名称,否则,将使用 systemd-$name。生成的 systemd 服务包含对为该 .volume 单位生成的 service 单位的依赖,或者在没有找到 .volume 单位的情况下,依赖于 $name-volume.service

此键可以多次列出。

镜像单元 [Image]

镜像文件以.image 扩展名命名,并包含一个部分[Image] 描述容器镜像拉取命令。生成的service是一个一次性命令,它确保镜像存在于主机上,如果需要,会拉取它。

使用镜像单元允许容器和卷依赖于自动拉取的镜像。当使用特殊选项来控制镜像拉取时,这尤其有趣。

下面列出了[Image] 的有效选项

[Image] 选项

podman image pull 等效项

AllTags=true

--all-tags

Arch=aarch64

--arch=aarch64

AuthFile=/etc/registry/auth.json

--authfile=/etc/registry/auth.json

CertDir=/etc/registry/certs

--cert-dir=/etc/registry/certs

ContainersConfModule=/etc/nvd.conf

--module=/etc/nvd.conf

Creds=myname:mypassword

--creds=myname:mypassword

DecryptionKey=/etc/registry.key

--decryption-key=/etc/registry.key

GlobalArgs=--log-level=debug

--log-level=debug

Image=quay.io/centos/centos:latest

podman image pull quay.io/centos/centos:latest

ImageTag=quay.io/centos/centos:latest

在解析.image 引用时使用此名称

OS=windows

--os=windows

PodmanArgs=--os=linux

--os=linux

TLSVerify=false

--tls-verify=false

Variant=arm/v7

--variant=arm/v7

AllTags=

拉取存储库中的所有标记镜像。

这等效于 Podman 的--all-tags 选项。

Arch=

覆盖要拉取镜像的体系结构,默认为主机。

这等效于 Podman 的--arch 选项。

AuthFile=

身份验证文件的路径。

这等效于 Podman 的--authfile 选项。

CertDir=

使用路径下的证书(*.crt、*.cert、*.key)连接到注册表。

这等效于 Podman 的--cert-dir 选项。

ContainersConfModule=

加载指定的 containers.conf(5) 模块。等同于 Podman 的 --module 选项。

此键可以多次列出。

Creds=

用于对注册表进行身份验证的[username[:password]],如果需要。

这等效于 Podman 的--creds 选项。

DecryptionKey=

用于对镜像进行解密的[key[:passphrase]]

这等效于 Podman 的--decryption-key 选项。

GlobalArgs=

此键包含直接传递到生成的 文件中podmanimage 之间的参数列表。它可以用于访问生成器不支持的Podman功能。由于生成器不知道这些参数可能导致哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

Image=

要拉取的镜像。建议使用完全限定的镜像名称,而不是简短名称,这出于性能和鲁棒性方面的考虑。

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

ImageTag=

引用的Image 的实际 FQIN。仅当源是文件或目录存档时才有意义。

例如,使用以下 Podman 命令将镜像保存到 docker-archive

podman image save --format docker-archive --output /tmp/archive-file.tar quay.io/podman/stable:latest

需要设置

  • Image=docker-archive:/tmp/archive-file.tar

  • ImageTag=quay.io/podman/stable:latest

OS=

覆盖要拉取镜像的操作系统,默认为主机。

这等效于 Podman 的--os 选项。

PodmanArgs=

此键包含直接传递到生成的 文件中podman image pull 命令末尾(命令行中的镜像名称之前)的 参数列表。它可以用于访问生成器不支持的Podman功能。由于生成器不知道这些参数可能导致哪些意外交互,因此不建议使用此选项。

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

此键可以多次列出。

TLSVerify=

在联系注册表时,要求 HTTPS 并验证证书。

这等同于 Podman --tls-verify 选项。

Variant=

覆盖容器镜像的默认架构变体。

这等同于 Podman --variant 选项。

Quadlet 部分 [Quadlet]

一些特定于 quadlet 的配置在不同的单元类型之间共享。这些设置可以在 [Quadlet] 部分中配置。

下面列出了 [Quadlet] 的有效选项

[Quadlet] 选项

描述

DefaultDependencies=false

禁用对单元的隐式网络依赖关系

DefaultDependencies=

将 Quadlet 的默认网络依赖关系添加到单元(默认值为 true)。

当设置为 false 时,Quadlet 不会在生成的单元中添加对 network-online.target/podman-user-wait-network-online.service 的依赖关系(After=,Wants=)。

示例

示例 test.container

[Unit]
Description=A minimal container

[Container]
# Use the centos image
Image=quay.io/centos/centos:latest

# Use volume and network defined below
Volume=test.volume:/data
Network=test.network

# In the container we just run sleep
Exec=sleep 60

[Service]
# Restart service when sleep finishes
Restart=always
# Extend Timeout to allow time to pull the image
TimeoutStartSec=900
# ExecStartPre flag and other systemd commands can go here, see systemd.unit(5) man page.
ExecStartPre=/usr/share/mincontainer/setup.sh

[Install]
# Start by default on boot
WantedBy=multi-user.target default.target

示例 test.kube

[Unit]
Description=A kubernetes yaml based service
Before=local-fs.target

[Kube]
Yaml=/opt/k8s/deployment.yml

[Install]
# Start by default on boot
WantedBy=multi-user.target default.target

在容器中使用本地构建的镜像的示例

test.build

[Build]
# Tag the image to be built
ImageTag=localhost/imagename

# Set the working directory to the path of the unit file,
# expecting to find a Containerfile/Dockerfile
# + other files needed to build the image
SetWorkingDirectory=unit

test.container

[Container]
Image=test.build

示例 test.volume

[Volume]
User=root
Group=root
Label=org.test.Key=value

示例 test.network

[Network]
Subnet=172.16.0.0/24
Gateway=172.16.0.1
IPRange=172.16.0.0/28
Label=org.test.Key=value

Pod 中容器的示例

test.pod

[Pod]
PodName=test

centos.container

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

示例 s3fs.volume

有关更多详细信息,请参阅 s3fs-fuse 项目。请务必阅读 FAQ

注意:启用缓存可以极大地提高静态文件/对象的访问和写入速度。

但是,use_cache无界限的

小心,它会填充通过文件系统访问 s3 存储桶中的所有文件。

请务必设置 S3_BUCKETPATHAWS_REGIONCACHE_DIRECTORY 应该由 systemd 设置

[Service]
CacheDirectory=s3fs
ExecStartPre=/usr/local/bin/aws s3api put-object --bucket ${S3_BUCKET} --key ${PATH}/

[Volume]
Device=${S3_BUCKET}:/${PATH}
Type=fuse.s3fs
VolumeName=s3fs-volume
Options=iam_role,endpoint=${AWS_REGION},use_xattr,listobjectsv2,del_cache,use_cache=${CACHE_DIRECTORY}
# `iam_role` assumes inside EC2, if not, Use `profile=` instead

另请参阅

systemd.unit(5)systemd.service(5)podman-run(1)podman-network-create(1)podman-auto-update(1) [systemd.unit(5)]