我有一个正在运行的容器,其卷已安装到本地主机目录:
"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复制文件到主机目录将与您期望的主机文件系统一样一致。容器和主机之间有一个非常薄的层。
通过默认驱动程序使用Docker卷local
还将提供类似的访问权限,因为这些卷也使用本地主机文件系统。
将文件复制到Docker容器文件系统中将取决于您使用docker运行的存储驱动程序。默认情况下,它是AUFS(很快将成为OverlayFS),因此在标准文件系统上还有一个附加层。我不希望它的一致性不太好,但是由于额外的层,出现问题或错误的机会更大,并且它的性能也不如本地文件系统。
从容器中获得的一项功能是主机和容器之间的共享信息。您在容器中执行的所有操作实际上都在主机内核中进行。因此,如果您写锁定文件,则主机可以看到该文件。如果您有文件mmap
ed,那么它将共享主机的全局mmap
空间。
从容器和主机访问或写入同一文件系统都可以。两者之间不会有差异或延迟。
写入同一文件或文件位置的多个进程将具有与任何多进程系统相同的约束。进程将需要使用文件锁定或互斥锁,否则可能会交错写入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句