У нас есть развертывание Docker Swarm, работающее на двух узлах (node1 и node2) для нашего бизнес-приложения.
Приложению нужен том для хранения постоянных данных. Поскольку неясно, где развернут контейнер (node1 или node2), а также, возможно, два контейнера нашего приложения должны работать на обоих узлах, нам понадобилось решение для предоставления общего тома для всех узлов.
Для совместного использования тома мы настроили сервер NFS на третьем узле 3 со следующим файлом / etc / exports:
/srv *(rw,sync,anonuid=1000,anongid=1000,all_squash,subtree_check,crossmnt,fsid=root)
(Я использую anonuid / gid, чтобы явно указать для каждого файла в экспорте информацию о пользователе для известного пользователя в системе node3. All_squash используется для того, чтобы убедиться, что все права на файлы от всех пользователей, осуществляющих доступ, переписаны этому локальному пользователю)
В нашем docker-compose.yml мы используем следующую настройку для включения тома:
volumes:
nfs-data:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=node3.example.com,rw,nolock,soft
Теперь мы столкнулись с проблемой, когда контейнер просто не хотел запускаться, сообщение об ошибке было:
failed to copy file info for /var/lib/docker/volumes/MY_CONTAINER_nfs-data/_data: failed to chown /var/lib/docker/volumes/MY_CONTAINER_nfs-data/_data: lchown /var/lib/docker/volumes/MY_CONTAINER_nfs-data/_data: operation not permitted
После некоторого покопания я обнаружил, что проблема связана с исходной пустой папкой в экспортированном каталоге NFS на сервере node3. Как только я вставляю пустой файл, контейнер в node1 и node2 запускается полностью.
У кого-нибудь есть объяснение этому?
Когда именованный том инициализируется из пустого / нового состояния, докер копирует содержимое каталога изображений в именованный том. Есть несколько способов справиться с этим:
RUN chown -R 1000:1000 /path
. Это должно предотвратить проблемы, но вы захотите протестировать, чтобы убедиться, что chown все еще не пытается запустить из докера, в зависимости от того, как он инициализирует эти файлы.Пример из документации docker с параметром «nocopy» выглядит так:
version: "3.8"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
volumes:
mydata: