在Linux主机上挂载种子卷

时间:2020-05-13 08:30:19

标签: linux docker docker-volume

我想创建一个数据库映像,并用一些初始数据作为种子。这似乎很好用,因为我能够创建一个由docker管理的卷的容器。但是,当我尝试将卷挂载到Linux主机上的目录时,将创建 empty 而不是 seeded

在尝试了几个小时的不同配置之后,我将问题缩小到其核心:与主机上的卷关联的容器中文件夹的内容在创建时被覆盖。

在简单的Dockerfile下,该文件夹创建一个包含单个文件的文件夹。启动容器后,它会打印出已安装文件夹的内容。

FROM ubuntu:18.04

RUN mkdir /opt/test
RUN touch /opt/test/myFile.txt

VOLUME /opt/test

CMD ["ls", "/opt/test"]

我正在使用docker build -t test .

构建图像

由docker管理的卷

$ docker run -v volume-test:/opt/test --name test test
myFile.txt

在这里,我得到了预期的输出。卷安装在由docker管理的空间中。因此docker volume inspect volume-test的输出是:

{
  "CreatedAt": "2020-05-13T10:09:29+02:00",
  "Driver": "local",
  "Labels": null,
  "Mountpoint": "/var/snap/docker/common/var-lib-docker/volumes/volume-test/_data",
  "Name": "volume-test",
  "Options": null,
  "Scope": "local"
}

安装在主机上的卷

$ docker run -v $(pwd)/volume:/opt/test --name test test

由于该文件夹为空,因此什么也没有返回……但是,即使我以另一个用户身份执行docker run命令,我仍可以看到该卷已创建并且由用户root拥有。

drwxr-xr-x 2 root    root    4096 May 13 10:11 volume

作为最后一个测试,我尝试查看预先为该卷创建文件夹并向其中添加一些内容(在我的情况下为名为anotherFile.txt的文件)时发生的情况。 现在运行容器时,得到以下结果:

$ docker run -v $(pwd)/volume:/opt/test --name test test
anotherFile.txt

我们得出的结论是,容器文件夹中的内容被主机上文件夹中的内容覆盖。

我也可以使用docker inspect -f '{{ .Mounts }}' test验证该卷是否安装在正确的位置:

[{bind  /pathWhere/pwd/pointedTo/volume /opt/test   true rprivate}]

现在我的问题:主机上的卷是否具有与docker管理的卷相同的行为,其中容器中/ opt / test文件夹的内容是复制到主机上定义为卷的文件夹中吗?


旁注:在Windows上使用docker并启用选项Shared Folders时似乎是这种情况……

此外,似乎这里已经询问了similar question,但没有找到答案。我决定单独发表一篇文章,因为我认为这是描述此问题的最通用示例。

1 个答案:

答案 0 :(得分:1)

期望的情况

泊坞窗映像中的数据放置在主机上的指定路径中。

您的当前情况

  1. 创建图像时,数据被放入B<A>
  2. 启动容器时,将卷挂载到/opt/test

问题

由于安装位置与放置数据的路径相同,因此数据将被覆盖。

解决方案

  1. 在docker-build期间在映像中创建文件,例如/opt/test
  2. 使用其他路径装载卷,以使数据不会被覆盖,例如touch /opt/test/data/myFile.txt
  3. 使用'CMD'将文件复制到该卷,如下所示:CMD [“ cp”,“ -n”“ / opt / test / data / *”,“ / opt / test / mount /”] < / li>

咨询来源

相关问题