За последние 24 часа нас посетили 22736 программистов и 1268 роботов. Сейчас ищут 770 программистов ...

хранение данных локально docker mysql

Тема в разделе "Версионность, тестирование и развёртывание", создана пользователем виталий032, 20 ноя 2018.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Система: Windows 10
    Хочу чтобы mysql (которая в контейнере) использовала для хранения данных мою локальную папку.

    Ожидания:
    1. Скачал докер
    2. В консоли ввел
    Код (Text):
    1. $ docker run -it -e MYSQL_ROOT_PASSWORD=123123 --name mysql_container -v //c/Users/User/database:/var/lib/mysql mysql:5.6
    3. Зашел в контейнер и создал базу данных
    Код (Text):
    1. $ docker exec -it mysql_container bash
    Код (Text):
    1. mysql -u root -p
    Код (Text):
    1. create database localdata;
    4. Теперь останавливаю контейнер, удаляю его, и при создании нового контейнера хочу использовать старые данные из
    Код (Text):
    1. //c/Users/User/database
    Застрял на шаге 2. Выдается такая ошибка:
    Код (Text):
    1. 2018-11-20 08:35:06 33 [ERROR] InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation
    Если написать вместо
    Код (Text):
    1. //c/Users/User/database
    Код (Text):
    1. c:\Users\User\database
    , то синтаксическую ошибку выдает.

    Если верить документации и статьям в интернете, то все вообще должно быть easy: -v /path/on/host:/path/in/container <container_name>

    Может кто сталкивался с такой проблемой?
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    виталий032 нравится это.
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    1. Больше не буду мучить:):
    Код (Text):
    1. version: "2"
    2. services:
    3.   mysql-container:
    4.     container_name: mysql-container
    5.     restart: always
    6.     image: mysql:latest
    7.     environment:
    8.       - MYSQL_ROOT_PASSWORD=123123
    9.     volumes:
    10.       - "$PWD:/etc/mysql/conf.d"
    11.       - "$PWD/../localdata:/var/lib/mysql"
    12.     ports:
    13.       - 3306:3306
    Не работает. Та же самая ошибка "File ./ib_logfile101: 'aio write' returned OS error 122."

    Затем добавил "$PWD:/etc/mysql/conf.d".
    $PWD - это текущая директория. В ней находится файл local.cnf:
    Код (Text):
    1. [mysqld]
    2. innodb_use_native_aio=0
    Выдает ошибку:
    Код (Text):
    1. mysql-container    | mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/local.cnf' is ignored.
    Это скорее всего означает, что прав нету в самом контейнере. Я бы присвоил, но сделать это до старта контейнера я не знаю как.
    2. Тестил. Описал выше.
    3. Shared-drivers: т.к. винда 10 обычная, то по requirements не подхожу под Docker for Windows. Использую Docker Toolbox

    Наверное из-за вот таких "бубнов" и используют linux.
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну я бы так делать не стал ты затираешь существующие конфиги
    Код (Text):
    1. local.cnf:/etc/mysql/conf.d/local.cnf
    --- Добавлено ---
    Дело не в этом но для этого есть Dockerfile
    Код (Text):
    1. FROM mysql:8
    2. RUN chmod 777 ...
    плюс в compose есть command
     
    виталий032 нравится это.
  5. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Спасибо и на этом. Это было мое первое знакомство с Docker. Я понял, что использовать его не буду:D...
    ---
    P.S. ... по крайней мере под windows
     
    #5 виталий032, 20 ноя 2018
    Последнее редактирование: 20 ноя 2018
  6. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Зря. Docker рулит.
     
    виталий032 нравится это.
  7. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Спустя долгое время и какой-то опыт мне удалось докопаться до истины за час:).

    Так как я счастливый обладатель Windows 10 Home, то вынужден использовать legacy Docker ToolBox без возможности расшарить папки вне C:\Users

    Итак, что я сделал:
    1. Создал volume
    Код (Text):
    1. docker volume create --name pg -d local
    2. Изменил docker-compose.yml
    Код (Text):
    1. version: '3.1'
    2.  
    3. services:
    4.   db:
    5.     container_name: postgres_container
    6.     image: postgres
    7.     build:
    8.       #context: .
    9.       #dockerfile: .Dockerfile
    10.     restart: always
    11.     environment:
    12.       POSTGRES_USER: postgres
    13.       POSTGRES_PASSWORD: example
    14.     volumes:
    15.       - pg:/var/lib/postgresql/data/
    16.     ports:
    17.       - 6777:8080
    18. volumes:
    19.   pg:
    3. Всё, теперь при запуске контейнера (docker-compose up) и при остановки/удалении (docker-compose down) данные базы данных не теряются.

    Если сделать volume для данных postgres на кастомную папку, то выведется ошибка /var/lib/postgresql/data/ has wrong permissions
    Код (Text):
    1. environment:
    2.       POSTGRES_USER: postgres
    3.       POSTGRES_PASSWORD: example
    4.     volumes:
    5.       - /c/Users/User/<ваша_пустая_папка_для_postgres_данных>/:/var/lib/postgresql/data/
    Если хотим просто папку расшарить (которую postgres не использует), то делаем вот так:
    Код (Text):
    1. version: '3.1'
    2.  
    3. services:
    4.   db:
    5.     container_name: postgres_container
    6.     image: postgres
    7.     build:
    8.       #context: .
    9.       #dockerfile: .Dockerfile
    10.     restart: always
    11.     environment:
    12.       POSTGRES_USER: postgres
    13.       POSTGRES_PASSWORD: example
    14.     volumes:
    15.       - /c/Users/<ваша_папка>/:/var/docker/postgres_container
    16.     ports:
    17.       - 6777:8080
    18. volumes:
    19.   pg:
    Далее заходим в контейнер (docker exec -it postgres_container bash) и файлы, которые находятся в <ваша_папка> будут видны в docker контейнере по пути /var/docker/postgres_container.

    Но мне стало интересно. Если данные сохраняются, то где же они?
    Если сделать docker volumes pg inspect, то в Mountpoint можно увидеть вот этот путь: /mnt/sda1/var/lib/docker/volumes/pg/_data
    А знаете где он был? В VirtualBox.

    Вот так можно зайти в виртуальную машину (имя которой по умолчанию default):
    Код (Text):
    1. docker-machine ssh default
    Так как docker папка под определенным доступом, то надо получить права суперпользователя:
    Код (Text):
    1. sudo -i
    И теперь можно перейти к конкретной папке (в моем случае при запуске docker-compose up докер создал volume firsttry_pg, т.е. добавил впереди к volume-у название папки (firsttry - это имя папки в которой находится файл docker-compose.yml) ):
    Код (Text):
    1. cd /mnt/sda1/var/lib/docker/volumes/firsttry_pg/_data
    Оставлю это здесь. Вдруг кому-то поможет.