![如何在没有命名卷的容器之间共享 unix 域套接字?](https://linux22.com/image/765258/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%B2%A1%E6%9C%89%E5%91%BD%E5%90%8D%E5%8D%B7%E7%9A%84%E5%AE%B9%E5%99%A8%E4%B9%8B%E9%97%B4%E5%85%B1%E4%BA%AB%20unix%20%E5%9F%9F%E5%A5%97%E6%8E%A5%E5%AD%97%EF%BC%9F.png)
我有两个容器 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 中的目录,您可以使用类似的解决方案