我正在尝试使用挂载在Docker容器中的命名卷,但是在尝试在挂载的文件夹中创建文件时出现Permission denied
错误。因此,我在创建卷时尝试使用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
属于在我的user
中创建的用户Dockerfile
。如果我运行:
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
是在我的uid
中创建的用户user
的{{1}}:
Dockerfile
但是在运行我的容器(使用上面定义的相同命令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
在the docs中,我发现在创建卷时缺少选项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
)。我想在容器退出时保留写在卷中的数据。
在容器中装入命名卷时,最简单的指定权限的方法是什么?我不想修改我的Dockerfile以使用某种魔术(例如,输入tmpfs
,然后执行命令)。使用chown
选项似乎有可能,我觉得我已经接近解决方案了,但是也许我的方法有误。
答案 0 :(得分:0)
不完全确定您的问题是什么,但这对我有用:
docker run --name test_named_volume \
--mount type=volume,source=test_vol,target=/home/user \
--user user \
test_named_volume touch /home/user/a
我认为您可能会出错的地方是:
您的挂载目标为/home/user/test
尚未创建,因为Dockerfile中的useradd
命令仅创建$HOME
(/home/user
)。因此,docker具有root权限在容器内创建目录。
您没有在docker run中使用--user
标志来以指定用户身份运行容器。