Docker Swarm错误-类型的挂载配置无效

时间:2019-12-29 16:36:08

标签: docker-compose docker-swarm docker-stack

这是我的Docker compose / stack文件。当我在单个节点上部署时,一切正常,但是当我在多个节点上部署时,出现以下错误:

  

类型绑定绑定源路径的无效安装配置不存在

version: '3'
services:
  shinyproxy:
    build: /etc/shinyproxy
    deploy: 
      replicas: 3
    user: root:root
    hostname: shinyproxy
    image: shinyproxy-example
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 5000:5000
    networks: 
      - proxynetwork
  mysql:
    image: mysql
    deploy: 
      replicas: 3    
    volumes:
      - /mysqldata:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: keycloak
      MYSQL_USER: keycloak
      MYSQL_PASSWORD: password
    networks: 
      - proxynetwork
  keycloak:
    deploy: 
      replicas: 3  
    image: jboss/keycloak
    volumes:
      - /etc/letsencrypt/live/ds-gym.de/fullchain.pem:/etc/x509/https/tls.crt
      - /etc/letsencrypt/live/ds-gym.de/privkey.pem:/etc/x509/https/tls.key
      #- /theme/govuk-social-providers/:/opt/jboss/keycloak/themes/govuk-social-providers/
    environment:
      - PROXY_ADDRESS_FORWARDING=true
      - KEYCLOAK_USER=myadmin
      - KEYCLOAK_PASSWORD=mypassword
    ports:
      - 8443:8443
    networks: 
      - proxynetwork

networks:
  proxynetwork:
    external: true

我知道在其他所有节点上也都需要卷路径,但是我认为这是一个非常糟糕的做法,我的其他2个节点无论如何都是工作者。我该如何解决这个问题?希望有一种解决方案可以让我保留卷,因为我为docker-compose build使用了相同的文件来构建映像。

有人可以帮我吗?

谢谢:-)

2 个答案:

答案 0 :(得分:2)

如果可能,您可以使用placement constraints将此服务限制为具有所需主机路径的节点。但是我猜测在这种用例中这不是一个选择。 主机安装的卷实际上不应在群集部署中使用,因为它会导致节点之间的文件系统中出现冗余数据。 (所有文件都必须存在于所有节点上)。

一种解决方案是实施NFS volumes

volumes:
  example:
    driver_opts:
      type: "nfs"
      o: "addr=<NFS_SERVER_IP>,nolock,soft,rw"
      device: ":/docker/path/to/configs"

此解决方案需要您托管NFS服务器。另外请记住,这种方法适用于配置,但不适用于需要提供高性能访问的文件系统。

关于在整个环境中使docker-compose文件保持相同的问题:尽管从技术上可行,但大多数现代项目都由基本的compose文件以及特定于环境的卷,网络,图像等覆盖组成

答案 1 :(得分:0)

您的服务将在您的可用节点上随机部署。 我想您的“要挂载目录”在管理器节点上,因此像这样在管理器节点上部署所需的服务。

deploy:
    placement:
        constraints:
            - node.role == manager