Вопрос или проблема
Вот моя настройка. У меня есть SMB-ресурс с именем пользователя, скажем, ‘nexus’ и установленным паролем. Я смонтировал его на экземпляр сервера Ubuntu с помощью следующей команды
sudo mount -t cifs //172.16.16.6/share /mnt/nas -o rw,user=nexus,uid=1000
У меня работает несколько контейнеров Docker, которые записывают в этот ресурс, и они, похоже, работают совершенно нормально. Все они управляются с помощью docker compose.
С тех пор я добавил новую службу в docker compose, которая делает дамп базы данных Postgres и записывает его в вышеупомянутый ресурс. Но этот контейнер выдает мне следующую ошибку
BACKUP_DIR указывает на файл или папку с недостаточными правами.
Переменная BACKUP_DIR
— это указанный SMB-ресурс.
Следующая служба была добавлена в docker-compose.yml
backup:
container_name: db_dumper
image: prodrigestivill/postgres-backup-local:14
restart: always
env_file:
- .env
environment:
POSTGRES_HOST: database
POSTGRES_CLUSTER: 'TRUE'
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_DATABASE_NAME}
SCHEDULE: "30 23 * * *"
POSTGRES_EXTRA_OPTS: '--clean --if-exists'
BACKUP_DIR: /mnt/nas/nexus/app_data/backups/star_pg/
volumes:
- /mnt/nas/nexus/app_data/backups/star_pg:/db_dumps
depends_on:
- database
Я запускаю контейнеры с помощью sudo docker-compose up -d
Что я здесь упустил? Docker пытается получить доступ к монтированию от имени конкретного пользователя? Почему другие службы, запущенные с помощью этого же файла docker-compose, могут читать/записывать, а эта служба — нет?
Ответ или решение
У вас возникла проблема с правами доступа при записи в SMB-общую папку с вашего Linux-сервера. Давайте проанализируем ваш сценарий и выявим возможные причины и решения для устранения этой ошибки.
Ошибка доступа к SMB-шаре
Вы упомянули, что смогли монтировать SMB-шар с использованием команды:
sudo mount -t cifs //172.16.16.6/share /mnt/nas -o rw,user=nexus,uid=1000
Анализ конфигурации
-
Права доступа на SMB-шаре:
- Убедитесь, что пользователь
nexus
, с которым вы монтируете SMB-шар, имеет необходимые права на запись в директорию/share
на сервере, где расположен SMB. Возможно, что разрешения на уровне сервера не позволяют этому пользователю записывать данные.
- Убедитесь, что пользователь
-
Свойства монтирования:
- При монтировании с помощью
uid=1000
, вы создаете привязку SMB-шара к локальному пользователю с UID 1000, что может не совпадать с UID пользователя внутри контейнера Docker, если контейнер запускается с другими настройками пользователя.
- При монтировании с помощью
Контейнер и его окружение
Судя по вашему docker-compose.yml
, вы добавили новый сервис, который использует переменную окружения BACKUP_DIR
для указания директорий. Однако, если пользователь, под которым работает контейнер, не имеет прав на запись в /mnt/nas
, это приведет к ошибке:
BACKUP_DIR points to a file or folder with insufficient permissions.
Основные моменты:
-
Контейнерные пользователи: Docker-контейнеры могут запускаться под различными пользователями. Вы можете проверить, под каким пользователем работает новый контейнер. Для этого можно использовать команду:
docker exec -it db_dumper id
-
Маппинг UID и GID: Убедитесь, что UID и GID пользователя в контейнере соответствуют UID и GID, с которыми SMB-шар смонтирован. Если они отличаются, добавьте файлы в директорию, установив владельца на соответствующий UID и GID.
Рекомендации по устранению проблемы
-
Проверка прав доступа:
- Проверьте права доступа к директории на стороне SMB. Убедитесь, что у пользователя
nexus
есть праваwrite
.
- Проверьте права доступа к директории на стороне SMB. Убедитесь, что у пользователя
-
Контейнерные настройки:
- Если необходимо, можете явно указать пользователя для контейнера, добавив следующий параметр в ваш
docker-compose.yml
:
user: "1000:1000"
Это гарантирует, что контейнер будет работать под тем же пользователем, что и непосредственно на сервере.
- Если необходимо, можете явно указать пользователя для контейнера, добавив следующий параметр в ваш
-
Проверка прав на монтированной директории:
- После монтирования, проверьте права на
/mnt/nas/nexus/app_data/backups/star_pg/
:
ls -ld /mnt/nas/nexus/app_data/backups/star_pg/
Обратите внимание на права и владельца директории.
- После монтирования, проверьте права на
-
Логирование и отладка:
- Проверьте логи контейнера на наличие дополнительных подсказок или ошибок. Это можно сделать с помощью команды:
docker logs db_dumper
Заключение: Работая с SMB и Docker, важно следить за совпадением прав доступа и конфигурациями пользователей между хост-системой и контейнерами. Пошаговая проверка всех упомянутых аспектов должна помочь вам решить проблему доступа при записи в SMB-шар. Если после выполнения указанных действий проблема останется нерешенной, возможно, стоит обратиться к системным администраторам или воспользоваться специализированными форумами для получения дополнительной помощи.