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

nor*_*bjd 5 mount docker 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"
Run Code Online (Sandbox Code Playgroud)

然后我得到:

touch: cannot touch '/home/user/test/a': Permission denied
Run Code Online (Sandbox Code Playgroud)

我明白这一点。这就是为什么我mount在创建卷时尝试使用选项的原因。

mount 选项

uid在创建卷时指定了一个,以使用户user能够在该卷中创建文件:

docker volume create my_named_volume \
    --opt o=uid=1000
Run Code Online (Sandbox Code Playgroud)

1000是在my中创建uid的用户的:userDockerfile

FROM    debian:jessie

ENV     HOME /home/user

RUN     useradd \
            --create-home \
            --home-dir $HOME \
            --uid 1000 \
            user \
 &&     chown -R user:user $HOME

WORKDIR $HOME
Run Code Online (Sandbox Code Playgroud)

但是,当运行我的容器(使用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.
Run Code Online (Sandbox Code Playgroud)

文档中,我看到了这些选项--device--type并且在我的体积创建中缺少这些选项:

docker volume create my_named_volume \
    --opt device=??? \
    --opt type=??? \
    --opt o=uid=1000
Run Code Online (Sandbox Code Playgroud)

但是我不明白为什么我必须给出这些选择。device需要成为一个块设备,据我所读,type应该类似于ext4。但是我想要的基本上只是uid选项设置为我的音量。看起来创建块设备应该可以,但是对于“简单”问题似乎配置太多。

我试过使用tmpfsfor devicetype,它可以正常工作(/home/user/test/a创建文件)...直到我的容器停止(数据没有持久化,这是合乎逻辑的,因为它是tmpfs)。我想保留容器退出时写入卷中的数据。

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

moe*_*ius 2

不完全确定你的问题是什么,但这对我有用:

docker run --name test_named_volume \
  --mount type=volume,source=test_vol,target=/home/user \
  --user user \
  test_named_volume touch /home/user/a
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 您没有使用--userdocker run 中的标志以指定用户身份运行容器。