Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux上docker中的重叠绑定装载和权限_Linux_Docker_File Permissions - Fatal编程技术网

linux上docker中的重叠绑定装载和权限

linux上docker中的重叠绑定装载和权限,linux,docker,file-permissions,Linux,Docker,File Permissions,linux主机上重叠的绑定装载似乎会在root所拥有的主机上创建重影文件。这是有意的吗?下面是一个例子: # Create a file to mount in the container touch hostfile # Create a temporary directory to mount in the container mkdir tempdir # Run bash in the container and mount the file and directory docker r

linux主机上重叠的绑定装载似乎会在
root
所拥有的主机上创建重影文件。这是有意的吗?下面是一个例子:

# Create a file to mount in the container
touch hostfile
# Create a temporary directory to mount in the container
mkdir tempdir
# Run bash in the container and mount the file and directory
docker run --rm --volume=`pwd`/tempdir:/home --volume=`pwd`/hostfile:/home/hostfile ubuntu bash
运行该命令后,可以在
tempdir
中找到
hostfile
,但它属于
root

注意

  • 在OS X主机上运行相同的bash脚本会导致启动容器的用户拥有
    hostfile
  • 在主机上指定用户的用户和组id作为
    docker run
    调用的一部分不会改变任何内容

此行为是预期行为。让我们尝试了解发生了什么,并手动执行相同的装载

我们在某个位置创建
hostfile
,“host”目录和目标“container”目录(例如,在我的机器上是
/home/qazer/dockx
):

#主机文件
$touch主机文件
#“主机端目录”
$mkdir hostdir
#“容器”-侧目录
$mkdir contdir
然后我们执行安装:

#第一次装载:“主机”目录到“容器”目录
$sudo mount--绑定主机目录contdir
#成功!
#第二次装载:主机文件到容器文件
$sudo mount--绑定主机文件contdir/hostfile
装载:contdir/hostfile:装载点不存在。
是的,绑定装载失败,因为目标文件不存在!查阅
mount(2)
系统调用的手册页发现,如果提供的某些路径指向不存在的文件,则此调用将失败:

ENOENT A pathname was empty or had a nonexistent component.
因此,Docker实际做的是:

$ sudo strace -f -p $(pidof containerd) \
              -e trace=%file,mount -yy |& grep -e hostfile -e home
...
[pid 23945] newfstatat(AT_FDCWD, "/var/lib/docker/overlay2/b2c32423952d49f21e7a9c1addec6201c7f036c8dba1da975bac6a34d5abbe11/merged/home/hostfile", 0xc00016ce08, 0) = -1 ENOENT (No such file or directory)
...
[pid 23945] openat(AT_FDCWD, "/var/lib/docker/overlay2/b2c32423952d49f21e7a9c1addec6201c7f036c8dba1da975bac6a34d5abbe11/merged/home/hostfile", O_RDONLY|O_CREAT|O_CLOEXEC, 0755) = 7</var/lib/docker/overlay2/b2c32423952d49f21e7a9c1addec6201c7f036c8dba1da975bac6a34d5abbe11/merged/home/hostfile>
[pid 23945] mount("/home/qazer/dockx/hostfile", "/var/lib/docker/overlay2/b2c32423952d49f21e7a9c1addec6201c7f036c8dba1da975bac6a34d5abbe11/merged/home/hostfile", 0xc00013bb00, MS_BIND|MS_REC, NULL) = 0
$sudo strace-f-p$(皮多夫集装箱)\
-e trace=%file,mount-yy |&grep-e hostfile-e home
...
[pid 23945]newfstatat(AT_FDCWD,“/var/lib/docker/overlay2/b2c32423952d49f21e7a9c1addec201c7f036c8dba1da975bac6a34d5abbe11/merged/home/hostfile”,0xc0016ce08,0)=-1 enoint(无此类文件或目录)
...
[pid 23945]openat(AT_FDCWD,“/var/lib/docker/overlay2/b2c32423952d49f21e7a9c1addec201c7f036c8dba1da975bac6a34d5abbe11/merged/home/hostfile”,O|RDONLY | O|create | O| O|CLOEXEC,0755)=7
[pid 23945]挂载(“/home/qazer/dockx/hostfile”,“/var/lib/docker/overlay2/b2c32423952d49f21e7a9c1addec6201c7f036c8dba1da975bac6a34d5abbe11/merged/home/hostfile”,0xc0013bb00,MS|BIND | MS|REC,NULL)=0
首先,检查容器文件系统中是否存在
/home/hostfile
文件(调用
newfstat()
)。此文件不存在(
enoint
),因此Docker创建它以避免我们以前看到的错误(调用
openat(O_CREAT)
),并且只有在这之后,容器引擎才会将
hostfile
实际绑定装载到容器文件系统(调用
mount()

在编写时,
/home
目录已经从主机绑定装入(第一次装入),因此此写入操作将转到此主机目录。最后,当容器停止时,Docker编写的文件将保留在主机目录中,这就是您看到的

至于Mac OS主机的文件所有权,我认为原因与中的相同