Docker Volume 创建后为空

sna*_*agy 2 docker docker-volume

我有一个简单的 Dockerfile

FROM alpine

RUN apk add --no-cache lsyncd

CMD ["ls", "-al", "/etc/lsyncd"]
Run Code Online (Sandbox Code Playgroud)

我构建了图像,它工作正常,如果我像这样运行它,它工作正常:

 docker run -i -t -P <NAME_OF_THE_IMAGE>
Run Code Online (Sandbox Code Playgroud)

我得到了包含预期文件的文件夹列表,因为 CMD 就是这样做的。

如果我将其调整为:

 docker run -i -t -P -v /docker/dcm/tst:/etc/lsyncd <NAME_OF_THE_IMAGE>
Run Code Online (Sandbox Code Playgroud)

它创建了空的“/docker/dcm/tst”文件夹,并且 ls 命令也返回空。

如果我的理解是正确的,如果本地计算机上的文件夹“/docker/dcm/tst”不存在,则会创建一个新文件夹,并将文件夹“/etc/lsyncd”的内容复制到新文件夹中。

我的理解正确吗?是什么导致了我所看到的问题?

uname -a 

Linux docker 4.9.53-5.ph2-esx #1-photon SMP Thu Oct 26 02:44:24 UTC 2017 x86_64 Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz GenuineIntel GNU/Linux
Run Code Online (Sandbox Code Playgroud)

BMi*_*tch 5

命名卷和主机卷的行为不同。主机卷(也称为绑定挂载)将目录完全映射到容器中,就像主机上存在的目录一样。没有初始化过程。

当容器启动时该卷为空时,命名卷支持初始化该卷的内容。它将初始化为所选位置的镜像内容,包括文件/目录uid/gid和权限。

要获取具有主机目录的命名卷,您可以使用以下选项之一定义作为绑定安装的命名卷:

  # create the volume in advance
  $ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

  # create on the fly with --mount
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

  # inside a docker-compose file
  ...
  volumes:
    bind-test:
      driver: local
      driver_opts:
        type: none
        o: bind
        device: /home/user/test
Run Code Online (Sandbox Code Playgroud)

据我所知,还有一个行为更改,即指向绑定安装的命名卷,如果该目录不存在,docker 将不会创建该目录。相反,容器创建将失败并出现卷创建错误。