Podman 迁移笔记
目录
最近把各个服务从 Debian 迁移到 Archlinux,顺便把 Docker+Compose 换成 Podman(无根)+Quadlet,期间遇到了一些奇怪问题,记录一下。
当 compose 中有容器间的依赖关系时,podlet compose –pod 生成的配置无法正常工作
podlet 生成时会将依赖关系转换为:
[Unit]
Requires=redis.service
After=redis.service
但是其中缺少了 pod 名称,导致 systemd 无法正确启动依赖的容器。 正确格式应该为:
[Unit]
Requires=<pod名>-redis.service
After=<pod名>-redis.service
这是 podlet(0.3.0 - 2024-05-21) 的 BUG,Github 代码中已经修复了,但是没有发布新版本。
可以手动修改 Quadlet 文件或者编译源码。
当然如果不使用 pod 就没有这个问题了。
同网络中的容器无法通过容器名互相访问
这是由于 Quadlet 文件被转换成 systemd unit 文件时,容器名称前面被自动添加了 systemd-
。
name: comentario
services:
comentario:
restart: unless-stopped
image: registry.gitlab.com/comentario/comentario
environment:
BASE_URL: https://comment.nite07.com
SECRETS_FILE: /secrets.yaml
ports:
- 8820:80
volumes:
- ./secrets.yaml:/secrets.yaml:ro
depends_on:
- comentario-db
labels:
- "io.containers.autoupdate=registry"
networks:
- comentario_network
comentario-db:
restart: unless-stopped
image: docker.io/library/postgres:16-alpine
environment:
POSTGRES_DB: comentario
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- ./postgres:/var/lib/postgresql/data
labels:
- "io.containers.autoupdate=registry"
networks:
- comentario_network
networks:
comentario_network:
driver: bridge
例如在上面的例子中 comentario 容器内要通过 systemd-comentario-db
访问 comentario-db 容器。
容器中的文件挂载在本地后出现权限不一致的问题
这是容器内用户不是 root 用户导致的,可以在 podman run 命令中增加 --userns=keep-id
参数或者使用 compose 文件,在其中增加 userns_mode: keep-id
解决。
如果使用 pod 则 userns 配置只能写在 .pod 文件中,不能写在 pod 内部具体容器 .container 文件中。
当使用 pasta 作为无根容器的网络后端时(这是较新版本 podman 的默认行为),容器内无法通过公网 IP 访问宿主机
这是由于容器网络复制了宿主机的公网 IP,即容器的 IP 就是公网 IP,这导致了访问 <公网 IP>:端口 实际上是访问容器本身的端口,而不是宿主机,解决方法: https://github.com/containers/podman/issues/22653#issuecomment-2127198646