简单解决podman在非root用户下的报错(Tumbleweed)

Podman,作为 docker 的 (升级/魔改/进阶/优化) 版本,现已登陆 openSUSE Leap 15.1!,不要 docker-io! 不要 systemctl start docker ! 下载即装即用!还再犹豫什么,赶快卸载 Docker 安装 podman 吧.



2021.3.09 更新:若按照本文后,在 pull 镜像结束阶段出现 potentially insufficient UIDs or GIDs available in user namespace (requested 0:42 for /etc/shadow) 错误,请尝试运行 podman system migrate 命令.


吃完安利 简单一说后,先描述一下我碰到的问题,首先,在执行 podman 命令时,给出了这样一个 WARNING

WARN[0000] cannot find mappings for user 马赛克: No subuid ranges found for user "马赛克" in /etc/subuid 
WARN[0000] using rootless single mapping into the namespace. This might break some images. Check /etc/subuid and /etc/subgid for adding subids

鉴于作为码农预备役中一员的敏感性,WARNING 什么的不管他就是了,又不是跑不了,命令跑的这么稳定,我的环境怎么会有问题,但是事实却是……

Trying to pull docker.io/library/debian:latest...Getting image source signatures
Copying blob 6f2f362378c5 done
Copying config e1de74e67c done
Writing manifest to image destination
Storing signatures
Error: error creating container storage: error creating read-write layer with ID "d21e1aa53311dee39e57aeaf3ad545529989f71edbf1ec2989d5edf3675675be": there might not be enough IDs available in the namespace (requested 0:65534 for /home/马赛克/.local/share/containers/storage/vfs/dir/d21e1aa53311dee39e57aeaf3ad545529989f71edbf1ec2989d5edf3675675be/etc/gshadow): lchown /home/马赛克/.local/share/containers/storage/vfs/dir/d21e1aa53311dee39e57aeaf3ad545529989f71edbf1ec2989d5edf3675675be/etc/gshadow: invalid argument

嗯?容器起不来?这可就是真的见鬼了,赶快切到 docker 下试试

╰─➤  docker run -it debian:latest
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
6f2f362378c5: Pull complete 
Digest: sha256:118cf8f3557e1ea766c02f36f05f6ac3e63628427ea8965fb861be904ec35a6f
Status: Downloaded newer image for debian:latest
root@01ca97b541ba:/# 

这不是很正常吗???
再去 root 下测试一下

╰─# podman run -it debian:latest
root@bac474be0001:/# 

非常正常,但是每次都要切到 root 很麻烦,懒啊

于是乎,在疑惑与懒惰的驱动下,我先是点开了 www.baidu.com
没 有 答 案(正常)
然后我又去了 www.google.com
仅有的两个 GitHub issue 就像救命稻草一样出现了!
但是仍然有问题,issue 中所提到的先是基于 Ubuntu 的环境,最终解决办法是安装uidmap这个包,这个包在 openSUSE 下自然是搜不到的; 另一个是在 openSUSE 下的问题,但是只是说利用 “shadowutil” 修复了,并未描述修复流程。哦豁,傻了

没办法只能返回来继续看报错,看来看去,突然发现了其中一句报错

there might not be enough IDs available in the namespace

再结合最开始的 WARNING

WARN[0000] cannot find mappings for user 马赛克: No subuid ranges found for user "马赛克" in /etc/subuid 

很明显,问题就是应该出在了/etc/subuid 与/etc/subgid 这两个文件中了
那这两个文件又是什么呢,这又牵扯到了 docker 中关于 namespace 的相关了,在此对 namespace 仅做一简要说明

Linux 内核实现 namespace 的主要目的就是为了实现轻量级虚拟化(容器)服务,构建一个相对隔离的 shell 环境。在同一个 namespace 下的进程可以感知 彼此的变化,而对外界的进程一无所知。这样让容器内的进程运行在一个独立的 系统环境中,以此达到隔离的目的

事实上,subuid 与 subgid 的作用,是定义一个可映射进 Container 的 uid 的 range,在 docker/podman 中,会将 subuid 中定义的 range 中的一个映射至容器中的 uid 0(root),这样映射后,容器中的 root 可以具有其自己的权限但是他的 namespace 仍然是宿主机中当前用户的 namespace,也就是在宿主机中仅有当前用户的权限。

回过头来再看问题,明显的报出来是/etc/subuid 中不存在一个可以映射入容器的范围,查看该文件,果然是空空如也,那么解决起来就很简单了,给他一个 range 即可

echo "当前用户名:110000:65536" > /etc/subuid
echo "当前用户名:110000:65536" > /etc/subgid

echo 的 内容解释 为 “在当前用户的 namespace 中有 65536 个子用户,子用户的 ID 是从 110000-175535”, 而这些用户 ID 映射进容器后就是 ID 为 0-65535 的用户,subgid 和 subuid 意义相似,在此不在赘述。修复后,再试一下,果然问题消失了。

╰─➤  podman run -it debian:latest                                                                                                     130 ↵
Trying to pull docker.io/library/debian:latest...Getting image source signatures
Copying blob 6f2f362378c5 done
Copying config e1de74e67c done
Writing manifest to image destination
Storing signatures
root@cc96213f30a2:/# 

这里想扯两句:
现在网络上关于 podman 的相关资料较少,其实大部分问题可以参考 Docker 的相关资料,podman 实现了 docker 绝大多数的 api(swarm 除外),所以在大部分问题上 docker 的资料仍然具有其参考价值。

本文源自亲身经历,若有错误,还请指出。(请后面拿鸡蛋和西红柿的兄弟先坐下,谢谢)

撒花! 感谢楼主为本站(未来)访问量做出的贡献:tada::tada:

最近运行 podman start name 报错
RRO [0000] unable to start container “syncthing”: container create failed (no logs from conmon): EOF

syncthing 在 Docker 下的启动命令是

docker create \
  --name=syncthing \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/London \
  -e UMASK_SET=<022> \
  -p 8384:8384 \
  -p 22000:22000 \
  -p 21027:21027/udp \
  -v </path/to/appdata/config>:/config \
  -v </path/to/data1>:/data1 \
  -v </path/to/data2>:/data2 \
  --restart unless-stopped \
  linuxserver/syncthing

建议先 inspect/logs/ps -a 看一下卡在哪里了

嗯,应该 dock 没问题,我用的是 podman,我骨骼了下,貌似 GitHub 里有提这个问题的,说会修复,
晚上我回家看看

哎,不行啊,io 辣鸡,bug 巨多。我已经换回 lxd 了。
不过临时玩玩还行。

你上次不是还提醒我写这两行来着吗,怎么自己还能忘了写的。我之前那个问题到现在也没解决,反正他们就是只管 ubuntu,我又菜,还是别自找麻烦了。