7

这是我的码头工人撰写文件

version: '2'
services:
 demoui:
  image: demoimage
  ports:
   - "80:8000"
  volumes:
   - ./democonfig/config.js:/usr/local/tomcat/webapps/demo-ui/config.js
   - ./logs/demo-ui:/usr/local/tomcat/logs
  restart: unless-stopped

当我在单节点中时,这个 docker compose 文件有效。移至 docker swarm 后。它不工作。它抛出以下错误

ERROR: for demoui  Error response from daemon: rpc error: code = 2 desc = "oci runtime error: could not synchronise with container process: not a directory"
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "compose/cli/main.py", line 63, in main
AttributeError: 'ProjectError' object has no attribute 'msg'
docker-compose returned -1

所以问题是

  1. 如何将文件共享到 swarm 集群?

  2. 还是需要将所有文件复制到图像中并运行它?

  3. 请与 swarm 分享一些 docker volume 的文档。

4

1 回答 1

5

您收到的错误是因为您的卷的源文件/目录在您启动的 swarm 节点上不存在。Docker(和docker-compose)无法将这些文件复制到 swarm 中的其他主机。

源文件/目录需要存在于您要与之共享配置文件的所有 swarm 节点上。您还在撰写文件中使用了上下文相关的路径,这在所有节点之间不会保持一致。这应该是一个绝对路径(即/opt/config,而不是./configor ~/config)。

作为快速修复,您需要将配置文件复制到同一位置(即 /opt 或其他目录)的每个节点,并修改您的 compose 文件以指向该一致位置,例如

  volumes:
   - /opt/config/config.js:/usr/local/tomcat/webapps/demo-ui/config.js
   - /opt/logs/demo-ui:/usr/local/tomcat/logs

从长远来看,您可以手动同步这些文件,使用lsyncd之类的工具使它们在节点之间自动保持同步,将它们放在 NFS 卷上并将其挂载到每个节点上,或者使用glusterfs之类的工具。

请记住您的日志目录,您可能希望确保您的日志文件不会相互干扰,因此您可能希望将它们保留在本地,或者如果使用共享存储,则确保每个节点的日志文件名都是唯一的。

于 2017-02-07T16:27:25.017 回答