Podman容器开机自启

Podman是没有像docker-daemon守护进程的,开机启动需要利用Linux系统的 systemd 实现开机启动。

实现podman容器开机自启 3种方式:

  1. 使用 podman-restart.service,操作比较方便
  2. 使用 podman generate systemd 生成启动*.service
  3. 使用 Quadlet 实现(本文未涉及),可参考 Make systemd better for Podman with Quadlet

一、使用 podman-restart.service

和 Docker 一样设置 --restart 选项,而 Podman 依赖 podman-restart.service 实现开机启动:

容器使用 --restart 选项:

podman run -it  --restart=always -d redis

# 启动 podman-restart 服务
systemctl --user enable --now podman-restart

# 不登录用户,也开启 systemd 服务。否则 退出用户服务就停止了!!!
loginctl enable-linger <username>

说明:启动 podman-restart,才能实现开机自启。

compose中配置 restart:
serivces:
  app:
    build: .
    restart: always

二、使用 podman generate systemd 实现开机自启

在创建服务之前,先区分 镜像、容器、吊舱(Pod)概念。
这里服务本身是基于 容器或吊舱的,所以需先创建 容器或吊舱。

# 先创建容器,同运行一样。podman run --name 是创建并运行
podman create --name <容器名称> \
  -p <主机端口>:<容器端口> \
  -e <环境变量名>=<环境变量值> \
  <镜像名称>
2.1 容器或Pod生成 .service 文件
# --name 指定名称的容器/pod,而非容器ID
podman generate systemd --files --name <pod/conatainer_name>

# 移动到用户目录,并启动
mv container-*.service  ~/.config/systemd/user/

systemctl --user enable --now container-*
2.2 compose.yml 文件生成 .service
podman-compose --in-pod pod_name up --no-start
sudo podman-compose systemd -a create-unit
podman-compose systemd -a register

三、操作案例

使用 podman-compose 启动后,podman-compose pspodman ps 获取当前的容器名(NAMES),根据容器名创建:

# vap_minio 就是容器名,默认是 到标准输出 控制台
podman generate systemd --name vap_minio

# --files 保存到文件
podman generate systemd --files --name vap_minio

# 生成在当前目录,名为 container-xxx.service
# 用户 服务 在 ~/.config/systemd/user/ 目录
mv container-*.service ~/.config/systemd/user/

# --now 是否立即启动,还是下次 系统启动时
systemctl --user enable --now container-*

注:但是以登录用户 启动,当用户退出时,就会 停止 服务。

解决方法:

  1. 使用 loginctl enable-linger <username> 启用用户常驻
  2. 改为 系统服务方式

移动到系统目录:

mv container-*.service /etc/systemd/system

cd /etc/systemd/system

systemctl enable --now container-*

文档

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐