Назад | Перейти на главную страницу

Том Docker в общей папке NFS - пустой каталог

У нас есть развертывание 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 запускается полностью.

У кого-нибудь есть объяснение этому?

Когда именованный том инициализируется из пустого / нового состояния, докер копирует содержимое каталога изображений в именованный том. Есть несколько способов справиться с этим:

  1. Инициализируйте именованный том содержимым до запуска контейнера. Как вы видели, это отключает этап инициализации тома.
  2. Обновите образ, чтобы в каталоге был нужный uid / gid и содержались файлы с RUN chown -R 1000:1000 /path. Это должно предотвратить проблемы, но вы захотите протестировать, чтобы убедиться, что chown все еще не пытается запустить из докера, в зависимости от того, как он инициализирует эти файлы.
  3. Отключите сквош на NFS. Это частая причина проблем с томами докеров, и я не уверен, какое преимущество в безопасности вы получите. Если вам действительно нужно избегать root, вы можете попробовать настроить docker с пространством имен пользователей, но это сломает тома хоста, где вы предполагаете, что uid совпадает, поэтому будьте готовы к некоторым усилиям.
  4. Отключите инициализацию тома. С текущая композитная спецификация, есть вариант «без копирования», который вы можете добавить в спецификацию тома службы, используя длинный синтаксис. Это делается в службе, в которой используется том, а не на верхнем уровне, где этот том определяется.

Пример из документации 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: