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
目前仅支持 Alias
、WantedBy
和 RequiredBy
这几个键。
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=ubi8 | ubi8 | 使用"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=
此键包含一系列参数,这些参数直接在生成的文件中传递给 podman
和 run
。它可用于访问 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:containerPort
、ip::containerPort
、hostPort:containerPort
或 containerPort
,其中主机和容器的端口数量必须相同(在范围的情况下)。
如果将 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=
这个键包含一系列参数,这些参数直接在生成的文件中传递给 podman
和 pod
。它可以用来访问生成器不支持的 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:containerPort
、ip::containerPort
、hostPort:containerPort
或 containerPort
,
其中主机和容器的端口数量必须相同(在范围的情况下)。
如果 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 在指定的容器名称上执行local
或registry
的自动更新。
ConfigMap=
通过 --configmap
参数将 Kubernetes ConfigMap YAML 路径传递给 podman kube play
。与 configmap
参数不同,此值只能包含一个路径,该路径可以是绝对的,也可以是相对于单元文件位置的相对路径。
此键可多次使用。
ContainersConfModule=
加载指定的 containers.conf(5) 模块。这相当于 Podman 的 --module
选项。
此键可以列出多次。
ExitCodePropagation=
控制 systemd 服务的主 PID 应如何退出。支持以下值:
all
:如果所有容器都失败(即,退出状态非零),则退出非零
any
:如果有任何容器失败,则退出非零
none
:忽略失败的容器并退出零
当前的默认值是 none
。
GlobalArgs=
此键包含直接传递给 podman
和 kube
之间的参数列表,位于生成的文件中。它可用于访问 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:containerPort
、ip::containerPort
、hostPort:containerPort
或 containerPort
,其中主机和容器的端口数量必须相同(在指定端口范围时)。
如果 IP 设置为 0.0.0.0 或未设置,端口将绑定到主机上的所有 IPv4 地址;使用 [::] 表示 IPv6。
在单元文件中指定的已发布端口列表将与 Kubernetes YAML 文件中指定的端口列表合并。如果在两者中都指定了相同的容器端口和协议,则单元文件中的条目将优先。
此键可以列出多次。
SetWorkingDirectory=
设置 Systemd 服务单元文件中 Service
组的 WorkingDirectory
字段。允许 podman kube play
正确解析相对路径。支持的值有 yaml
和 unit
,分别用于将工作目录设置为 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.service
。NetworkName
选项允许用户用一个自定义名称来覆盖这个默认名称。
请注意,停止相应的服务并不会删除 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=foo | podman 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 网络指定各种配置参数。同样,GlobalArgs
和 PodmanArgs
键允许用户在 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
)
用于管理网络的驱动程序。目前支持 bridge
、macvlan
和 ipvlan
。
这相当于 Podman 的 --driver
选项。
Gateway=
为子网定义网关。如果要提供网关地址,则还必须提供子网选项。
这相当于 Podman 的 --gateway
选项。
此键可以列出多次。
GlobalArgs=
此键包含直接传递给 podman
和 network
的参数列表。它可用于访问 Podman 中生成器不支持的其他功能。由于生成器不了解这些参数可能导致的意外交互,因此不建议使用此选项。
此键的格式是一个由空格分隔的参数列表,这些参数可以单独转义以允许包含空格和其他控制字符。
此键可以列出多次。
请注意,这些键的说明是基于您提供的原始表格中的信息,并添加了额外的解释和细节,以帮助更好地理解每个键的作用和用法。
Internal=
(默认为 no
)
限制外部访问此网络。
这相当于 Podman 的 --internal
选项。
IPAMDriver=
设置网络的 IP 地址管理驱动程序(IPAM Driver)。目前支持 host-local
、dhcp
和 none
。
这相当于 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.service
。VolumeName
选项允许用户通过提供自定义名称来覆盖此默认名称。
使用卷单元允许容器依赖于自动预创建的卷。当使用特殊选项来控制卷创建时,这尤其有用,因为 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:latest | podman 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=
此键包含直接在 podman
和 image
之间传递的参数列表,在生成的文件中使用。它可以用来访问 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 操作。此外,当使用 PodmanArgs
或 GlobalArgs
等选项时,要特别小心,因为不正确的参数可能会导致配置失败或引入难以调试的问题。
示例
示例 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)