NAME¶
播客-生成-系统- [DEPRECATED] 为容器或Pod生成系统单位文件(S)
SYNOPSIS¶
podman generate systemd [options] container|pod
DESCRIPTION¶
已弃用:注意: podman generate systemd 已弃用。我们建议您使用 [Quadlet] (podman-systemd.unit.5.md)文件,在系统下运行Podman容器或Pod。目前还没有移除该命令的计划。它将收到紧急的错误修复,但不会有新的功能。
podman generate systemd 创建可用于控制容器或Pod的系统单位文件。默认情况下,该命令将单元文件的内容打印到stdout。
为Pod生成单元文件需要使用基础设施容器创建Pod(请参见 --infra=true
)。下面的容器贯穿吊舱的整个生命周期,因此系统d需要它来管理吊舱主单元的生命周期。
注意:在远程客户端(包括Mac和Windows(不包括WSL2)计算机)上使用此命令时,请将生成的单元放在远程系统上。此外,请确保
XDG_RUNTIME_DIR
设置了环境变量。如果未设置,则通过export XDG_RUNTIME_DIR=/run/user/$(id -u)
._注:生成的
podman run
命令包含一个--sdnotify
选项的值,该值取自容器。如果容器没有任何显式设置的值,或者该值设置为 ignore, 价值 conmon 使用的是。覆盖缺省值的原因 container 几乎没有容器工作负载发送通知消息。如果值为 container 用于不发送通知消息的容器。用户可能无意中使用了缺省值,因此改写了缺省值 value._
库伯内斯集成¶
一个Kubernetes YAML可以通过 podman-kube@.service
SYSTEM D模板。模板的参数是YAML文件的路径。给出了一个 workload.yaml
主目录中的文件,则可以执行如下操作:
$ escaped=$(systemd-escape ~/workload.yaml)
$ systemctl --user start podman-kube@$escaped.service
$ systemctl --user is-active podman-kube@$escaped.service
active
OPTIONS¶
--after = dependency_name¶
在以下位置添加system d单位 (After=
)选项,对依赖项列表和该服务之间的依赖项进行排序。可以多次指定此选项。
用户定义的依赖项被附加到生成的单元文件,但默认情况下需要或定义的任何现有选项(例如, online.target
)是 not 删除或覆盖。
--container-prefix = 前缀¶
设置容器的系统单位名称前缀。默认为 容器 。
--env , -e = env¶
将环境变量设置为system d单位文件。
如果指定的环境变量没有值,Podman将检查主机环境中的值,并仅在主机上设置了该变量时才设置该变量。作为特例,如果环境变量以 * 时,Podman将在主机环境中搜索以前缀开头的变量,并将这些变量添加到系统单元文件中。
--files , -f¶
生成文件,而不是打印到标准输出。生成的文件被命名为{CONTAINER,Pod}-{ID,NAME}.service,放置在当前工作目录中。
注意:在启用了SELinux的系统上,生成的文件继承当前工作目录的上下文。根据SELinux设置,使用以下命令更改生成的文件 restorecon
, chcon
,或 semanage
可能需要允许SYSTEM D访问这些文件。或者,使用 -Z
运行时的选项 mv
或 cp
。
--format = 格式化¶
以指定格式(Json)打印创建的单位。如果 --files
则打印所创建文件的路径,而不是打印单位内容。
--name , -n¶
使用容器的名称作为单元文件中的开始、停止和描述
--new¶
此选项会生成不需要容器和Pod的单元文件。相反,新的容器和Pod是根据其配置文件创建的。单元文件是尽最大努力创建的,可能需要进一步编辑;在将其用于生产之前,请仔细检查生成的文件。
请注意 --new
仅适用于通过Podman直接创建的容器和吊舱(即, podman [container] {create,run}
或 podman pod create
)。它不适用于通过REST API或VIA创建的容器或Pod podman kube play
。为 podman kube play
,请使用 podman-kube@.service
而是使用SYSTEM D模板。
--no-header¶
不生成包含元数据的标头,例如Podman版本和时间戳。
--pod-prefix = 前缀¶
设置Pod的系统单元名称前缀。默认为 pod 。
--requires = dependency_name¶
设置所需的系统D单位 (Requires=
)选项。类似于Want,但声明了更强的需求依赖关系。
--restart-policy = 政策¶
设置systemd重启策略。重新启动策略必须是以下之一:“否”、“成功”、“失败”、“异常”、“监视狗”、“中止”或“始终”。默认策略为 on-failure 除非容器是使用自定义重启策略创建的。
请注意,在生成单元时不使用 --new
在使用自定义重新启动策略的容器上,可能会导致关机问题;在Podman尝试重新启动单元时,systemd会尝试停止该单元。在没有创建容器的情况下 --restart
并使用 --restart-policy
建议在生成单元文件时选择此选项。
--restart-sec = time¶
设置系统服务重新启动秒值。配置重新启动服务之前的休眠时间(如使用Restart-Policy配置的一样)。以秒为单位取值。
--separator = 分离器¶
在容器/Pod的名称/ID和前缀之间设置系统单元名称分隔符。默认为 - 。
--start-timeout = value¶
用给定值(以秒为单位)覆盖容器的默认启动超时。
--stop-timeout = value¶
用给定值(秒)覆盖容器的默认停止超时。
--template¶
添加模板说明符,以从系统单元文件运行多个服务。
请注意,如果 --new
未设置为True,则默认情况下设置为True。但是,如果出现以下情况,该命令将失败 --new
设置为 false
明确地说。
--wants = dependency_name¶
添加system d单位想要的 (Wants=
)选项,该服务依赖于(弱)。可以多次指定此选项。此选项不影响服务的启动或停止顺序。
用户定义的依赖项被附加到生成的单元文件,但默认情况下需要或定义的任何现有选项(例如, online.target
)是 not 删除或覆盖。
EXAMPLES¶
生成并打印容器的系统单位文件¶
为运行nginx的容器生成一个系统d单元文件 始终 重新启动策略并将1秒超时设置为标准超时。请注意, RequiresMountsFor 选项中的 Unit 部分确保在启动服务之前装入GraphRoot和RunRoot的容器存储。对于在磁盘上具有容器存储的系统(如iSCSI或其他远程数据块协议),这可确保在任何必要的存储操作上线之前不会执行Podman。
$ podman create --name nginx nginx:latest
$ podman generate systemd --restart-policy=always -t 1 nginx
# container-de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6.service
# autogenerated by Podman 1.8.0
# Wed Mar 09 09:46:45 CEST 2020
[Unit]
Description=Podman container-de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/var/run/container/storage
[Service]
Restart=always
ExecStart=/usr/bin/podman start de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6
ExecStop=/usr/bin/podman stop \
-t 1 de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6
KillMode=none
Type=forking
PIDFile=/run/user/1000/overlay-containers/de1e3223b1b888bc02d0962dd6cb5855eb00734061013ffdd3479d225abacdc6/userdata/conmon.pid
[Install]
WantedBy=default.target
为容器生成system d单位文件,使用 --new
旗子¶
这个 --new
FLAG生成在服务启动和停止命令时创建和删除容器的系统单元文件(请参阅ExecStartPre和ExecStopPost服务操作)。这样的单元文件不绑定到一台机器上,可以很容易地在其他机器上共享和使用。
$ sudo podman generate systemd --new --files --name bb310a0780ae
# container-busy_moser.service
# autogenerated by Podman 1.8.3
# Fri Apr 3 09:40:47 EDT 2020
[Unit]
Description=Podman container-busy_moser.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/var/run/container/storage
[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
ExecStartPre=/bin/rm -f %t/%n-pid %t/%n-cid
ExecStart=/usr/local/bin/podman run \
--conmon-pidfile %t/%n-pid \
--cidfile %t/%n-cid \
--cgroups=no-conmon \
-d \
-dit alpine
ExecStop=/usr/local/bin/podman stop \
--ignore \
--cidfile %t/%n-cid -t 10
ExecStopPost=/usr/local/bin/podman rm \
--ignore \
-f \
--cidfile %t/%n-cid
PIDFile=%t/%n-pid
KillMode=none
Type=forking
[Install]
WantedBy=default.target
使用两个简单的阿尔卑斯山容器为Pod生成系统单元文件¶
注意事项 systemctl
只能在吊舱单元上使用,不能单独用于启动或停止集装箱。容器与内部下容器一起由Pod服务管理。
使用 systemctl status
或 journalctl
检查容器或吊舱单元文件。
$ podman pod create --name systemd-pod
$ podman create --pod systemd-pod alpine top
$ podman create --pod systemd-pod alpine top
$ podman generate systemd --files --name systemd-pod
/home/user/pod-systemd-pod.service
/home/user/container-amazing_chandrasekhar.service
/home/user/container-jolly_shtern.service
$ cat pod-systemd-pod.service
# pod-systemd-pod.service
# autogenerated by Podman 1.8.0
# Wed Mar 09 09:52:37 CEST 2020
[Unit]
Description=Podman pod-systemd-pod.service
Documentation=man:podman-generate-systemd(1)
Requires=container-amazing_chandrasekhar.service container-jolly_shtern.service
Before=container-amazing_chandrasekhar.service container-jolly_shtern.service
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/var/run/container/storage
[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start 77a818221650-infra
ExecStop=/usr/bin/podman stop \
-t 10 77a818221650-infra
KillMode=none
Type=forking
PIDFile=/run/user/1000/overlay-containers/ccfd5c71a088768774ca7bd05888d55cc287698dde06f475c8b02f696a25adcd/userdata/conmon.pid
[Install]
WantedBy=default.target
安装生成的系统单元文件。¶
Podman生成的单元文件包括 [Install]
部分,其中包含设备的安装信息。在安装过程中,系统ctl(1)的启用和禁用命令使用它。
生成SYSTEM D单元文件后,将其安装到 /etc/systemd/system 由超级用户运行或 $HOME/.config/systemd/user 将其作为非根用户安装。使用启用复制的一个或多个单元文件 systemctl enable
。
注意:将设备文件复制到 /etc/systemd/system 并且启用它标志着单元文件在引导时被自动启动。类似地,将单元文件复制到 $HOME/.config/systemd/user 并使能它标志着该单元文件在用户登录时自动启动。
# Generated systemd files.
$ podman pod create --name systemd-pod
$ podman create --pod systemd-pod alpine top
$ podman generate systemd --files --name systemd-pod
# Copy all the generated files.
$ sudo cp pod-systemd-pod.service container-great_payne.service /etc/systemd/system
$ systemctl enable pod-systemd-pod.service
Created symlink /etc/systemd/system/multi-user.target.wants/pod-systemd-pod.service → /etc/systemd/system/pod-systemd-pod.service.
Created symlink /etc/systemd/system/default.target.wants/pod-systemd-pod.service → /etc/systemd/system/pod-systemd-pod.service.
$ systemctl is-enabled pod-systemd-pod.service
enabled
要运行中放置的用户服务,请执行以下操作 $HOME/.config/systemd/user
在该用户首次登录时,使用--USER标志启用该服务。
$ systemctl --user enable <.service>
在关闭该用户的最后一个会话后,将终止该系统用户实例。通过启用以下选项,可以在引导时启动system d用户实例并保持其运行,即使用户注销之后也是如此 lingering
使用
$ loginctl enable-linger <username>
使用 systemctl
对生成的已安装单元文件执行操作。¶
使用上面的示例作为参考,为Pod创建并启用系统单元文件 systemctl
去做手术。
因为系统ctl默认使用根用户,所以可以通过将sudo附加到podman cli命令来查看使用系统ctl的所有更改。表演,表演 systemctl
以非根用户身份执行的操作使用 --user
与之交互时的标志 systemctl
。
注意:如果以前创建的容器或Pod正在使用共享资源,如端口,请确保在启动生成的系统单元之前将其删除。
$ systemctl --user start pod-systemd-pod.service
$ podman pod ps
POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID
0815c7b8e7f5 systemd-pod Running 29 minutes ago 2 6c5d116f4bbe
$ sudo podman ps # 0 Number of pods on root.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ systemctl stop pod-systemd-pod.service
$ podman pod ps
POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID
272d2813c798 systemd-pod Exited 29 minutes ago 2 6c5d116f4bbe
创建一个简单的阿尔卑斯山容器并使用以下命令生成系统单元文件 --new
旗帜。使用系统ctl命令启用服务和控制操作。
注意:使用以下命令启动容器时 systemctl start
它不是改变已经运行的容器,而是创建一个具有类似配置的“新”容器。
# Enable the service.
$ sudo podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb310a0780ae docker.io/library/alpine:latest /bin/sh 2 minutes ago Created busy_moser
$ sudo systemctl start container-busy_moser.service
$ sudo podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
772df2f8cf3b docker.io/library/alpine:latest /bin/sh 1 second ago Up 1 second distracted_albattani
bb310a0780ae docker.io/library/alpine:latest /bin/sh 3 minutes ago Created busy_moser
另请参阅¶
podman(1) , podman-container(1) , systemctl(1) , systemd.unit(5) , systemd.service(5) , conmon(8) , podman-systemd.unit(5)
HISTORY¶
2020年4月,更新了详细信息,并添加了使用生成的.service文件作为根用户和非根用户的用例,作者为Sujil Shah(sushah来自redhat.com)
2019年8月,由Valentin Rothberg更新Pod支持(Rothberg at redhat.com)
2019年4月,最初由布伦特·鲍德(Brent Baude)汇编(在redhat.com网站上bbaude)