【问题标题】:Docker Volume empty after it's createdDocker Volume 创建后为空
【发布时间】:2018-04-03 15:22:37
【问题描述】:

我有一个简单的 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

【问题讨论】:

  • 你是在 docker 容器中还是在主机中运行uname -a
  • 命名卷与主机卷(绑定挂载)的行为不同。
  • @juanlumn "uname -a" 我在主机上运行它 - 只是为了显示我正在运行 docker 的操作系统。

标签: docker docker-volume


【解决方案1】:

Bind mount 用于将主机上的文件或目录挂载到容器中

关于Mounting into a non-empty directory on the container,如下所示。

如果您绑定挂载到容器上的非空目录,则该目录的现有内容会被绑定挂载遮盖。

详情请参考this

这意味着bind mount 只会覆盖容器目录中的内容。

我认为您对volume 感到困惑,它会在第一次创建时将容器目录中的内容复制到volume。但是,您使用的是bind mount,但它不是那样工作的。

【讨论】:

  • 你是 100% 正确的。我尝试使用“docker run --mount source=lsyncd,destination=/etc/lsyncd -i -t -P dcm:latest”并创建了一个新卷并且文件按预期存在。我的范围主要是将文件存储在特定文件夹中。例如对于“hub.docker.com/_/wordpress”,我可以使用“docker run -e WORDPRESS_DB_PASSWORD=password -d --name wordpress --link wordpressdb:mysql -p 127.0.0.2:8080:80 -v“$PWD/html”: /var/www/html wordpress”和“html”文件夹是使用添加的新文件创建的。但我猜他们有一些进一步的自定义处理。
【解决方案2】:

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

命名卷支持在容器启动时卷为空时初始化卷的内容。它将被初始化为所选位置的图像内容,包括文件/目录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 将不会创建该目录。相反,容器创建将因卷创建错误而失败。

【讨论】:

猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多