Data Mastery
Data Mastery

Reputation: 2085

Docker Swarm error - invalid mount config for type

This is my Docker compose/stack file. When I deploy on a single node, everything works fine, but when I deploy on multiple nodes I get the following error:

invalid mount config for type bind bind source path does not exist

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

I understand that the volumes path is expected on every other node too, but I think this is a very bad practice and my other 2 nodes are anyway just workers. How can I solve that problem? Hopefully there is a solution which allows me to keep the volumes, since I use the same file for docker-compose build to build my images.

Can someone help me?

Thank you :-)

Upvotes: 5

Views: 22242

Answers (2)

webmaster
webmaster

Reputation: 2020

In a swarm your services will be deployed randomly on your available nodes. I suppose your "to be mounted directory" is on the manager node, so deploy the wanted service on the manager node like so.

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

Upvotes: 0

pat
pat

Reputation: 1945

If it is possible you could restrict this service to the node that has the required host path's using placement constraints. However I'm guessing that that's not an option in this use case. Host mounted volumes should really not be used in a swarm deployment as it would cause redundant data in the filesystems between the nodes. (All files need to be present on all nodes).

One solution would be to implement NFS volumes:

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

This solution requires you to host a NFS-Server though. Also keep in mind that this approach is fine for configs but should not be used for file systems that need to provide high performance access.

Regarding your question about keeping your docker-compose file the same across environments: While it is technically possible to do so, most modern projects consist of a base compose file as well as an environment specific override for volumes,networks,images etc.

Upvotes: 5

Related Questions