Featured image of post 【podman实践】设置开机自启动和后台运行

【podman实践】设置开机自启动和后台运行

在 Podman (尤其是 Rootless 环境) 中,设置容器开机自启动目前有两套主流方法。根据你刚才的报错提示,Quadlet 是官方目前最推荐的“新标准”。

以下是详细总结:

方法一:Quadlet 方式 (新标准,推荐)

这种方法不需要你手动创建容器,只需写一个类似 .ini 的配置文件,Systemd 会自动帮你管理。

  1. 开启用户实例持久化 (只需执行一次):

    Bash

    1
    
    loginctl enable-linger $USER
    
  2. 创建配置目录

    Bash

    1
    
    mkdir -p ~/.config/containers/systemd/
    
  3. 编写 .container 文件 (例如 myservice.container):

    Ini, TOML

    1
    2
    3
    4
    5
    6
    7
    8
    
    [Container]
    Image=docker.io/library/nginx:latest
    ContainerName=my-nginx
    Network=host
    # 自动挂载等配置...
    
    [Install]
    WantedBy=default.target
    
  4. 生效

    Bash

    1
    2
    
    systemctl --user daemon-reload
    systemctl --user start myservice.service
    

方法二:传统 Systemd 生成方式 (已过时,但常用)

这是你之前尝试的方法,它基于已经手动创建并运行的容器。

  1. 开启持久化loginctl enable-linger $USER

  2. 生成服务文件

    Bash

    1
    2
    
    mkdir -p ~/.config/systemd/user/
    podman generate systemd --name 容器名 --files --new
    
  3. 激活服务

    Bash

    1
    2
    
    systemctl --user daemon-reload
    systemctl --user enable --now container-容器名.service
    

方法三:Autostart 策略 (最简单,但依赖环境)

如果你的 Podman 版本支持,且你不需要复杂的 Systemd 管理,可以利用 Podman 自带的重启策略:

  1. 启动容器时加上策略

    Bash

    1
    
    podman run -d --restart always --name my-app ...
    
  2. 启动 Podman 重启服务:

    必须启动系统自带的 podman-restart 服务,它会在开机时检查所有标记为 always 的容器:

    Bash

    1
    
    systemctl --user enable --now podman-restart.service
    

核心对比与建议

特性Quadlet (方法一)传统 Systemd (方法二)Restart 策略 (方法三)
官方态度推荐 (新标准)已弃用 (Deprecated)补充方案
配置方式声明式 (改文件即改容器)过程式 (先有容器后有服务)属性式 (run 参数)
适用场景长期运行的服务、基础设施临时容器快速转服务简单的单容器重启
优点干净、Systemd 原生支持简单直接学习成本最低
热爱生活 学无止境
使用 Hugo 构建
主题 StackJimmy 设计