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 的 Dockerfile
FROM 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-iduid/gid 环境变量( 传递变量一定要有确定对应值 ):

传递 keep-iduid/gid 环境变量方式运行 podman run
export 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

参考