Docker卷:使用安装选项指定权限

时间:2018-07-21 13:37:14

标签: docker mount docker-volume

我正在尝试使用挂载在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用于tmpfsdevice,工作正常(创建文件type)...直到容器停止(数据不持久化,这是合乎逻辑的,因为它是/home/user/test/a)。我想在容器退出时保留写在卷中的数据。

在容器中装入命名卷时,最简单的指定权限的方法是什么?我不想修改我的Dockerfile以使用某种魔术(例如,输入tmpfs,然后执行命令)。使用chown选项似乎有可能,我觉得我已经接近解决方案了,但是也许我的方法有误。

1 个答案:

答案 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

我认为您可能会出错的地方是:

  1. 您的挂载目标为/home/user/test尚未创建,因为Dockerfile中的useradd命令仅创建$HOME/home/user)。因此,docker具有root权限在容器内创建目录。

  2. 您没有在docker run中使用--user标志来以指定用户身份运行容器。