在 AMH 面板环境中,Podman 可能不是完全由 Debian 官方软件包提供,而是由 AMH/ampod 安装在 /usr/local/ampod-1.0/ 下。因此,配置容器开机启动、systemd 管理、镜像自动更新和 Docker Hub 加速时,需要特别注意 Podman、conmon 与 OCI runtime 的实际路径。
本文以 Debian 和 AMH 的 ampod 环境为例,并使用 frps 容器演示完整配置流程。
一、环境与目标
本文示例环境:
系统:Debian 面板:AMH Podman:AMH/ampod 提供 Podman 目录:/usr/local/ampod-1.0/podman/bin/ conmon/runc 目录:/usr/local/ampod-1.0/conmon/bin/ Docker Hub 加速地址:https://registry.ixnic.net 示例容器:frps
最终实现:
- 使用 Podman 创建容器;
- 容器由 systemd 管理并随系统启动;
- 通过
podman auto-update自动检查和更新镜像; - Docker Hub 镜像通过
registry.ixnic.net加速拉取; - 自动更新失败时可通过 journalctl 排查。
二、确认 Podman、conmon 和 runc 路径
首先查看当前终端实际调用的 Podman:
command -v podman readlink -f "$(command -v podman)" podman --version
AMH/ampod 环境通常还存在以下文件:
ls -l /usr/local/ampod-1.0/podman/bin/ ls -l /usr/local/ampod-1.0/conmon/bin/
常见结果:
/usr/local/ampod-1.0/podman/bin/podman /usr/local/ampod-1.0/conmon/bin/conmon /usr/local/ampod-1.0/conmon/bin/runc
测试 conmon 和 runc:
/usr/local/ampod-1.0/conmon/bin/conmon --version /usr/local/ampod-1.0/conmon/bin/runc --version
检查动态链接库是否缺失:
ldd /usr/local/ampod-1.0/conmon/bin/conmon | grep 'not found' ldd /usr/local/ampod-1.0/conmon/bin/runc | grep 'not found'
没有输出通常表示未发现缺失的动态库。
解决 Podman 找不到 conmon 的问题
如果出现:
Error: could not find a working conmon binary
创建或修改 /etc/containers/containers.conf:
mkdir -p /etc/containers cat >/etc/containers/containers.conf <<'EOF' [engine] conmon_path = [ "/usr/local/ampod-1.0/conmon/bin/conmon", "/usr/bin/conmon", "/usr/sbin/conmon" ] runtime = "/usr/local/ampod-1.0/conmon/bin/runc" EOF
如果该文件已经有其他有效配置,应将以上 [engine] 参数合并进去,不要盲目覆盖原配置。
验证:
podman info --debug | grep -Ei 'conmon|runtime'
正常结果应包含:
conmon: path: /usr/local/ampod-1.0/conmon/bin/conmon ociRuntime: path: /usr/local/ampod-1.0/conmon/bin/runc
三、补全镜像签名策略 policy.json
如果 Podman 拉取镜像时出现:
Error: open /etc/containers/policy.json: no such file or directory
可以创建镜像签名策略文件。
下面的配置默认拒绝其他来源,只允许 Docker Hub 和自建加速地址中的镜像不经过签名验证:
mkdir -p /etc/containers
cat >/etc/containers/policy.json <<'EOF'
{
"default": [
{
"type": "reject"
}
],
"transports": {
"docker": {
"docker.io": [
{
"type": "insecureAcceptAnything"
}
],
"registry.ixnic.net": [
{
"type": "insecureAcceptAnything"
}
]
}
}
}
EOF
chmod 644 /etc/containers/policy.json
验证 JSON 格式:
python3 -m json.tool /etc/containers/policy.json
insecureAcceptAnything 表示不验证镜像的加密签名,不代表关闭 HTTPS。镜像传输仍可使用 TLS。
四、配置 Docker Hub 镜像加速
创建 Podman Registry 配置目录:
mkdir -p /etc/containers/registries.conf.d
创建 Docker Hub 加速配置:
cat >/etc/containers/registries.conf.d/10-docker-mirror.conf <<'EOF' [[registry]] prefix = "docker.io" location = "docker.io" insecure = false blocked = false [[registry.mirror]] location = "registry.ixnic.net" insecure = false EOF
该配置表示:容器镜像仍使用标准名称,例如:
docker.io/xlousp/frps:latest
Podman 拉取时优先请求:
https://registry.ixnic.net
无需将容器的镜像名称改成 registry.ixnic.net/xlousp/frps:latest。
检查重复或冲突配置
grep -RnsE 'docker\.io|registry\.ixnic\.net' \ /etc/containers/registries.conf \ /etc/containers/registries.conf.d 2>/dev/null
如果多个文件重复定义 docker.io,应合并或禁用旧配置,避免优先级和覆盖关系混乱。
测试加速服务
curl -I https://registry.ixnic.net/v2/
该 Registry 使用 v3,访问 /v2/ 返回 200 OK 属于正常行为。
使用 Podman 调试日志测试:
podman --log-level=debug pull docker.io/library/alpine:latest \ 2>&1 | tee /tmp/podman-pull-debug.log
确认日志包含加速域名:
grep -i 'registry.ixnic.net' /tmp/podman-pull-debug.log
Podman 没有常驻守护进程,修改 Registry 配置后通常不需要重启 Podman 服务。
五、创建带自动更新标签的容器
以 frps 为例,宿主机配置文件位于:
/home/usrdata/frps/frps.toml
确认文件存在:
ls -l /home/usrdata/frps/frps.toml
创建容器:
podman run -d \ --name frps \ --network host \ --label io.containers.autoupdate=registry \ -v /home/usrdata/frps/frps.toml:/etc/frp/frps.toml:ro \ docker.io/xlousp/frps:latest
验证容器:
podman ps podman logs --tail 100 frps
验证自动更新标签:
podman inspect frps \
--format '{{index .Config.Labels "io.containers.autoupdate"}}'
预期输出:
registry
部分 Podman 版本不支持通过以下命令给已有容器追加标签:
podman container update --label ...
如果提示 unknown flag: --label,必须保留原端口、挂载、环境变量和权限参数,重新创建容器并在 podman run 阶段添加标签。
六、使用 systemd 管理容器
Podman 自动更新不仅需要标签,还需要 systemd 能够重新启动或重新创建对应容器。因此,应先为容器生成 systemd 单元。
1. 保存容器配置
podman inspect frps > /root/frps-inspect.json
确认挂载和镜像:
podman inspect frps --format '镜像={{.Config.Image}}'
podman inspect frps \
--format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}'
2. 生成服务文件
cd /root podman generate systemd --name frps --new --files
正常会生成:
/root/container-frps.service
查看生成文件使用的是哪一个 Podman:
grep -E '^Exec(Start|Stop|StopPost)=' /root/container-frps.service
如果系统中同时存在 /usr/bin/podman 和 ampod Podman,应确保服务所调用的版本能够正确读取 /etc/containers/containers.conf,并识别前面配置的 conmon 和 runc。
3. 安装 systemd 单元
install -m 644 \ /root/container-frps.service \ /etc/systemd/system/container-frps.service
由于使用了 --new,systemd 启动时会按照单元文件重新创建容器。因此先停止并删除当前手工创建的同名容器:
podman stop frps podman rm frps
这里不会删除宿主机文件 /home/usrdata/frps/frps.toml。
重新加载并启动:
systemctl daemon-reload systemctl enable --now container-frps.service
检查:
systemctl status container-frps.service --no-pager -l podman ps podman logs --tail 100 frps
再次确认自动更新标签:
podman inspect frps \
--format '{{index .Config.Labels "io.containers.autoupdate"}}'
确认容器与 systemd 单元关联:
podman inspect frps \
--format '{{index .Config.Labels "PODMAN_SYSTEMD_UNIT"}}'
正常应返回:
container-frps.service
七、补全 Podman 自动更新 service 和 timer
有些 AMH/ampod 安装不会自带:
podman-auto-update.service podman-auto-update.timer
可以手动创建。
1. 确认自动更新使用的 Podman 路径
command -v podman
本文按 AMH/ampod 的路径示范:
/usr/local/ampod-1.0/podman/bin/podman
如果你的实际路径不同,必须替换下面 ExecStart= 和 ExecStartPost= 中的路径。
2. 创建自动更新服务
cat >/etc/systemd/system/podman-auto-update.service <<'EOF' [Unit] Description=Podman automatic update service Documentation=man:podman-auto-update(1) Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/usr/local/ampod-1.0/podman/bin/podman auto-update [Install] WantedBy=multi-user.target EOF
如果确认需要在更新后清理无用旧镜像,可在 [Service] 中增加:
ExecStartPost=/usr/local/ampod-1.0/podman/bin/podman image prune -f
为了便于回滚,建议首次配置时先不要自动清理旧镜像。
3. 创建自动更新定时器
下面设置每天凌晨 03:30 检查更新,并随机延迟最多 10 分钟:
cat >/etc/systemd/system/podman-auto-update.timer <<'EOF' [Unit] Description=Daily Podman automatic update Documentation=man:podman-auto-update(1) [Timer] OnCalendar=*-*-* 03:30:00 Persistent=true RandomizedDelaySec=10m Unit=podman-auto-update.service [Install] WantedBy=timers.target EOF
参数说明:
OnCalendar:计划执行时间;Persistent=true:关机期间错过任务时,开机后补执行;RandomizedDelaySec=10m:随机延迟,避免多台设备同一时刻请求仓库。
4. 启用定时器
systemctl daemon-reload systemctl enable --now podman-auto-update.timer
查看下一次运行时间:
systemctl status podman-auto-update.timer --no-pager systemctl list-timers --all | grep podman-auto-update
八、测试自动更新
先执行模拟检查,不实际更新:
podman auto-update --dry-run
正常情况下应识别到:
container-frps.service frps docker.io/xlousp/frps:latest registry
手动触发 systemd 自动更新服务:
systemctl start podman-auto-update.service
查看结果:
systemctl status podman-auto-update.service --no-pager -l journalctl -u podman-auto-update.service -n 100 --no-pager -o cat
确认更新后容器仍在运行:
systemctl status container-frps.service --no-pager -l podman ps podman logs --tail 100 frps
九、常见故障排查
1. 找不到 conmon
错误:
could not find a working conmon binary
检查:
podman info --debug | grep -Ei 'conmon|runtime'
AMH 环境应识别:
/usr/local/ampod-1.0/conmon/bin/conmon /usr/local/ampod-1.0/conmon/bin/runc
2. 缺少 policy.json
错误:
open /etc/containers/policy.json: no such file or directory
按照本文第三节创建 /etc/containers/policy.json。
3. 修改标签提示 unknown flag
错误:
Error: unknown flag: --label
旧版本 Podman 不能给现有容器动态添加标签。保存挂载、端口、环境变量及权限参数后,删除并重新创建容器。
4. 自动更新找不到容器
依次检查:
podman inspect frps \
--format '{{index .Config.Labels "io.containers.autoupdate"}}'
podman inspect frps \
--format '{{index .Config.Labels "PODMAN_SYSTEMD_UNIT"}}'
podman auto-update --dry-run
容器既要有 io.containers.autoupdate=registry,也应由有效的 systemd 单元管理。
5. systemd 启动失败
查看完整日志:
journalctl -u container-frps.service -n 200 --no-pager -o cat
同时检查:
systemctl cat container-frps.service podman ps -a podman logs --tail 100 frps
6. 检查是否混用两套 Podman
/usr/bin/podman --version 2>/dev/null /usr/local/ampod-1.0/podman/bin/podman --version 2>/dev/null systemctl cat container-frps.service | grep -E 'Exec(Start|Stop)=' systemctl cat podman-auto-update.service | grep '^ExecStart='
容器服务、自动更新服务和日常管理命令应尽量使用同一套 Podman,避免不同版本读取不同配置或使用不兼容的 conmon/runtime。
十、最终检查清单
执行以下命令进行最终验收:
# Podman 运行环境
podman info --debug | grep -Ei 'conmon|runtime'
# 容器服务
systemctl is-enabled container-frps.service
systemctl is-active container-frps.service
# 自动更新定时器
systemctl is-enabled podman-auto-update.timer
systemctl is-active podman-auto-update.timer
systemctl list-timers --all | grep podman-auto-update
# 容器状态与标签
podman ps
podman inspect frps \
--format '自动更新={{index .Config.Labels "io.containers.autoupdate"}} systemd={{index .Config.Labels "PODMAN_SYSTEMD_UNIT"}}'
# 自动更新模拟检查
podman auto-update --dry-run
预期结果:
container-frps.service:enabled、active podman-auto-update.timer:enabled、active 自动更新标签:registry systemd 单元:container-frps.service
总结
AMH 面板环境中的 Podman 配置重点不在容器命令本身,而在于保持整套运行组件一致:
- 使用
/etc/containers/containers.conf指定 ampod 自带的 conmon 和 runc; - 使用
/etc/containers/policy.json补全镜像策略; - 使用
registries.conf.d将 Docker Hub 请求转发至registry.ixnic.net; - 创建容器时添加
io.containers.autoupdate=registry; - 使用 systemd 单元管理容器;
- 使用
podman-auto-update.timer定期检查并更新镜像; - 容器服务和自动更新服务必须尽量调用同一套 Podman。
完成以上配置后,AMH/ampod 环境中的容器即可实现开机启动、异常恢复、Docker Hub 加速以及无人值守自动更新。
文章末尾固定信息





