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

0%