Хранение данных MySQL в файле изображения (в формате ext4) - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь использовать Docker для контейнерирования базы данных MySQL (фактически MariaDB).Я понял, как хранить данные MySQL (/ var / lib / mysql) в томе, смонтированном из каталога хоста.

Однако, поскольку базовая файловая система отличается от хоста к хосту, существуют некоторые несоответствия, например, имена таблиц нечувствительны к регистру в NTFS (Windows).Кроме того, похоже, что если база данных создана на хосте Linux, она не работает на хосте Windows (не выяснил, почему именно).

Поэтому я хочу сохранить данные на дискеобраз и смонтировать его внутри контейнера, т.е. db-data.img в формате ext4.Но я сталкиваюсь со странной проблемой, когда монтирую этот образ внутри контейнера:

$ docker run -v $PWD:/outside --rm -it ubuntu /bin/bash
# dd if=/dev/zero of=/test.img bs=1M count=100
# mkfs.ext4 test.img
# mount -o loop -t ext4 test.img /mnt
mount: /mnt: mount failed: Operation not permitted.

Использование другого каталога вместо /mnt также не работает.

Почему он отказывается монтировать файл img?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Он не будет работать внутри образа Docker, Docker блокирует доступ к монтированию файловых систем (и петлевых устройств).Должно быть проще создать этот образ ранее, смонтировать и подключиться к докеру в виде папки с помощью -v.

PS. Другой вариант - выгрузить базу данных в sql и восстановить ее из windows.

0 голосов
/ 19 мая 2019

Мне удалось решить эту проблему с помощью опции privileged в docker-compose.yml:

privileged: true

(или --privileged в команде docker)

Вот мойfinal docker-compose.yml:

version: '3'
services:
  db:
    build: ./db
    image: my_db
    container_name: db
    privileged: true
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
    volumes:
      - ${MYSQL_DATA_IMG}:/data.img
    restart: always

Dockerfile:

FROM mariadb

COPY my-custom.cnf /etc/mysql/conf.d/custom.cnf

COPY run.sh /usr/local/bin/run-mariadb.sh
ENTRYPOINT ["run-mariadb.sh"]

и сценарий пользовательской точки входа, который выполняет mount (run.sh):

#!/bin/sh

# For this mount comamnd to work the DB container must be started
# with --privileged.
mount -o loop /data.img /var/lib/mysql

# Call the entry point script of MariaDB image.
exec /usr/local/bin/docker-entrypoint.sh mysqld
0 голосов
/ 08 октября 2018

Я бы предложил использовать docker-compose и просто использовать том, объявленный в конфигурации docker-compose.yml.

Примерно так:

version: '3'

services:
    mysql:
        image: mysql
        environment:
            MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
            MYSQL_USER: $MYSQL_USER
            MYSQL_PASS: $MYSQL_PASSWORD
        volumes:
            - mysql-data:/var/lib/mysql
volumes:
    mysql-data:

Том mysql-data должен бытьхранится как отдельный том, независимый от операционной системы хоста.Разница заключается только в монтировании каталога на хосте, это в основном монтирование контейнера тома (что вы также можете сделать без docker-compose , но это больше работы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...