Docker Volume创建后为空

时间:2018-04-03 15:22:38

标签: docker docker-volume

我有一个简单的Dockerfile

FROM alpine

RUN apk add --no-cache lsyncd

CMD ["ls", "-al", "/etc/lsyncd"]

我构建了图像并且工作正常,如果我像以下那样运行它可以正常工作:

 docker run -i -t -P <NAME_OF_THE_IMAGE>

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

如果我像它一样:

 docker run -i -t -P -v /docker/dcm/tst:/etc/lsyncd <NAME_OF_THE_IMAGE>

它创建了“/ 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

2 个答案:

答案 0 :(得分:3)

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

命名卷支持在容器启动时该卷为空时初始化卷的内容。它将初始化为所选位置的图像内容,包括文件/目录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

我知道有一个其他的行为更改,指定卷指向绑定装载,如果目录不存在,则docker不会创建该目录。相反,容器创建将因卷创建错误而失败。

答案 1 :(得分:1)

public int? PopPort { get; set; } 是指主机上的文件或目录安装到容器中

关于Bind mount,如下所述。

  

如果将bind-mount绑定到容器上的非空目录,则绑定装置会隐藏目录的现有内容。

     

有关详细信息,请参阅this

这意味着Mounting into a non-empty directory on the container只会覆盖容器目录中的内容。

我认为您已经与bind mount混淆了,volume会在第一次创建时将容器目录中的内容复制到volume。但是,您使用的是bind mount,并且它不会那样工作。