Docker:将数据从主机复制到挂载的主机目录,以便从运行容器访问它

Docker: copy data from host to mounted host directory to access it from the running container

我有一个 运行 容器,其中一个卷安装到本地主机目录:

    "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/

?

快速测试表明这是有效的(即,如果我将 bash 执行到容器中并检查,文件就在那里),但是数据一致性是否安全?

注:

我知道也可以用

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

但在我的特定情况下,当从 Ceph (rbd) 挂载卷时,这不起作用。

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

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

将文件复制到 docker 容器文件系统将取决于 storage driver you run docker with。默认情况下,这是 AUFS(即将成为 OverlayFS),因此在标准文件系统之上还有一个附加层。我不希望它不太一致,但是由于额外的层,出现问题或错误的可能性更大,而且它的性能也不会像您的本地文件系统那样好。

来自主机和容器的访问

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

从容器和主机访问或写入同一个文件系统是可以的。两者之间不会有差异或延迟。

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