我有两个容器 A 和 B,它们需要通过 A 在 /var/run/notif.sock 中创建的 unix 域套接字进行通信。
我不能使用命名卷,因为在容器之间共享 /var/run 是有风险的,因为它包含容器的运行时数据。
绑定挂载要求主机已经有一个同名的文件。
绑定挂载的问题是,如果我创建一个与套接字文件同名的主机文件,并使用这样的绑定挂载: --v /var/run/notif.sock : /var/run/notif.sock ,它会由容器 A 内的 docker 自动创建一个纯文本文件 /var/run/notif.sock ,并且当容器 A 内的实际进程尝试打开套接字时,套接字文件创建会在容器内部失败,并出现错误“地址已在使用中”,因为已经存在一个同名的文件。
还有其他方法可以解决这个问题吗?
答案1
如果您可以配置套接字文件的目录,则可以只共享该目录(例如/var/run/share),避免共享/var/run。
如果您无法更改套接字目录,您可以尝试在共享目录中的 A 中使用不同的套接字文件。新套接字将是 B 要写入的套接字(我从您的帖子中假设 A 正在监听套接字并且 B 正在写入),并在 A 中准备一个程序来监听新文件并写入原始文件。以下只是使用 socat 进行的测试,您应该考虑管理异常等:
socat UNIX-LISTEN:/var/run/share/notif.sock - | socat UNIX-CONNECT:/var/run/notif.sock -
从 /var/run/share/notif.sock 读取的所有内容都写入 /var/run/notif.sock。当然,如果您无法更改 B 中的目录,您可以使用类似的解决方案