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设置,使用以下命令更改生成的文件 restoreconchcon ,或 semanage 可能需要允许SYSTEM D访问这些文件。或者,使用 -Z 运行时的选项 mvcp

--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 statusjournalctl 检查容器或吊舱单元文件。

$ 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)