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

How to export directory created inside the Docker image to the host machine?

我是 运行 在 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 映像和主机之间移动文件的正确方法? 如果不是, "canonical" 执行相同操作的方法是什么?

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


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

$ 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

为避免权限问题,请使用 docker cp

例如:

# 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/

[输出]:

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