我正在尝试使用一个在Docker容器中挂载的命名卷,但当我尝试在挂载的文件夹创建文件时出现“权限被拒绝”的错误。因此,我正在尝试在创建我的卷时使用mount
选项,但那并不像我想要的那样起作用。
介绍
我完全知道当使用docker volume create my_named_volume
创建一个卷,并使用选项 -v my_named_volume:/home/user/test
或者 --mount type=volume,source=my_named_volume,target=/home/user/test
来挂载它时,容器内部的文件夹(/home/user/test
)将由root
用户拥有,即使/home/user
属于我在Dockerfile
中创建的一个名为user
的用户。如果我运行:
docker run --rm \
--name test_named_volume \
--mount type=volume,source=my_named_volume,target=/home/user/test \
test_named_volume \
su user -c "touch /home/user/test/a"
然后我得到:
touch: cannot touch '/home/user/test/a': Permission denied
我理解这一点。这就是为什么在创建我的卷时,我尝试使用mount
选项的原因。
mount
选项
我正在创建我的卷时指定uid
,以便让我的用户user
能够在该卷中创建文件:
docker volume create my_named_volume \
--opt o=uid=1000
1000
是我在Dockerfile
中创建的user
的uid
:
FROM debian:jessie
ENV HOME /home/user
RUN useradd \
--create-home \
--home-dir $HOME \
--uid 1000 \
user \
&& chown -R user:user $HOME
WORKDIR $HOME
但是当我运行我的容器(使用上面定义的相同命令docker run
)时,出现了一个错误(missing device in volume options
):
docker: Error response from daemon: error while mounting volume '/var/lib/docker/volumes/my_named_volume/_data': missing device in volume options.
从文档中,我发现我的卷创建选项--device
和--type
已经不见了:
docker volume create my_named_volume \
--opt device=??? \
--opt type=??? \
--opt o=uid=1000
但我不明白为什么我必须提供这些选项。 device
需要是一个块设备,从我所读到的,type
应该是类似 ext4
的东西。但我的目的基本上就是将 uid
选项设置为我的卷。看起来创建一个块设备应该可以解决问题,但对于一个“简单”的问题来说,它似乎过于复杂。
我尝试使用 tmpfs
作为 device
和 type
,这很好用(文件 /home/user/test/a
被创建了)... 直到我的容器停止(数据没有被保留,这很合理因为它是 tmpfs
)。我希望退出容器后卷中写入的数据可以持久化。
在容器中挂载命名卷时,指定权限的最简单方法是什么?我不想修改我的 Dockerfile 来使用一些魔法(例如 entrypoint 执行 chown
然后执行命令)。使用 mount
选项似乎是可能的,我觉得我离解决方案很近,但也许我走错了路。