podman:将容器用户映射到主机用户以获得共享卷权限

podman:将容器用户映射到主机用户以获得共享卷权限

我正在尝试使用 podman 进行设置gitea。我希望

  • 映射到主机目录的数据卷,因为它允许我轻松检查和备份数据
  • 特定主机用户执行的容器进程

podman generate systemd --newPodman 由 root 用户执行,主要是因为我遇到了无 root 用户容器的问题(请参阅systemd User= 指令不受支持,为什么?在 systemd 中支持 User= 来运行无根服务)。

为了实现 rootfull 容器的映射,我开始将所有正在使用的容器uidgid映射到主机的gitea user。我最终得到了类似

podman run --rm \
    --uidmap=0:$(id -u gitea):1 \
    --gidmap=0:$(id -g gitea):1 \
    --uidmap=1000:$(id -u gitea):1 \
    --gidmap=1000:$(id -g gitea):1 \
    --gidmap=42:$(id -g gitea):1 \
    --volume /srv/gitea/data:/var/lib/gitea \
    docker.io/gitea/gitea:1.18.0-rc1-rootless

我得到的输出是

WARN[0000] Path "/etc/SUSEConnect" from "/etc/containers/mounts.conf" doesn't exist, skipping 
WARN[0000] Path "/etc/zypp/credentials.d/SCCcredentials" from "/etc/containers/mounts.conf" doesn't exist, skipping 
Error: OCI runtime error: runc create failed: unable to start container process: can't get final child's PID from pipe: EOF

尽管有路径警告,我还是成功运行了其他 podman 容器,所以我认为可以忽略它们。

podman version 3.4.7我正在openSUSE Leap 15.3 上运行。

如何运行该容器,同时将所有正在使用的uids 和gids 映射到特定主机用户/组?

答案1

根本原因似乎是试图将多个容器uid(和gid)映射到单个uid/gid到主机。所以我试图将(容器到主机)映射:

  • UID 0 → gitea
  • GID 0 → gitea
  • UID 1000 → gitea
  • GID 1000 → gitea
  • GID 42 → gitea

相反,我知道应该回退到不同的映射,其中只有 1000 UID/GID 对(实际运行 Gitea 应用程序的那个)映射到主机用户,而其他人使用不同的 UID 范围

    --uidmap=0:10000:999 \
    --gidmap=0:10000:999 \
    --uidmap=1000:$(id -u gitea):1 \
    --gidmap=1000:$(id -g gitea):1 \

这意味着我们有以下映射

  • UID 0-999 → 10000-10999
  • GID 0-999 → 10000-10999
  • UID 1000 → gitea
  • GID 1000 → gitea

经过此更改,容器启动成功,并且主机上的权限符合预期。

相关内容