当前位置: 首页 > 知识库问答 >
问题:

Docker和--userns-remap,如何管理卷权限以在主机和容器之间共享数据?

薛英卫
2023-03-14

在docker中,在容器中创建的文件在从主机检查时往往具有不可预测的所有权。默认情况下,卷上文件的所有者是root(UID0),但是一旦容器中涉及非root用户帐户并写入文件系统,从主机的角度来看,所有者或多或少就变得随机了。

当您需要使用调用docker命令的相同用户帐户从主机访问卷数据时,这是一个问题。

典型的变通办法是

    null
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit

然后检查来自主机的内容:

ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/

-rw-r--r-- 1 100000 100000 6 Feb  8 19:43 test.txt

这个数字'100000'是我的主机用户的子UID,但是由于它与我的用户的UID不对应,所以我仍然不能在没有权限的情况下编辑test.txt。这个子用户似乎与我在Docker之外的实际普通用户没有任何关系。没有映射回来。

本文前面提到的解决方案包括在主机和容器之间对齐UID,由于名称空间中发生的uid->sub-uid映射,这些解决方案不再起作用。

共有1个答案

郑鸿朗
2023-03-14

如果您可以预先安排用户和组,那么就可以以特定的方式分配UID和GID,以便宿主用户与容器中的命名空间用户相对应。

下面是一个例子(Ubuntu 14.04,Docker 1.10):

>

  • 创建一些具有固定数字ID的用户:

    useradd -u 5000 ns1
    
    groupadd -g 500000 ns1-root
    groupadd -g 501000 ns1-user1
    
    useradd -u 500000 -g ns1-root ns1-root
    useradd -u 501000 -g ns1-user1 ns1-user1 -m
    
    ns1:500000:65536
    
    DOCKER_OPTS="--userns-remap=ns1"
    

    Update:为了保证非根用户在容器中有固定的ID(例如user11000:1000),在映像构建期间显式地创建它们。

    试驾:

    >

  • 准备卷目录

    mkdir /vol1
    chown ns1-root:ns1-root /vol1
    
    docker run --rm -ti -v /vol1:/vol1 busybox sh
    echo "Hello from container" > /vol1/file
    exit
    
    passwd ns1-root
    login ns1-root
    cat /vol1/file
    echo "can write" >> /vol1/file
    

  •  类似资料:
    • 问题内容: 嗨,我正在使用Docker部署一些服务,在这里我想在不同的Docker容器之间共享Docker卷。 假设我有一个Docker容器A在/ data挂载了一个卷。这是A的Dockerfile 据我了解,这会将一个卷附加到容器,但不会将主机目录装载到该容器。因此,该卷内的数据仍位于容器A内。 我有另一个提供ftp服务的容器B。它访问卷/ public下的数据。B的Dockerfile是 现在

    • 我正在使用Docker部署一些服务,我想在不同的容器之间共享Docker卷。 假设我有一个Docker容器a,它在/data处挂载了一个卷。下面是它的DockerFile: 根据我的理解,这会将卷附加到容器,但不会将主机目录挂载到容器。所以这个卷里面的数据仍然在容器A里面。

    • 问题内容: 我正在使用docker-compose和v3。我正在尝试在Docker中挂载卷: 我想将此作为卷,然后从多个容器中引用该卷。的卷配置参考仅示出了作为命名体积,用没有值,因此它不会像以上。 这给了我: 错误:在文件“ ./docker-compose.yml”中,卷“ app-volume”必须是映射而不是字符串。 显然,我知道我需要更改键/值对,但是我不确定 如何 更改它,以便可以在服

    • 我想把它作为一个卷,然后从多个容器中引用该卷。卷配置引用只将显示为命名卷,没有值,因此看起来不像上面那样。 这给了我: 错误:在文件“./docker-compose.yml”中,卷“app-volume”必须是映射,而不是字符串。 显然,我知道我需要更改键/值对,但我不确定如何更改它,以便在服务之间共享卷。 我还签出了,但这实际上只允许从其他容器继承。我看到有人在另一个包含他们想要的映射的容器上

    • 我在使用Docker容器时遇到了一个有点烦人的问题(我使用的是Ubuntu,所以没有像VMWare或b2d这样的虚拟化)。我已经构建了我的映像,并且有一个正在运行的容器,其中有一个来自主机的共享(装入)目录和一个来自主机的共享(装入)文件。以下是命令的全文: 注意:许多用于编辑文件的工具,包括vi和sed--in-place可能会导致inode更改。从Docker V1.1.0开始,这将产生一个错

    • 问题内容: 我正在尝试使用卷共享在Docker guest虚拟机中共享文件。为了获得相同的UID,从而与这些文件具有互操作性,我想在Docker guest虚拟机中创建一个与自己的用户具有相同UID的用户。 为了验证这个想法,我编写了以下简单的Dockerfile: 使用进行测试,然后显示该文件被简单命名为。 在来宾构建过程中是否可以与Docker共享主机环境变量? 问题答案: 该环境不是共享的,