Docker何时在运行时将文件复制到卷中?

时间:2018-05-11 19:10:37

标签: docker

我试图了解容器何时将预先存在的文件复制到同一目录中的已装入卷中。例如

FROM ubuntu
RUN mkdir /testdir 
RUN echo "Hello world" > /testdir/file.txt

运行:

#docker create volume vol
#docker run -dit -v vol:/testdir myimage
#docker exec -it 900444b7ab86 ls -la /testdir
drwxr-xr-x 2 root root 4096 May 11 18:43 .
drwxr-xr-x 1 root root 4096 May 11 18:43 ..
-rw-r--r-- 1 root root    6 May 11 17:53 file.txt

例如,图像中还有以下文件:

# docker exec -it 900444b7ab86 ls -la /etc/cron.daily
total 20

    drwxr-xr-x 2 root root 4096 Apr 26 21:17 .
    drwxr-xr-x 1 root root 4096 May 11 18:43 ..
    -rwxr-xr-x 1 root root 1478 Apr 20 10:08 apt-compat
    -rwxr-xr-x 1 root root 1176 Nov  2  2017 dpkg
    -rwxr-xr-x 1 root root  249 Jan 25 15:09 passwd

但是例如当我用

运行它时
docker run -it 900444b7ab81 -v vol:/etc/cron.daily

目录现在为空..

为什么这次没有复制文件?

1 个答案:

答案 0 :(得分:0)

#docker run -dit -v vol:/testdir

这不是一个有效的docker命令,没有包含图像引用,所以没有什么可以让docker运行。

docker run -it 900444b7ab81 -v vol:/etc/cron.daily

这将尝试使用命令900444b7ab81运行图像-v vol:/etc/cron.daily。在您拥有一个具有非常相似ID的容器ID之前,所以您不会尝试使用容器ID而不是图像ID进行运行。并且容器内可能不存在命令-v

这些参数的顺序很重要,run之后的第一个不是选项或前一个选项的arg被视为图像引用。在该引用之后,传递的任何其他内容都是在容器中运行的命令。因此,如果要安装卷,则需要在图像ID之前移动该选项。

  

我正在尝试了解容器何时将预先存在的文件复制到同一目录中的已装入卷中。

对于命名卷,docker在创建容器时初始化一个空的命名卷,其中包含该位置的图像内容。一旦卷中包含文件,它将在任何后续使用中按原样映射到容器中,因此不会看到对同一位置的图像的更改。