Как подключить nfs диск в docker compose (portainer, swarm)

Никаких сторонних говноплагинов типа docker network share plugin. Только нейтив!

С подключением удаленной nfs шары у portainer (2.5.1) есть забавный косяк. О нем позже. Но если о нем не знать, можно пролюбиться весьма длительное время не получив вменяемый результат.

Концепт

На сервере создаем юзера под шару. Ну обычно по имени сервиса которому эта шара нужна. Далее экспортим ее в сеть, и мапим uid и gid. Докер подключается к ней и работает. При этом не важно какой юзер на машине с докером, мы в любом случае подменяем пользователя на своего на стороне сервера.

 

Итак

Любым доступным способом создаем шару, переносим туда нужные файлы, создаем юзера и группу, меняем владельца на них у всей шары. 

идем в /etc/exports и добавляем шару. Лучше без всяких масок. И без доменных имен. Айпишник и все. Как то так

/export/uploads 10.1.0.15(fsid=6,rw,subtree_check,sync,insecure,all_squash,anonuid=1000,anongid=1003)

anonuid и anoguid можно посмотреть командой 

id <username>

Тоесть нужно поставить ид пользователя и группу, которым пренадлежит каталог с шарой.

Теперь идем на сервер с докером и проверяем доступна ли шара

showmount -e <nfs server ip>

должно вывести список шар.

Если все ок идем дальше. А именно, в случае с portainer идем в раздел Volumes, выбираем Add Volume,

вводим имя
driver: local
use nfs: yes
address: <nfs server ip>
nfs version: nfs4
mount point: точка монтирования на сервере*
mount options: rw,noatime,rsize=8192,wsize=8192,tcp,timeo=14 (по умолчанию)


И вот в чем косяк, о котором писал выше, если посмотреть шары которые есть у nfs сервера, он выведет список вроде такого:
 

/export/upload                             127.10.10.1
/export/photos                             127.10.10.2,127.10.10.3

так вот в секции mount point нужно писать БЕЗ export! Тоесть вот так:

/photos


Ну и финально идем в compose файл, в секции volumes описываем только что созданный удаленный диск
 

volumes:
  some_volume_name:
    external: true

и используем его как обычно.