Бакет как Volume
Монтированный бакет Yandex Cloud ObjectStorage можно использовать как Volume Docker контейнера. Бакет указывается как обычная директория в Docker compose:
volumes:
- ./<монтированная директория бакета>/:/app/<директория в docker контейнере>
Для доступа к файлам бакета из контейнера необходимо в конфигурации
демона, монтирующего бакет задать режим кэширования файлов writes
для доступа к имеющимся в бакете файлам:
--vfs-cache-mode writes
- In this mode all reads and writes are buffered to and from disk. When data is read from the remote this is buffered to disk as well.
А также разрешить доступ root пользователю к монтированной директории.
--allow-root
- Необходимо для обхода ошибки запуска Docker контейнера с монтированным бакетом в качестве volume.
Порядок запуска
Запущенный Docker контейнер может не иметь доступа к файлам бакета, если бакет был смонтирован после запуска контейнера.
Для решения этой проблемы необходимо настроить корректный порядок запуска:
- Монтирование бакета.
- Запуск Docker контейнера.
Т.к. монтирование бакета выполняется с помощью демона пользователя, в конфигурации демона можно задать шаги для остановки docker-service
и его запуска уже после монтирования директории.
В секцию [Service]
демона добавьте команды для остановки docker-service
перед запуском rclone
и его запуска после завершения:
[Service]
ExecStartPre=-/usr/bin/sudo /bin/systemctl stop docker
ExecStartPost=/usr/bin/sudo /bin/systemctl start docker
ExecStartPre
остановитdocker
перед запускомrclone
.ExecStartPost
запуститdocker
после успешного стартаrclone
.
Обновите конфигурацию демонов пользователя:
systemctl --user daemon-reload
Разрешите пользователю управлять docker
через sudo
без пароля:
- Откройте файл sudoers:
sudo visudo
- Добавьте строку:
<user_name> ALL=(ALL) NOPASSWD: /bin/systemctl stop docker, /bin/systemctl start docker
- Перезапустите
rclone<%i>.service
:
systemctl --user restart rclone@<%i>.service
Последнее изменение: 21.09.2024 20:15