跳到主要内容

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

摘要

对于开发者来说,Podman systemd.unit 提供了一种通过 systemd 管理 Podman 容器的机制,使得开发者能够更加高效、稳定地运行和管理容器化应用。

首先,systemd 是一种初始化系统和服务管理器,用于在系统启动时启动和管理系统服务。而 Podman 是一个开源的容器运行时工具,允许开发者在不需要守护进程的情况下运行容器。通过将两者结合,Podman systemd.unit 为开发者提供了一种可靠的方式来管理容器的生命周期。

在 Podman systemd.unit 中,开发者可以通过编写 systemd 单元文件来定义容器的启动、停止、重启等行为。这些单元文件描述了容器的依赖关系、环境变量、资源限制等配置信息,使得开发者能够更加灵活地控制容器的运行方式。

通过使用 Podman systemd.unit,开发者可以确保容器在系统启动时自动运行,无需手动干预。同时,当系统关闭时,容器也会被正确停止,避免了资源泄露和潜在的安全问题。

此外,Podman systemd.unit 还提供了强大的日志和监控功能。开发者可以通过 systemd 的日志系统查看容器的输出日志,了解容器的运行状态和潜在问题。同时,systemd 还提供了监控工具,可以帮助开发者实时了解容器的性能指标和资源使用情况。

对于复杂的容器化应用,Podman systemd.unit 还支持依赖管理和并行处理能力。开发者可以通过定义单元之间的依赖关系,确保容器按照正确的顺序启动和停止。此外,systemd 的并行处理能力可以使得多个容器同时启动,提高了应用的启动速度。

Podman systemd.unit 为开发者提供了一种强大而灵活的方式来管理 Podman 容器。通过编写 systemd 单元文件,开发者可以定义容器的行为、依赖关系、资源限制等配置信息,从而确保容器化应用的高效、稳定运行。

选项

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

Podman rootful 单元搜索路径

root 用户的 Quadlet 文件可以放置在以下两个目录中:

  • /etc/containers/systemd/
  • /usr/share/containers/systemd/

Podman rootless 单元搜索路径

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

  • $XDG_CONFIG_HOME/containers/systemd/ 或 ~/.config/containers/systemd/
  • /etc/containers/systemd/users/$(UID)
  • /etc/containers/systemd/users/

使用符号链接

Quadlet 支持在搜索路径的基础上使用符号链接。不支持在搜索路径下使用符号链接。

描述

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

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

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

源文件还支持与 systemd 相同的方式 的插入。对于给定的源文件(例如 foo.container),对应的 .d 目录(在本例中为 foo.container.d)将扫描具有 .conf 扩展名的文件,并将它们按字母顺序合并到基础文件中。这些插入文件的格式与基础文件相同。这对于修改或添加单元的配置设置很有用,而无需修改单元文件。

对于无根容器,当管理员将 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 超时时间可以解决此问题。

在 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.image 文件,会设置为 oneshot

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

当设置 Type=oneshot 时,建议同时设置 RemainAfterExit=yes,以防止服务状态变为 inactive (dead)

以下是此类情况的示例: -有一个在入口点完成后退出的镜像的 .container 文件 -指向只定义 PVC(Persistent Volume Claims)而不定义任何容器的 Kubernetes Yaml 文件的 .kube 文件

启用单元文件

Podman 创建的服务被 systemd 视为临时的,这意味着它们没有常规单元那样的持久性规则。特别地,无法使用 systemctl enable 来使它们在下次启动时自动启用。

为了弥补这一点,生成器在生成过程中以与 systemctl enable 相同的方式手动将容器定义单元文件的 [Install] 部分应用到这些服务中。

例如,要在启动时启动一个容器,请在文件中添加类似以下内容:

[Install]
WantedBy=default.target

目前仅支持 AliasWantedByRequiredBy 这几个键。

Install 部分可以是主文件的一部分,也可以如上文所述,包含在单独的插入文件中。后者允许你先安装一个非启用的单元,然后通过在后续安装插入文件来启用它。

警告!

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

模板文件

Systemd 支持 模板文件 的概念。它们是以 basename@instancename.service 形式命名的单元,可以从单个 basename@.service 文件实例化多次。不同的实例还可以使用具有完整实例名称的插入文件来区分。

Quadlets 支持这两种模板文件的使用方式。首先,如果 quadlet 单元具有模板形式,则会生成具有模板形式的 systemd 服务,该模板 systemd 服务可以像常规模板一样使用。例如,foo@.container将生成foo@.service,然后你可以使用systemctl start foo@bar.service来启动它。

其次,如果你创建了一个名为foo@instance.container的符号链接,那么将生成一个实例化的模板文件。在生成此文件时,Quadlet 将从实例目录(foo@instance.container.d)和模板目录(foo@.container.d)中读取插入文件。这允许对单个实例进行自定义。

实例化模板文件(如 foo@bar.container)可以像非模板文件一样启用。但是,模板文件(如 foo@.container)是不同的,因为它们需要被实例化。如果 [Install] 部分包含 DefaultInstance= 键,则会启用该实例,否则不会执行任何操作,选项只会被用作使用符号链接实例化的单元的默认值。

一个示例模板文件 sleep@.container 可能如下所示:

[Unit]
Description=A templated sleepy container

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

[Service]
# 当休眠结束时重启服务
Restart=always

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

如果安装了此文件,则在启动时会有一个 sleep@100.service 服务运行,该服务将休眠 100 秒。然后你可以执行类似 systemctl start sleep@50.service 的命令来启动另一个休眠 50 秒的实例,或者另一个服务可以通过依赖关系(如 Wants=sleep@50.service)来启动它。

此外,如果你执行 ln -s sleep@.container sleep@10.container,那么在启动时还将运行一个休眠 10 秒的实例。如果你想让这个特定实例使用另一个镜像运行,你可以创建一个插入文件,如 sleep@10.container.d/10-image.conf

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

调试单元文件

将单元文件放置在上述单元搜索路径之一后,你可以使用 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 在这个目录中查找单元,而不是在常见的目录中查找,从而只将输出限制为你正在调试的单元。

容器单元 [Container]

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

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

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

以下是 [Container] 部分的有效选项列表,以及它们对应的 podman run 等效命令行选项:

[Network] 选项podman network create 选项说明
AddCapability=CAP--cap-add CAP添加指定的Linux功能给容器。
AddDevice=/dev/foo--device /dev/foo将宿主机的设备映射到容器内。
Annotation="XYZ"--annotation "XYZ"为网络设置注释,通常用于记录额外信息。
AutoUpdate=registry--label "io.containers.autoupdate=registry"设置自动更新的标签,用于容器运行时自动更新镜像。
ContainerName=name--name name设置容器的名称。注意:这个选项实际是用于容器而非网络的,可能是个错误或者混淆。
ContainersConfModule=/etc/nvd\.conf--module=/etc/nvd\.conf指定网络模块的配置文件路径。这个选项似乎不是Podman的标准选项,可能是特定于某个环境或版本。
DNS=192.168.55.1--dns=192.168.55.1设置自定义的DNS服务器地址。
DNSOption=ndots:1--dns-option=ndots:1设置DNS解析的选项。
DNSSearch=foo.com--dns-search=foo.com设置DNS搜索域。
DropCapability=CAP--cap-drop=CAP从容器中移除指定的Linux功能。
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容器启动后执行的命令。注意:这个选项似乎有误,通常Podman使用podman exec来在运行的容器中执行命令。
ExposeHostPort=50-59--expose 50-59暴露宿主机的端口范围给容器。注意:这个选项实际是用于容器而非网络的,可能是个错误或者混淆。
GIDMap=0:10000:10--gidmap=0:10000:10设置GID映射关系,用于容器内的用户与宿主机用户之间的映射。
GlobalArgs=--log-level=debug--log-level=debug设置日志级别。注意:这个选项似乎不是直接用于网络创建的,可能是用于全局配置或者特定于某个环境的设置。
Group=1234--user UID:1234设置容器内运行的用户组。注意:这个选项实际是用于容器而非网络的,可能是个错误或者混淆。
HealthCmd=/usr/bin/command--health-cmd=/usr/bin/command设置容器的健康检查命令。注意:这个选项实际是用于容器而非网络的,可能是个错误或者混淆
HealthInterval=2m--health-interval=2m容器健康检查的时间间隔为2分钟。
HealthOnFailure=kill--health-on-failure=kill当健康检查失败时,终止容器。
HealthRetries=5--health-retries=5健康检查失败的重试次数为5次。
HealthStartPeriod=1m--health-start-period=period=1m容器启动后的健康检查等待期为1分钟。
HealthStartupCmd=command--health-startup-cmd=command容器启动时执行的健康检查命令。
HealthStartupInterval=1m--health-startup-interval=1m容器启动时的健康检查时间间隔为1分钟。
HealthStartupRetries=8--health-startup-retries=8容器启动时健康检查失败的重试次数为8次。
HealthStartupSuccess=2--health-startup-success=2容器启动时需要连续成功执行健康检查的次数为2次。
HealthStartupTimeout=1m33s--health-startup-timeout=1m33s容器启动时的健康检查超时时间为1分钟33秒。
HealthTimeout=20s--health-timeout=20s单次健康检查的超时时间为20秒。
HostName=new-host-name--hostname="new-host-name"设置容器的主机名为"new-host-name"。
Image=ubi8ubi8使用"ubi8"镜像创建容器。
IP=192.5.0.1--ip 192.5.0.1设置容器的IPv4地址为192.5.0.1。
IP6=2001:db8::1--ip6 2001:db8::1设置容器的IPv6地址为2001:db8::1。
Label="XYZ"--label "XYZ"为容器设置标签"XYZ"。
LogDriver=journald--log-driver journald设置容器的日志驱动为journald。
Mask=/proc/sys/foo:/proc/sys/bar--security-opt mask=/proc/sys/foo:/proc/sys/bar隐藏或屏蔽指定的系统文件或目录,使其对容器不可见。
Mount=type=...--mount type=...挂载特定类型的文件系统到容器中。
Network=host--net host容器将使用宿主机的网络栈,即容器与宿主机共享IP地址和端口。
NoNewPrivileges=true--security-opt no-new-privileges禁止容器进程及其子进程获得新的权限。
Notify=true--sdnotify container启用systemd通知,允许容器内的systemd服务通过systemd通知机制与宿主机通信。
PidsLimit=10000--pids-limit 10000设置容器内可以创建的进程数限制。
Pod=pod-name--pod=pod-name将容器加入名为“pod-name”的Pod中。
PodmanArgs=--add-host foobar--add-host foobar向容器的/etc/hosts文件中添加主机条目。
PublishPort=50-59--publish 50-59将宿主机的端口范围50-59映射到容器内。
Pull=never--pull=never不从远程仓库拉取镜像,即使本地不存在该镜像。
ReadOnly=true--read-only将容器文件系统设置为只读模式。
ReadOnlyTmpfs=true--read-only-tmpfs将容器内的tmpfs文件系统设置为只读模式。
Rootfs=/var/lib/rootfs--rootfs /var/lib/rootfs指定容器的根文件系统路径。
RunInit=true--init在容器内运行一个初始化进程,负责处理孤儿进程和信号转发。
SeccompProfile=/tmp/s.json--security-opt seccomp=/tmp/s.json使用指定的seccomp配置文件来限制容器内进程的系统调用。
Secret=secret--secret=secret[,opt=opt ...]将宿主机上的敏感信息(如密钥)传递给容器。
SecurityLabelDisable=true--security-opt label=disable禁用容器的SELinux或AppArmor安全标签。
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设置容器内共享内存的大小为100MB。
StopTimeout=20--stop-timeout=20容器停止的超时时间为20秒。
SubGIDMap=gtest--subgidname=gtest使用名为gtest的子GID映射。
SubUIDMap=utest--subuidname=utest使用名为utest的子UID映射。
Sysctl=name=value--sysctl=name=value设置内核参数name的值为value。
Timezone=local--tz local设置容器的时区为本地时区。
Tmpfs=/work--tmpfs /work在容器内挂载一个tmpfs文件系统到/work目录。
UIDMap=0:10000:10--uidmap=0:10000:10设置容器的UID映射关系。
Ulimit=nofile=1000:10000--ulimit nofile=1000:10000设置容器内进程打开文件数的限制为1000,最大值为10000。
Unmask=ALL--security-opt unmask=ALL取消所有安全标签的掩码,使其对容器可见。
User=bin--user bin设置容器内运行进程的用户为bin。
UserNS=keep-id:uid=200,gid=210--userns keep-id:uid=200,gid=210使用用户命名空间,保持容器内进程的用户和组ID为200和210。
Volume=/source:/dest--volume /source:/dest将宿主机的/source目录挂载到容器的/dest目录。
WorkingDir=$HOME--workdir $HOME设置容器内进程的工作目录为环境变量$HOME的值。

这些选项允许你在 .container 单元文件中为容器服务定义运行时的行为。请注意,这些选项必须与 Podman 的文档中的描述相对应,以确保正确的行为。例如,Exec 选项用于指定容器启动时要运行的命令,而 Environment 选项用于设置环境变量。

在创建 .container 单元文件时,你可以根据需要选择这些选项,以定义你的容器服务的具体行为。然后,当 systemd 加载并启动这个服务时,它会使用这些选项来运行 Podman 容器。

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) 组成。- 前缀表示仅当主机上存在该设备时才添加。

这个键可以列出多次。

Annotation=

在容器上设置一个或多个 OCI 注解。其格式与 Environment 类似,为一系列 key=value 项。

这个键可以列出多次。

AutoUpdate=

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

  • registry:要求使用完全限定的镜像引用来创建容器(例如,quay.io/podman/stable:latest)。这是必要的,因为需要知道要检查和拉取的哪个镜像。如果使用镜像 ID,则 Podman 将不知道要检查/拉取哪个镜像。

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

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=

如果设置了此选项,它将定义在容器中运行的命令行。如果没有设置,则使用容器镜像的默认入口点。其格式与 systemd 命令行 相同。

ExposeHostPort=

从主机公开一个端口或一系列端口(例如 50-59)到容器。等效于 Podman 的 --expose 选项。

此键可以列出多次。

GIDMap=

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

此键可以列出多次。

GlobalArgs=

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

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

此键可以列出多次。

使用这些选项时,请确保您了解它们对容器环境和安全性的影响,并谨慎操作。特别是 DropCapability=GIDMap= 等选项,它们能够显著改变容器的权限和隔离级别,从而影响容器的安全性和功能。

Group=

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

HealthCmd=

设置或修改容器的健康检查命令。如果值为 none,则会禁用现有的健康检查。 等效于 Podman 的 --health-cmd 选项。

HealthInterval=

设置健康检查的间隔。间隔设置为 disable 将不设置自动计时器。 等效于 Podman 的 --health-interval 选项。

HealthOnFailure=

一旦容器转换为不健康状态,要采取的操作。 "kill" 操作与 systemd 配合最好。一旦容器变为不健康状态,它将被杀死,systemd 将重启服务。 等效于 Podman 的 --health-on-failure 选项。

HealthRetries=

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

HealthStartPeriod=

容器引导所需的初始化时间。 等效于 Podman 的 --health-start-period 选项。

HealthStartupCmd=

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

HealthStartupInterval=

设置启动健康检查的间隔。间隔设置为 disable 将不设置自动计时器。 等效于 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 选项。

Mask=

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

Mount=

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

对于 type=volume 的特殊情况,如果 source.volume 结尾,那么将使用名为 systemd-$name 的 Podman 命名卷作为源,并且生成的 systemd 服务将包含对 $name-volume.service 的依赖。这样的卷可以通过使用 $name.volume Quadlet 文件来自动创建。

这个键可以列出多次。

Network=

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

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

这个键可以列出多次。

NoNewPrivileges= (默认为 no)

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

Notify= (默认为 no)

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

此外,将 Notify 设置为 healthy 会将启动通知推迟到容器被标记为健康状态时,这由 Podman 的健康检查确定。请注意,这需要设置容器健康检查,更多内容请参阅 HealthCmd 选项。

PidsLimit=

调整容器的进程数限制。这相当于 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= (默认为 no

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

ReadOnlyTmpfs= (默认为 yes

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

Rootfs=

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

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

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

RunInit= (默认为 no

如果启用,容器内部将有一个最小的初始化进程,该进程负责转发信号和回收进程。

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]

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 选项。设置容器内部的 ulimits 值。

这个键可以列出多次。

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 修改,但如果没有指定 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 以及作为服务运行的 pod。生成的服务文件包含一行类似 ExecStartPre=podman pod create … 的内容,而该部分中的大多数键控制传递给 Podman 的命令行选项。

默认情况下,Podman pod 的名称与单元的名称相同,但前面会加上 systemd- 前缀,即 $name.pod 文件会创建一个 $name-pod.service 单元和一个 systemd-$name Podman pod。PodName 选项允许用户用一个自定义的名称来覆盖这个默认名称。

[Pod] 部分的有效选项列举如下:

PodName=:设置 Podman pod 的名称。这允许你自定义 pod 的名称,而不是使用默认的 systemd-$name 格式。

PodInfraContainerImage=:指定用于 Pod 基础容器的镜像。基础容器是 Pod 中的第一个容器,为其他容器提供共享的网络栈和其他资源。

PortMappings=:定义端口映射。格式为 HOSTPORT:CONTAINERPORT,用于将容器内的端口映射到主机上的端口。

DNS=:设置 Pod 使用的 DNS 服务器地址。

DNSSearch=:设置 Pod 的 DNS 搜索域。

Labels=:为 Pod 设置标签。这些标签可以作为查询条件或用于其他 Podman 功能。

Env=:设置环境变量。格式为 VARIABLE=VALUE,这些环境变量将在 Pod 中的容器内可用。

RestartPolicy=:定义 Pod 的重启策略。可能的值包括 no(不重启)、on-failure(仅在容器退出时重启)、always(始终重启)等。

VolumeMappings=:定义卷映射。这些映射允许你将主机上的目录或命名卷挂载到 Pod 中的容器。

HostNetworking=:如果设置为 true,则 Pod 中的容器将使用主机网络栈,而不是创建自己的网络命名空间。

SharePIDNamespace=:如果设置为 true,则 Pod 中的容器将共享 PID 命名空间,允许它们看到彼此的进程。

以下是 [Pod] 部分的有效选项列表:

[Pod] 选项相当于 Podman 容器创建的选项
ContainersConfModule=/etc/nvd.conf--module=/etc/nvd.conf
GlobalArgs=--log-level=debug--log-level=debug 在 Podman 命令行中直接设置
Network=host--network host 在 Podman 命令行中直接设置
PodmanArgs=--cpus=2--cpus=2 在 Podman 命令行中直接设置
PodName=name--name=name 在 Podman 命令行中直接设置
PublishPort=50-59--publish 50-59 在 Podman 命令行中直接设置
Volume=/source:/dest--volume /source:/dest 在 Podman 命令行中直接设置

[Pod] 部分支持的键包括:

ContainersConfModule=

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

这个键可以列出多次。

GlobalArgs=

这个键包含一系列参数,这些参数直接在生成的文件中传递给 podmanpod。它可以用来访问生成器不支持的 Podman 功能。由于生成器无法预知这些参数可能引起的意外交互,因此不建议使用此选项。

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

这个键可以列出多次。

Network=

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

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

这个键可以列出多次。

PodmanArgs=

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

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

这个键可以列出多次。

PodName=

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

请注意,pods 和 containers 不能具有相同的名称。 因此,如果设置了 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= 选项。

这个键可以列出多次。

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 单元生成的服务单元, 或者在找不到 .volume 单元时依赖于 $name-volume.service

这个键可以列出多次。

Kube 单元 [Kube]

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

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

[Kube] 部分支持的选项如下:

选项描述
AutoUpdate=registry如果设置为 registry,则启用基于注册表的自动更新。这是通过添加 io.containers.autoupdate=registry 注解来实现的。
ConfigMap=/tmp/config.map挂载指定的 ConfigMap 到容器中。路径 /tmp/config.map 是 ConfigMap 在容器中的挂载点。
ContainersConfModule=/etc/nvd.conf指定 Podman 的模块配置文件路径。这可以用来覆盖默认的容器配置。
ExitCodePropagation=how定义如何传播容器的错误状态。这可以影响 systemd 如何响应容器退出时的错误状态。
GlobalArgs=--log-level=debug传递给 podman kube play 的全局参数。在这个例子中,设置日志级别为 debug
KubeDownForce=true当使用 podman kube down 命令时,强制停止并删除所有相关的资源。
LogDriver=journald设置容器的日志驱动程序为 journald。这意味着容器的日志将被发送到 systemd 的日志系统。
Network=host将容器的网络设置为宿主机的网络命名空间。
PodmanArgs=--annotation=key=value传递给 podman kube play 的附加参数。在这个例子中,为容器添加一个注解。
PublishPort=59-60发布宿主机的端口范围 59-60 到容器中。这允许从宿主机访问容器内的服务。
SetWorkingDirectory=yaml设置 systemd 单元文件的工作目录为 YAML 文件的位置。这可以帮助在启动脚本中定位相关资源。
UserNS=keep-id:uid=200,gid=210设置用户命名空间,其中 keep-id 保留容器内的用户 ID 和组 ID 不变,uid=200,gid=210 指定容器内的根用户的 UID 和 GID。
Yaml=/tmp/kube.yaml指定要使用的 Kubernetes YAML 文件的路径。这是 podman kube play 命令所必需的。

这些选项允许你更详细地配置如何通过 podman kube play 运行 Kubernetes YAML 文件,并控制 systemd 如何与容器进行交互。

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=

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

GlobalArgs=

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

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

此键可以列出多次。

KubeDownForce=

在调用 podman kube down 时,移除所有资源,包括卷。这相当于 Podman 的 --force 选项。

LogDriver=

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

Network=

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

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

此键可以列出多次。

PodmanArgs=

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

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

此键可以列出多次。

PublishPort=

此选项用于将容器中的端口暴露给主机。这相当于 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 Unit 文件所在的目录。

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

UserNS=

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

Yaml=

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

网络单元文件 [Network]

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

默认情况下,Podman 网络具有与单元相同的名称,但带有 systemd- 前缀。例如,对于名为 $NAME.network 的网络文件,生成的 Podman 网络被称为 systemd-$NAME,而生成的服务文件为 $NAME-network.serviceNetworkName 选项允许用户用一个自定义名称来覆盖这个默认名称。

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

使用网络单元允许容器依赖于网络自动预先创建。当使用特殊选项来控制网络创建时,这尤其有趣,因为 Podman 否则会使用默认选项创建网络。这样,您可以确保在容器启动之前,所需的网络已经存在并配置好了。这对于那些依赖于特定网络配置的应用程序来说是非常有用的。

以下是 [Network] 部分的有效选项列表,以及它们与 podman network create 命令的等效选项,

[Network] 选项podman network create 选项说明
ContainersConfModule=/etc/nvd.conf--module=/etc/nvd.conf指定网络模块的配置文件路径。
DisableDNS=true--disable-dns禁用DNS服务。
DNS=192.168.55.1--dns=192.168.55.1设置自定义的DNS服务器地址。
Driver=bridge--driver bridge设置网络驱动为bridge,即桥接模式。
Gateway=192.168.55.3--gateway 192.168.55.3设置网络的网关地址。
GlobalArgs=--log-level=debug--log-level=debug设置日志级别为debug,适用于网络相关的日志输出。
Internal=true--internal创建内部网络,该网络只能被同一主机上的容器访问。
IPAMDriver=dhcp--ipam-driver dhcp设置IP地址管理驱动为dhcp。
IPRange=192.168.55.128/25--ip-range 192.168.55.128/25设置IP地址范围,用于分配给容器。
IPv6=true--ipv6启用IPv6支持。
Label="XYZ"--label "XYZ"为网络设置标签,方便管理和识别。
NetworkName=foopodman network create foo设置网络的名称。在 podman network create 命令中,网络的名称直接作为命令的一部分给出。
Options=isolate=true--opt isolate=true设置网络选项,这里是设置网络隔离。
PodmanArgs=--dns=192.168.55.1--dns=192.168.55.1这并非 podman network create 的标准选项,可能是用于在配置文件中指定传递给 podman 的额外参数。通常不推荐这种方式,因为它可能导致混淆和错误。
Subnet=192.5.0.0/16--subnet 192.5.0.0/16设置网络的子网掩码和地址范围。

这些选项提供了丰富的配置选项,以便用户可以自定义网络设置,以满足不同的容器化应用需求。注意,不是所有的选项都适用于所有类型的网络或所有版本的 Podman,因此在实际使用时,请参考相关的 Podman 文档以获取最新的信息和用法示例。

[Network] 部分中定义的这些键会转换为相应的 Podman 网络创建命令选项,从而允许用户自定义网络配置。注意,NetworkName 键的值将直接用作 podman network create 命令后的网络名称,而不是作为选项传递。

这些选项允许您在使用网络单元文件时,为 Podman 网络指定各种配置参数。同样,GlobalArgsPodmanArgs 键允许用户在 Podman 命令中使用额外的全局或特定参数,但这些参数将直接附加当您创建服务并启动它时,这些参数将被用来创建或确保存在具有所需配置的 Podman 网络。到命令中,而不是作为特定的网络选项。

请注意,NetworkName 选项允许您指定 Podman 网络的名称。

使用这些键,用户可以在 Quadlet 的网络单元文件中定义 Podman 网络的配置,并在服务启动时自动创建所需的网络。这在网络单元文件中非常有用,因为默认情况下,Podman 网络名称由单元文件名和前缀 systemd- 组成。如果您希望使用不同的网络名称,则可以使用 NetworkName 选项来指定它。

同时,PodmanArgs 选项允许您传递额外的 Podman 命令行参数。然而,如果可能的话,建议直接使用其他更具体的选项,因为这样可以更清晰地表达您的意图,并减少可能的混淆。

ContainersConfModule=

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

此键可以列出多次。

DisableDNS=(默认为 no

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

这相当于 Podman 的 --disable-dns 选项。

DNS=

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

此键可以列出多次。

Driver=(默认为 bridge

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

这相当于 Podman 的 --driver 选项。

Gateway=

为子网定义网关。如果要提供网关地址,则还必须提供子网选项。

这相当于 Podman 的 --gateway 选项。

此键可以列出多次。

GlobalArgs=

此键包含直接传递给 podmannetwork 的参数列表。它可用于访问 Podman 中生成器不支持的其他功能。由于生成器不了解这些参数可能导致的意外交互,因此不建议使用此选项。

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

此键可以列出多次。

请注意,这些键的说明是基于您提供的原始表格中的信息,并添加了额外的解释和细节,以帮助更好地理解每个键的作用和用法。

Internal= (默认为 no)

限制外部访问此网络。

这相当于 Podman 的 --internal 选项。

IPAMDriver=

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

这相当于 Podman 的 --ipam-driver 选项。

IPRange=

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

这相当于 Podman 的 --ip-range 选项。

此键可以列出多次。

IPv6=

启用 IPv6(双栈)网络。

这相当于 Podman 的 --ipv6 选项。

Label=

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

此键可以列出多次。

NetworkName=

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

Options=

设置驱动程序特定的选项。

这相当于 Podman 的 --opt 选项。

Options 键允许用户为网络驱动程序指定额外的配置选项。这些选项取决于所选的网络驱动程序,并且可以用于微调网络的行为以满足特定需求。通过指定这些选项,用户可以在创建网络时提供额外的配置细节,以便更好地控制网络的各个方面。

注意,不是所有的网络驱动程序都支持相同的选项集,因此在使用 Options 键时,应参考所选网络驱动程序的文档以了解可用的选项和它们的作用。此外,错误地配置这些选项可能会导致网络功能异常或不可预测的行为,因此建议仔细验证和测试配置以确保其正确性和可靠性。

PodmanArgs=

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

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

此键可以列出多次。

Subnet=

CIDR 表示法的子网。

这相当于 Podman 的 --subnet 选项。

此键可以列出多次。

卷单元 [Volume]

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

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

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

[Volume] 部分中,支持的键如下:

[Volume]Podman volume create 等价选项说明
ContainersConfModule=/path/to/module.conf--module=/path/to/module.conf指定卷模块的路径。
Copy=true--opt copy允许在卷中复制数据。
Device=tmpfs--opt device=tmpfs使用 tmpfs 设备作为卷的后端存储。
Driver=image--driver=image指定使用特定的驱动程序来创建卷。
GlobalArgs=--log-level=debug--log-level=debug (作为全局参数传递给 Podman)设置 Podman 的日志级别为调试。这通常是全局参数,不直接对应卷的创建。
Group=192--opt group=192设置卷的组所有权。
Image=quay.io/centos/centos:latest--opt image=quay.io/centos/centos:latest当使用 image 驱动程序时,指定基础镜像。
Label="foo=bar"--label "foo=bar"为卷设置一个或多个标签。
Options=XYZ--opt XYZ为卷设置额外的驱动程序特定选项。
PodmanArgs=--driver=image--driver=image (直接传递给 Podman)直接传递给 Podman volume create 命令的参数。
Type=type指定设备的文件系统类型。当使用设备作为卷时,设置其文件系统类型。
User=123--opt uid=123设置卷的用户所有权。
VolumeName=foo不直接对应 Podman 选项定义 Podman 卷的名称。如果不设置,则使用 systemd 单元的名称作为卷名。

请注意,GlobalArgs 键通常用于设置全局 Podman 配置,而不是直接用于卷的创建。其他键则直接映射到 Podman volume create 命令的相应选项。在定义卷时,可以根据需要设置这些键,以满足特定的存储和配置要求。

说明:

这些键用于配置 Quadlet 的卷(Volume)部分,Quadlet 是一个用于生成和管理 Podman 卷的系统服务生成器。每个键都映射到 Podman 的相应选项,以便在创建和管理卷时应用特定的配置。

ContainersConfModule=

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

此键可以列出多次。

Copy=(默认为 yes

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

Device=

要挂载为卷的设备的路径。

Driver=

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

这相当于 Podman 的 --driver 选项。

GlobalArgs=

此键包含直接传递给 Podman 的参数列表,用于 volume。它可用于访问生成器不支持的 Podman 功能。由于生成器无法了解这些参数可能引起的意外交互,因此不建议使用此选项。

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

此键可以列出多次。

Group=

用于卷的主机(数值)GID 或组名。

Image=

Driver 设置为 image 时,指定卷所基于的镜像。建议使用完全限定的镜像名称而不是简短名称,以提高性能和健壮性。

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

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

Label=

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

此键可以列出多次。

说明:

这些键提供了对 Quadlet 配置文件中卷(Volume)部分的额外选项的详细描述。Quadlet 是一个用于生成和管理 Podman 容器和卷的系统服务生成器。

Options=

用于文件系统的挂载选项,类似于 mount(8) 命令的 -o 选项所使用的格式。

PodmanArgs=

此键包含直接传递给 podman volume create 命令末尾的参数列表(在命令行中卷名称之前)。它可用于访问生成器不支持的 Podman 功能。由于生成器无法预知这些参数可能引起的意外交互,因此不建议使用此选项。

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

此键可以列出多次。

Type=

Device 的文件系统类型,类似于 mount(8) 命令的 -t 选项所使用的格式。

User=

用于卷的主机(数值)UID 或用户名。

VolumeName=

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

镜像单元 [Image]

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

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

这些选项是为 [Image] 部分提供的有效选项,它们与 podman image pull 命令的等效选项相对应。下面是每个选项的详细解释:

[Image] 选项podman image pull 等效选项说明
AllTags=true--all-tags拉取所有可用的标签的镜像。
Arch=aarch64--arch=aarch64指定要拉取的镜像的架构为 aarch64。
AuthFile=/etc/registry/auth.json--authfile=/etc/registry/auth.json指定用于认证的文件路径。
CertDir=/etc/registry/certs--cert-dir=/etc/registry/certs指定用于 HTTPS 连接的证书目录。
ContainersConfModule=/etc/nvd.conf--module=/etc/nvd.conf指定用于配置 Podman 行为的模块路径。
Creds=myname:mypassword--creds=myname:mypassword提供用于认证的用户名和密码。
DecryptionKey=/etc/registry.key--decryption-key=/etc/registry.key指定用于解密的密钥文件路径。
GlobalArgs=--log-level=debug--log-level=debug设置全局日志级别为 debug。
Image=quay.io/centos/centos:latestpodman image pull quay.io/centos/centos:latest指定要拉取的镜像的名称和标签。
ImageTag=quay.io/centos/centos:latest用于解析 .image 引用时的镜像名称和标签。当你从 Quadlet 配置文件中的其他部分引用镜像时,将使用这个标签。
OS=windows--os=windows指定要拉取的镜像的操作系统为 Windows。
PodmanArgs=--os=linux--os=linux直接传递给 podman image pull 命令的额外参数。
TLSVerify=false--tls-verify=false不验证 TLS 证书的有效性。
Variant=arm/v7--variant=arm/v7指定要拉取的镜像的变体为 arm/v7。

这些选项允许用户通过 Quadlet 配置文件更精细地控制镜像的拉取行为,以满足特定的需求。

AllTags=

此选项用于拉取仓库中所有标记的镜像。

这相当于 Podman 的 --all-tags 选项。

Arch=

此选项用于覆盖拉取镜像的架构,默认为主机的架构。

这相当于 Podman 的 --arch 选项。

AuthFile=

此选项指定身份验证文件的路径。

这相当于 Podman 的 --authfile 选项。

CertDir=

此选项用于指定连接注册表时使用的证书路径(包括 .crt、.cert、*.key 文件)。

这相当于 Podman 的 --cert-dir 选项。

ContainersConfModule=

此选项用于加载指定的 containers.conf(5) 模块。它相当于 Podman 的 --module 选项。

此键可以列出多次。

Creds=

此选项用于提供注册表的身份验证凭据(如果需要),格式为 [用户名[:密码]]

这相当于 Podman 的 --creds 选项。

DecryptionKey=

此选项用于指定用于镜像解密的密钥,格式为 [密钥[:密码短语]]

这相当于 Podman 的 --decryption-key 选项。

GlobalArgs=

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

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

此键可以列出多次。

请注意,虽然 GlobalArgs 可以为 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 选项。

在使用这些选项时,请确保你了解它们的含义和潜在影响,以确保生成的配置文件能够正确执行预期的 Podman 操作。此外,当使用 PodmanArgsGlobalArgs 等选项时,要特别小心,因为不正确的参数可能会导致配置失败或引入难以调试的问题。

示例

示例 test.container

[Unit]
Description=一个最小化的容器

[Container]
# 使用 centos 镜像
Image=quay.io/centos/centos:latest

# 使用下面定义的卷和网络
Volume=test.volume:/data
Network=test.network

# 在容器中仅运行 sleep 命令
Exec=sleep 60

[Service]
# 当 sleep 结束时重启服务
Restart=always
# 延长启动超时时间以允许拉取镜像
TimeoutStartSec=900
# ExecStartPre 标志和其他 systemd 命令可以放在这里,参见 systemd.unit(5) 手册页
ExecStartPre=/usr/share/mincontainer/setup.sh

[Install]
# 在启动时默认启动
WantedBy=multi-user.target default.target

示例 test.kube

[Unit]
Description=一个基于 Kubernetes YAML 的服务
Before=local-fs.target

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

[Install]
# 在启动时默认启动
WantedBy=multi-user.target default.target

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

参见

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