如何将本地文件共享到docker容器中使用docker-compose进行swarm

时间:2016-06-01 18:16:51

标签: docker docker-compose docker-swarm docker-volume

这是我的docker撰写文件

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文件可以正常工作。移动到码头群后。它不起作用。它抛出以下错误

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. 如何将文件共享到群集群?

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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