Podman 是替代 Docker 的无守护程序,它与大部分 Docker 容器兼容。
创建 Quadlet(对于 Podman 4.4+)
从版本 4.4 开始,Podman 使用 quadlets ,如果您使用以前的 generate systemd
方法,则会显示一个警告。
额外的好处是此方法将使容器保持更新。
通过环境文件配置
在环境文件中进行配置可能会更容易并且不易出错。
注意:此文件包含机密,请确保只有 root 拥有访问权限!
复制 sudo install -o0 -g0 -m600 /dev/null /etc/vaultwarden.env
sudo vi /etc/vaultwarden.env
复制 # Contents of /etc/vaultwarden.env
ROCKET_PORT = 8080
# DISABLE_ADMIN_TOKEN=true
# ADMIN_TOKEN=$argon2id$...
# LOG_LEVEL=debug
创建 podman Quadlet
配置看起来像 systemd 的,但我们配置的是容器,而不是单元。请参阅所有 [Container]
指令的文档 。
复制 # Content of /usr/share/containers/systemd/vaultwarden.container
[Unit]
Description = Vaultwarden container
After = network-online.target
[Container]
AutoUpdate = registry
Image = ghcr.io/dani-garcia/vaultwarden:latest
Exec = /start.sh
EnvironmentFile = /etc/vaultwarden.env
Volume = /vw-data/:/data/
PublishPort = 8080 :8080
[Install]
WantedBy = default.target
编辑 quadlet 后,运行 systemctl daemon-reload
以创建或更新 systemd 单元。您可以使用常规的 systemctl
命令控制此容器,例如 systemctl start vaultwarden.service
。
自动更新
自动更新 可自动执行更新过程:
复制 sudo podman auto-update
或者,您可以启用定时器,它会每天自动更新(默认情况下,可以编辑):
复制 sudo systemctl enable podman-auto-update.timer
创建一个 systemd 服务文件(对于老版本的 Podman)
由于 Podman 的无守护程序架构,它比 Docker 更容易在 systemd 中运行。它带有一个便捷的 generate syetemd 命令 ,该命令可以生成 systemd 文件。这里有一篇不错的文章详细介绍了它 ,还有这篇文章也详细介绍了一些最新的更新 。
复制 $ podman run -d --name vaultwarden -v /vw-data/:/data/:Z -e ROCKET_PORT=8080 -p 8080:8080 vaultwarden/server:latest
54502f309f3092d32b4c496ef3d099b270b2af7b5464e7cb4887bc16a4d38597
$ podman generate systemd --name vaultwarden
# container-foo.service
# autogenerated by Podman 1.6.2
# Tue Nov 19 15:49:15 CET 2019
[Unit]
Description = Podman container-foo.service
Documentation = man:podman-generate-systemd(1)
[Service]
Restart = on-failure
ExecStart = /usr/bin/podman start vaultwarden
ExecStop = /usr/bin/podman stop -t 10 vaultwarden
KillMode = none
Type = forking
PIDFile=/run/user/1000/overlay-containers/54502f309f3092d32b4c496ef3d099b270b2af7b5464e7cb4887bc16a4d38597/userdata/conmon.pid
[Install]
WantedBy = multi-user.target default.target
您可以提供 --files
标志告诉 podman 将 systemd 服务放到一个文件中,或使用 podman generate systemd --name vaultwarden > /etc/systemd/system/container-vaultwarden.service
。这样,我们就可以像任何正常的服务文件一样启用和启动容器了。
复制 $ systemctl --user enable /etc/systemd/system/container-vaultwarden.service
$ systemctl --user start container-vaultwarden.service
每次重启时新建容器
如果我们希望每次服务启动时都创建一个新的容器,可以使用 podman generate systemd --new
命令生成一个重新创建容器的服务文件:
复制 $ podman generate systemd --new --name vaultwarden
如果您使用的是旧版 Podman,则可以编辑服务文件以包含如下内容:
复制 [Unit]
Description = Podman container-vaultwarden.service
[Service]
Restart = on-failure
ExecStartPre = /usr/bin/rm -f / %t / %n -pid / %t / %n -cid
ExecStart=/usr/bin/podman run --conmon-pidfile /%t/%n-pid --cidfile /%t/%n-cid --env-file=/home/spytec/Vaultwarden/vaultwarden.conf -d -p 8080:8080 -v /home/spytec/Vaultwarden/vw-data:/data/:Z vaultwarden/server:latest
ExecStop = /usr/bin/podman stop -t "15" --cidfile / %t / %n -cid
ExecStop = /usr/bin/podman rm -f --cidfile / %t / %n -cid
KillMode = none
Type = forking
PIDFile = / %t / %n -pid
[Install]
WantedBy = multi-user.target default.target
环境文件 vaultwarden.conf
可以包含您需要的容器的所有环境值,比如:
如果您希望此容器拥有特定的名称,则需要添加 ExecStartPre=/usr/bin/podman rm -i -f vaultwarden
,如果进程未被正确清理的话。注意,此方式当前无法与具有 User=
选项的用户一起正常工作(见 https://github.com/containers/podman/issues/5572 )。
故障排除
调试 systemd 服务文件
如果主机出现故障或容器崩溃,则 systemd 服务文件应自动停止现有容器并将其重新启动。可以通过 journalctl --user -u container-vaultwarden -t 100
来定位错误。
在大多数情况下,我们可以通过简单地增加服务文件中的 podman 命令的超时时间来解决我们看到的错误。