Linux 如何将Docker映像中创建的目录导出到主机?

Linux 如何将Docker映像中创建的目录导出到主机?,linux,unix,docker,permissions,mkdir,Linux,Unix,Docker,Permissions,Mkdir,我在Docker映像中运行的程序首先创建一个目录并将一些文件写入该目录 为了将目录传输到主机上,我安装了一个datadir/,然后将映像中创建的目录移动到安装的目录中,例如: mkdir datadir DATADIR=datadir/ docker run -i \ -v $(pwd)/$DATADIR:/$DATADIR/ ubuntu \ bash -c "mkdir /x1 && echo 'abc' > x1/test.txt && mv x1

我在Docker映像中运行的程序首先创建一个目录并将一些文件写入该目录

为了将目录传输到主机上,我安装了一个
datadir/
,然后将映像中创建的目录移动到安装的目录中,例如:

mkdir datadir
DATADIR=datadir/

docker run -i \
-v $(pwd)/$DATADIR:/$DATADIR/ ubuntu \
bash -c "mkdir /x1 && echo 'abc' > x1/test.txt && mv x1 $DATADIR"
但当我试图访问
datadir/x1
时,它的所有者是
root
,并且具有只读权限:

$ mv datadir/x1/ .
mv: cannot move 'datadir/x1/' to './x1': Permission denied

$ ls -lah datadir/x1/
total 12K
drwxr-xr-x 2 root root   4.0K Jun 28 16:38 .
drwxrwxr-x 3 alvas alvas 4.0K Jun 28 16:38 ..
-rw-r--r-- 1 root root      4 Jun 28 16:38 test.txt
在Docker映像和主机之间移动文件的正确方法是装载附加卷并复制映像内创建的目录吗?如果不是,执行相同操作的“规范”方法是什么

关于目录权限,将主机权限分配给已装入卷中的任何文件的正确方法是什么?


我曾尝试在Docker图像中
chmod-R 777
,但我认为这不是安全的方法,即:

$ docker run -i -v $(pwd)/$DATADIR:/$DATADIR/ -i ubuntu bash -c "mkdir /x1 && echo 'abc' > x1/test.txt && mv x1 $DATADIR && chmod -R 777 $DATADIR"

$ mv datadir/x1/ .

$ ls -lah x1
total 12K
drwxrwxrwx  2 root root   4.0K Jun 28 16:47 .
drwxrwxr-x 12 alvas alvas 4.0K Jun 28 16:47 ..
-rwxrwxrwx  1 root root      4 Jun 28 16:47 test.txt

要避免权限问题,请使用

例如:

# This is the directory you want to save the outputs
mkdir datadir

# We create a directory and file inside it, inside the Docker image.
# And we are naming the Docker image "thisinstance"
docker run -i --name thisinstance ubuntu \
bash -c "mkdir /x1 && echo 'abc' > x1/test.txt"

# Copies the new directory inside the Docker image to the host.
docker cp thisinstance:/x1 datadir/

# Destroy the temporary container
docker rm thisinstance

# Check the ownership of the directory and file
ls -lah datadir/x1/
[out]:

drwxr-xr-x  3 alvas  679754705   102B Jun 29 10:36 ./
drwxr-xr-x  3 alvas  679754705   102B Jun 29 10:36 ../
-rw-r--r--  1 alvas  679754705     4B Jun 29 10:36 test.t

但这意味着我需要跟踪容器ID。我只需要容器的输出,我并不想跟踪Docker内部发生的事情。然后,您必须在容器中创建与主机中相同的用户,并与此用户一起运行命令/创建文件。因此,您需要说“但这意味着我需要跟踪容器ID”您不需要这样做,您可以使用
docker run--name mycontainer…
启动它,然后您引用mycontainer,因为您可以使用ID或容器的名称container@user2915097令人惊叹的!谢谢