Podman rootless容器的卷挂载
在 Alpine Linux运行Podman 实践中发现, podman 运行 rootless 容器,默认挂载Host主机卷时,容器内部挂载卷的属主是 root 。这对普通用户 admin 身份访问 /home/admin 非常不方便。
本文在实践基础上学习如何在rootless容器中挂载Host主机卷
动态设置Dockerfile的用户id
之前在 Docker tini进程管理器 改进 tini 脚本时,同时也采用了在 Dockerfile 开头设置环境变量方式将 admin 用户的账户 uid/gid 设置为 1000 :
admin 用户的账户 uid/gid 设置为 1000 的 DockerfileFROM alpine:latest
ENV container=docker
ARG ADMIN_UID=1000
ARG ADMIN_GID=1000
...
# add account "admin" and give sudo privilege
# "admin" uid/gid same as host (alpine linux)
RUN addgroup -g ${ADMIN_GID} admin
RUN adduser -u ${ADMIN_UID} -G admin -G wheel -h /home/admin -s /bin/sh -D admin
RUN echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
...
但是这种Dockerfile设置比较死,假如用户环境的id不是 1000 就要手工调整Dockerfile,比较麻烦
更好的的方法是在 docker build 动态传递环境变量:
动态向Dockerfile传递环境变量
podman build --build-arg ADMIN_UID=$(id -u) --build-arg ADMIN_GID=$(id -g) \
-t alpine-dev:latest .
这样构建的 Docker 镜像 就会自动具备和当前环境用户 uid/gid 一致的容器内部 admin 账号 uid/gid ,为下一步运行时匹配 /home/admin 属主做好准备
运行pod时对齐uid/gid
执行
podman run时,挂载卷同时传递keep-id的uid/gid环境变量( 传递变量一定要有确定对应值 ):
传递
keep-id 的 uid/gid 环境变量方式运行 podman runexport uid=$(id -u)
export gid=$(id -g)
podman run -dt --name alpine-dev --hostname alpine-dev \
-p 1122:1122 \
-v /home/admin:/home/admin \
--user $uid:$gid \
--userns keep-id:uid=$uid,gid=$gid \
alpine-dev:latest
参考
How to debug issues with volumes mounted on rootless containers Red Hat官方博客关于rootless容器如何排查卷挂载的指南,我当时为了解决rootless容器内admin用户目录属主问题参考