Система: Windows 10 Хочу чтобы mysql (которая в контейнере) использовала для хранения данных мою локальную папку. Ожидания: 1. Скачал докер 2. В консоли ввел Код (Text): $ docker run -it -e MYSQL_ROOT_PASSWORD=123123 --name mysql_container -v //c/Users/User/database:/var/lib/mysql mysql:5.6 3. Зашел в контейнер и создал базу данных Код (Text): $ docker exec -it mysql_container bash Код (Text): mysql -u root -p Код (Text): create database localdata; 4. Теперь останавливаю контейнер, удаляю его, и при создании нового контейнера хочу использовать старые данные из Код (Text): //c/Users/User/database Застрял на шаге 2. Выдается такая ошибка: Код (Text): 2018-11-20 08:35:06 33 [ERROR] InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation Если написать вместо Код (Text): //c/Users/User/database Код (Text): c:\Users\User\database , то синтаксическую ошибку выдает. Если верить документации и статьям в интернете, то все вообще должно быть easy: -v /path/on/host:/path/in/container <container_name> Может кто сталкивался с такой проблемой?
Ну во первых не мучай себя есть docker-compose. Во вторых относительные пути тестил? Интересно... Ну а в третих https://docs.docker.com/docker-for-windows/#shared-drives
1. Больше не буду мучить: Код (Text): version: "2" services: mysql-container: container_name: mysql-container restart: always image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=123123 volumes: - "$PWD:/etc/mysql/conf.d" - "$PWD/../localdata:/var/lib/mysql" ports: - 3306:3306 Не работает. Та же самая ошибка "File ./ib_logfile101: 'aio write' returned OS error 122." Затем добавил "$PWD:/etc/mysql/conf.d". $PWD - это текущая директория. В ней находится файл local.cnf: Код (Text): [mysqld] innodb_use_native_aio=0 Выдает ошибку: Код (Text): 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.
Ну я бы так делать не стал ты затираешь существующие конфиги Код (Text): local.cnf:/etc/mysql/conf.d/local.cnf --- Добавлено --- Дело не в этом но для этого есть Dockerfile Код (Text): FROM mysql:8 RUN chmod 777 ... плюс в compose есть command
Спасибо и на этом. Это было мое первое знакомство с Docker. Я понял, что использовать его не буду... --- P.S. ... по крайней мере под windows
Спустя долгое время и какой-то опыт мне удалось докопаться до истины за час. Так как я счастливый обладатель Windows 10 Home, то вынужден использовать legacy Docker ToolBox без возможности расшарить папки вне C:\Users Итак, что я сделал: 1. Создал volume Код (Text): docker volume create --name pg -d local 2. Изменил docker-compose.yml Код (Text): version: '3.1' services: db: container_name: postgres_container image: postgres build: #context: . #dockerfile: .Dockerfile restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: example volumes: - pg:/var/lib/postgresql/data/ ports: - 6777:8080 volumes: pg: 3. Всё, теперь при запуске контейнера (docker-compose up) и при остановки/удалении (docker-compose down) данные базы данных не теряются. Если сделать volume для данных postgres на кастомную папку, то выведется ошибка /var/lib/postgresql/data/ has wrong permissions Код (Text): environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: example volumes: - /c/Users/User/<ваша_пустая_папка_для_postgres_данных>/:/var/lib/postgresql/data/ Если хотим просто папку расшарить (которую postgres не использует), то делаем вот так: Код (Text): version: '3.1' services: db: container_name: postgres_container image: postgres build: #context: . #dockerfile: .Dockerfile restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: example volumes: - /c/Users/<ваша_папка>/:/var/docker/postgres_container ports: - 6777:8080 volumes: 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): docker-machine ssh default Так как docker папка под определенным доступом, то надо получить права суперпользователя: Код (Text): sudo -i И теперь можно перейти к конкретной папке (в моем случае при запуске docker-compose up докер создал volume firsttry_pg, т.е. добавил впереди к volume-у название папки (firsttry - это имя папки в которой находится файл docker-compose.yml) ): Код (Text): cd /mnt/sda1/var/lib/docker/volumes/firsttry_pg/_data Оставлю это здесь. Вдруг кому-то поможет.