- Вопрос или проблема
- Ответ или решение
- Позвольте начать с вашей текущей конфигурации Docker Compose:
- Шаг 1: Проверка прав доступа к директории USB-диска
- Шаг 2: Форматирование и монтирование USB-диска
- Шаг 3: Проверка конфигурации Docker
- Шаг 4: Убедитесь в том, что конфигурация базы данных корректна
- Заключение
Вопрос или проблема
Вот мой тестовый код
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-диска в качестве тома. Убедитесь, что права на директорию настроены корректно, и что пользователь базы данных имеет необходимые привилегии. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.