Контейнер Docker mariadb (или mysql) использует директорию USB-накопителя в качестве тома.

Вопрос или проблема

Вот мой тестовый код

version: '3.8'
services:
  mariadb:
    image: mariadb:10.6
    container_name: test-mysql
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
#      - /media/roroco/kingston64g/test-mysql:/var/lib/mysql
      - /tmp/test-mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rpwd
      MYSQL_DATABASE: db
      MYSQL_USER: user
      MYSQL_PASSWORD: pwd
    ports:
      - "3306:3306"

docker-compose down; docker-compose up

При использовании тома /media/roroco/kingston64g/test-mysql доступ к базе данных запрещен, если использовать /tmp/test-mysql, доступ к базе данных успешный, см. следующий вывод

~/Dropbox/go/cmds/draft/testnextcloud $ docker exec -it test-mysql mysql -uuser -ppwd
ERROR 1045 (28000): Доступ запрещен для пользователя 'user'@'localhost' (используя пароль: YES)
~/Dropbox/go/cmds/draft/testnextcloud $ docker exec -it test-mysql mysql -uuser -ppwd
Добро пожаловать в монитор MariaDB.  Команды заканчиваются ; или \g.

Итак, как заставить mariadb(или mysql) работать на usb-накопителе

Мой usb-накопитель выглядит так, я думаю, его тип (ext4) такой же, как у системного диска

введите описание изображения здесь

Мои журналы docker при использовании /media/roroco/kingston64g/test-mysql

~/Dropbox/go/cmds/draft/testnextcloud $ docker logs test-mysql
2024-12-12 10:23:48+00:00 [Note] [Entrypoint]: Скрипт начальной точки для MariaDB Server 1:10.6.20+maria~ubu2004 запущен.
2024-12-12 10:23:48+00:00 [Note] [Entrypoint]: Переход на выделенного пользователя 'mysql'
2024-12-12 10:23:48+00:00 [Note] [Entrypoint]: Скрипт начальной точки для MariaDB Server 1:10.6.20+maria~ubu2004 запущен.
2024-12-12 10:23:48+00:00 [Note] [Entrypoint]: Файл конфигурации проверки работоспособности MariaDB отсутствует, предполагая желаемое состояние
2024-12-12 10:23:48+00:00 [Note] [Entrypoint]: Обновление MariaDB (mariadb-upgrade или создание пользователей проверки работоспособности) требуется, но пропущено из-за установки $MARIADB_AUTO_UPGRADE
2024-12-12 10:23:48 0 [Note] Запуск MariaDB 10.6.20-MariaDB-ubu2004-log, резервная версия f00711bba2cd383825d0be1867f7d7d7f641c9e4, uid сервера ktsApgX4LEgDpWmLESPdR2Ed5fs= как процесс 1
2024-12-12 10:23:48 0 [Note] InnoDB: Сжатые таблицы используют zlib 1.2.11
2024-12-12 10:23:48 0 [Note] InnoDB: Количество пулов: 1
2024-12-12 10:23:48 0 [Note] InnoDB: Использование инструкций crc32 + pclmulqdq
2024-12-12 10:23:48 0 [Note] mariadbd: O_TMPFILE не поддерживается в /tmp (деактивация будущих попыток)
2024-12-12 10:23:48 0 [Note] InnoDB: Использование нативного AIO Linux
2024-12-12 10:23:48 0 [Note] InnoDB: Инициализация пула буфера, общий размер = 134217728, размер куска = 134217728
2024-12-12 10:23:48 0 [Note] InnoDB: Завершена инициализация пула буфера
2024-12-12 10:23:48 0 [Note] InnoDB: 128 сегментов отмены активны.
2024-12-12 10:23:48 0 [Note] InnoDB: Создание общего пространства таблиц для временных таблиц
2024-12-12 10:23:48 0 [Note] InnoDB: Установка размера файла './ibtmp1' на 12 МБ. Физическая запись файла завершена; Пожалуйста, подождите ...
2024-12-12 10:23:48 0 [Note] InnoDB: Размер файла './ibtmp1' теперь 12 МБ.
2024-12-12 10:23:48 0 [Note] InnoDB: 10.6.20 запущен; номер последовательности журнала 42514; идентификатор транзакции 14
2024-12-12 10:23:48 0 [Note] Плагин 'FEEDBACK' отключен.
2024-12-12 10:23:48 0 [Note] InnoDB: Загрузка пула буферов из /var/lib/mysql/ib_buffer_pool
2024-12-12 10:23:48 0 [Note] InnoDB: Загрузка пула буферов завершена в 241212 10:23:48
2024-12-12 10:23:48 0 [Note] Серверный сокет создан на IP: '0.0.0.0'.
2024-12-12 10:23:48 0 [Note] Серверный сокет создан на IP: '::'.
2024-12-12 10:23:48 0 [Note] mariadbd: готов к подключениям.
Версия: '10.6.20-MariaDB-ubu2004-log'  сокет: '/run/mysqld/mysqld.sock'  порт: 3306  бинарное распределение mariadb.org
2024-12-12 10:23:49 4 [Warning] Доступ запрещен для пользователя 'user'@'localhost' (используя пароль: YES)
2024-12-12 10:23:50 5 [Warning] Доступ запрещен для пользователя 'user'@'localhost' (используя пароль: YES)
2024-12-12 10:23:51 6 [Warning] Доступ запрещен для пользователя 'user'@'localhost' (используя пароль: YES)

Ответ или решение

Для успешного использования контейнера MariaDB (или MySQL) с USB-диском в качестве тома Docker, необходимо учесть несколько ключевых аспектов, связанных с настройкой прав доступа и особенностями дискового ввода-вывода.

Позвольте начать с вашей текущей конфигурации Docker Compose:

version: '3.8'
services:
  mariadb:
    image: mariadb:10.6
    container_name: test-mysql
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - /media/roroco/kingston64g/test-mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rpwd
      MYSQL_DATABASE: db
      MYSQL_USER: user
      MYSQL_PASSWORD: pwd
    ports:
      - "3306:3306"

При использовании тома /media/roroco/kingston64g/test-mysql вы столкнулись с проблемой доступа к базе данных, тогда как с томом /tmp/test-mysql доступ оказался успешным. Это указывает на то, что проблема может заключаться в настройках прав доступа к USB-диску.

Шаг 1: Проверка прав доступа к директории USB-диска

Для начала, убедитесь, что у каталога на USB-диске есть необходимые права доступа для пользователя mysql, под которым работает контейнер. Вы можете проверить права, выполнив команду:

ls -ld /media/roroco/kingston64g/test-mysql

Если пользователь mysql или группа, к которой он принадлежит, не имеет прав на запись в этот каталог, это приведет к ошибкам доступа.

Чтобы предоставить необходимые права, выполните:

sudo chown -R 1001:1001 /media/roroco/kingston64g/test-mysql
sudo chmod 755 /media/roroco/kingston64g/test-mysql

Здесь 1001 — это идентификатор пользователя mysql в контейнере. Убедитесь, что вы используете правильный идентификатор пользователя, проверив его с помощью следующей команды:

docker exec -it test-mysql id mysql

Шаг 2: Форматирование и монтирование USB-диска

Вы указали, что ваш USB-диск отформатирован как ext4, что является хорошим выбором для использования с Linux. Проверьте, смонтирован ли диск с правильными параметрами. Для монтирования с файлами базы данных используется параметр noatime, что позволяет уменьшить запись на диск:

sudo mount -o rw,noatime /dev/sdXY /media/roroco/kingston64g

При этом учтите, что замените /dev/sdXY на путь к вашему устройству.

Шаг 3: Проверка конфигурации Docker

После того, как вы проверили права на директорию и убедились в правильности монтирования, перезапустите контейнер:

docker-compose down
docker-compose up -d

После этого снова проверьте логи контейнера MariaDB на наличие ошибок:

docker logs test-mysql

Шаг 4: Убедитесь в том, что конфигурация базы данных корректна

Убедитесь, что пользователь user имеет права для подключения к базе данных. Попробуйте подключиться как root и проверьте права:

docker exec -it test-mysql mysql -uroot -rpwd -e "SELECT host FROM mysql.user;"

Если user не имеет необходимых прав, вы можете добавить их:

GRANT ALL PRIVILEGES ON db.* TO 'user'@'%' IDENTIFIED BY 'pwd';
FLUSH PRIVILEGES;

Заключение

Следование вышеуказанным шагам должно помочь вам успешно настроить и запустить контейнер MariaDB с использованием USB-диска в качестве тома. Убедитесь, что права на директорию настроены корректно, и что пользователь базы данных имеет необходимые привилегии. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...