我想创建一个数据库映像,并用一些初始数据作为种子。这似乎很好用,因为我能够创建一个由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,但没有找到答案。我决定单独发表一篇文章,因为我认为这是描述此问题的最通用示例。
答案 0 :(得分:1)
期望的情况
泊坞窗映像中的数据放置在主机上的指定路径中。
您的当前情况
B<A>
/opt/test
问题
由于安装位置与放置数据的路径相同,因此数据将被覆盖。
解决方案
/opt/test
,touch /opt/test/data/myFile.txt
咨询来源