dockerdocker-composedocker-swarmnfsopenmediavault

Mount OpenMediaVault NFS in docker-compose.yml volume for Docker Swarm


I am trying to externalise my runtime data from my applications to be saved in OpenMediaVault shared folder. I was able to create shared folder and configure NFS or at least I think so. The config I see in OMV/Services/NFS/Shares is:

Shared folder: NasFolder[on /dev/sda1, nas/]
Client: 192.168.50.0/24
Privelage: Read/Write
Extra options: subtree_check,insecure

Now in that shared folder I have this structure(I checked it using windows SMB/CIFS config)

\\nfs-ip\NasFolder
          |- mysql
          |   \- some my sql folders...
          |- TEST.txt

I want to use this mysql folder to store MariaDB runtime data(I know names are messed up I am in a middle of a migration to Maria...). And meaby create some other folders for other services. This is my config from docker-compose.yml:

version: '3.2'
services:
  mysqldb:
    image: arm64v8/mariadb:latest
    ports:
      - 3306:3306
    restart: on-failure:3
    volumes:
      - type: volume
        source: nfs-volume
        target: /mysql
        volume:
          nocopy: true
    environment:
      - MYSQL_ROOT_PASSWORD=my-secret-pw
    command: --character-set-server=utf8 --collation-server=utf8_general_ci

volumes:
  nfs-volume:
    driver: local
    driver_opts:
      type: "nfs"
      o: addr=192.168.50.70,nolock,soft,rw
      device: ":/NasFolder"

Now when I run docker stack deploy -c docker-compose.yml --with-registry-auth maprealm on my manager node I get error on maprealm_mysqldb.1 that looks like this:

"Err": "starting container failed: error while mounting volume '/var/lib/docker/volumes/maprealm_nfs-volume/_data': failed to mount local volume: mount :/NasFolder:/var/lib/docker/volumes/maprealm_nfs-volume/_data, data: addr=192.168.50.70,nolock,soft: permission denied",

I am pretty new to integration stuff. This is my home server and I just can't find good tutorials that 'get through my thick skull' how to configure those NFS paths and permissions or at least how can I debug it beside just getting this error. I know that volumes.nfs-volume.driver_opts.device is supposed to be a path but I am not sure what path should that be. I was trying to adapt config from here: https://gist.github.com/ruanbekker/4a9c0d250bce9f84482f2a788ce92131

Edit1) Few additional details:


Solution

  • Ok so if someone would be looking for solution:

    1. OMV by default has /export/ for NFS so volume needed to be updated. I needed to update volume for mysql and update volumes.mysql-volume.driver_opts.device to include that /export/ prefix and I also added path to mysql folder to have volume for mysqldb service use only:
    volumes:
      mysql-volume:
        driver: local
        driver_opts:
          type: "nfs"
          o: addr=192.168.50.70,nolock,soft,rw
          device: ":/export/NasFolder/mysql"
    
    1. After those changes there was need to update volume config on mysql/mariadb:
      mysqldb:
        image: arm64v8/mariadb:latest
        ports:
          - 3306:3306
        restart: on-failure:3
        volumes:
          - type: volume
            source: mysql-volume
            target: /var/lib/mysql
            volume:
              nocopy: true
        environment:
          - MYSQL_ROOT_PASSWORD=my-secret-pw
        command: --character-set-server=utf8 --collation-server=utf8_general_ci
    

    mysqldb.volumes.source points to name of your volume defined in step 1 - mysql-volume mysqldb.volumes.target is where inside container runtime data is stored. In mysql/mariadb databases runtime data is stored in /var/lib/mysql so you want to point to that and you can only use full path.

    1. Since I used default OMV config there were problems with permissions. So I updated OMV/Services/NFS/Shares to this:
    Shared folder: NasFolder[on /dev/sda1, nas/]
    #here you can see note 'The location of the files to share. The share will be accessible at /export/.'
    Client: 192.168.50.0/24
    Privelage: Read/Write
    Extra options: rw,sync,no_root_squash,anonuid=1000,anongid=1000,no_acl