Запуск MarianDB в Docker контейнере в Windows

Сам по себе запуск не представляет трудностей, однако настройка контейнера с базой данных предполагает сохранение данных между запусками.

Запуск файла конфигурации (docker-compose.yaml):

version: "3"

services:
  mysql:
    image: bitnami/mariadb:10.7
    volumes:
      - /SharedFolder/ProjectFolder/FolderForDatabaseData:/bitnami/mariadb
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_ROOT_PASSWORD=${DB_PASSWORD}
      - MARIADB_DATABASE=${DB_NAME}

С переменными окружения задаваемыми в файле .env:

DB_PASSWORD=your_root_database_password
DB_NAME=your_database

Приводит к остановки контейнера. Просмотр логов сообщает об ошибке (говорящей о том, что используемая файловая система не поддерживает aio):

[36mmysql_1  |[0m 2022-04-18 17:29:12 0 [ERROR] InnoDB: Operating system error number 22 in a file operation.
[36mmysql_1  |[0m 2022-04-18 17:29:12 0 [ERROR] InnoDB: Error number 22 means 'Invalid argument'
[36mmysql_1  |[0m 2022-04-18 17:29:12 0 [ERROR] InnoDB: File ./ibdata1: 'aio write' returned OS error 222. Cannot continue operation
[36mmysql_1  |[0m 220418 17:29:12 [ERROR] mysqld got signal 6 ;

Найденное решение в сети, связанное с заданием конфигурации БД (в файле conf.d):

[mysql]
innodb_flush_method=O_DSYNC
innodb_use_native_aio=0

Не устраняет возникающую ошибку.

Попытки задания конфигурации в docker-compose.yaml так же не привели к положительному результату.

Возможное решение

Если не используются «специфические» возможности MarianDB можно вместо нее использовать образ MySQL:

version: "3"

services:      
  mysql:
    image: mysql:5.7.25
    volumes:
      - /SharedFolder/ProjectFolder/FolderForDatabaseData:/var/lib/mysql
    command: "--innodb_use_native_aio=0"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}

Важно обязательно использовать команду, которая устраняет ошибку связанную с aio:

command: "--innodb_use_native_aio=0"

В случае необходимости проверки работоспособности кода на MarianDB необходимо:

  • использовать сборку без указания volumes для данных (это приведет к созданию пустой БД)
  • импортировать структуру, тестовые данные в БД (подготовленные из структуры/данных используемой MarianDB в проекте, а не MySQL, используемые при разработке)
  • проверить работоспособность приложения