Docker:将数据从主机复制到已安装的主机目录,从正在运行的容器中进行访问

我有一个正在运行的容器,并将卷装载到本地主机目录中:

"Mounts": [ { "Source": "/var/lib/postgresql-9.5-docker", "Destination": "/var/lib/postgresql/data", "Mode": "", "RW": true, "Propagation": "rprivate" } ], 

如果我想提供从主机到容器的数据(例如,一个大的postgres转储),是否可以直接将文件从主机写入主机目录

 /var/lib/postgresql-9.5-docker/foo/ 

一个快速testing表明,这是工作(即,文件是否存在,如果我执行进入容器,并检查),但它是安全的数据一致性?

注意:

我知道也可以使用

 docker cp /path/to/src <containerid>:/path/to/dest 

但是在我的具体情况下,当从Ceph(rbd)挂载音量时,这不起作用。

将文件复制到主机目录将如您所期望的主机文件系统一样通过docker保持一致。 容器和主机之间有一层非常薄的层。

通过默认local驱动程序使用docker卷也将提供类似的访问,因为这些卷也使用本地主机文件系统。

将文件复制到docker容器文件系统将取决于您运行docker的存储驱动程序 。 默认情况下,这是AUFS(即将成为OverlayFS),所以在标准文件系统上有一个额外的层。 我不希望这样做不那么一致,但是由于额外的层次,有更多的机会出现问题或缺陷,并且性能也不如本地文件系统。

从主机和容器访问

从容器获得的一个function是主机和容器之间的共享信息。 你在容器中所做的一切实际上都发生在主机内核中。 所以如果你写locking一个文件,主机可以看到。 如果你有一个文件mmap ed,那么它将共享主机全局mmap空间。

从容器和主机访问或写入同一个文件系统都没问题。 两者之间不会有分歧或延误。

写入相同文件或文件位置的多个进程将具有与任何多进程系统相同的约束。 这些进程需要使用文件locking或互斥,否则写入可能会交错。