我有一个设置自定义
USER
的 docker 映像,并且正在安装一个主机目录,其所有者具有与自定义 USER
相同的用户 ID(如此处建议)。不过,我无法从 docker 镜像写入主机目录。
我在使用预构建的 docker 映像时多次遇到这个问题,但我在这里重现一个最小的示例。
简单
Dockerfile
使用自定义USER
:
FROM ubuntu:22.04
RUN useradd -m -s /bin/bash mydockeruser
USER mydockeruser
尝试触摸主机上的文件:
docker run -it \
-v ./my-directory:/host \
my-ubuntu \
touch /host/test.txt
# touch: cannot touch '/host/test.txt': Permission denied
我正在使用
Ubuntu 20.04.6 LTS
和Docker version 27.3.1, build ce12230
,并且我按照官方说明安装了无根docker,最重要的是通过运行dockerd-rootless-setuptool.sh install
。
也许问题是由于 rootless docker 重新映射 uid 造成的?
这个问题不是重复的,因为这是由于自定义用户ID(在图像中)和挂载目录的所有者(在主机上)不匹配造成的。
这是一个完整的脚本,显示了我的情况,还显示了相关的 uid:
echo "Building my-ubuntu:"
docker build -t my-ubuntu .
# [+] Building 0.6s (6/6) FINISHED
# [...]
########
# HOST #
########
rm -rf my-directory
mkdir my-directory
echo "$ ls -la my-directory:"
ls -la my-directory
# total 8
# drwxrwxr-x 2 myhostuser myhostuser 4096 Oct 7 15:01 .
# drwxrwxr-x 3 myhostuser myhostuser 4096 Oct 7 15:01 ..
echo "$ id:"
id
# uid=1000(myhostuser) gid=1000(myhostuser) groups=1000(myhostuser),[...]
##########
# DOCKER #
##########
echo "$ id (inside my-ubuntu):"
docker run -it \
-v ./my-directory:/host \
my-ubuntu \
id
# uid=1000(mydockeruser) gid=1000(mydockeruser) groups=1000(mydockeruser)
echo "$ touch /host/test.txt (inside my-ubuntu):"
docker run -it \
-v ./my-directory:/host \
my-ubuntu \
touch /host/test.txt
# touch: cannot touch '/host/test.txt': Permission denied
添加
WORKDIR /host
FROM ubuntu:22.04
RUN useradd -m -s /bin/bash mydockeruser
USER mydockeruser
WORKDIR /host
运行命令
docker build -t my-ubuntu .
mkdir -p my-directory
docker run -it \
-v ./my-directory:/host \
my-ubuntu \
touch /host/test.txt