Я использую Docker на компьютере с Windows 10. Я пытаюсь запустить докеризованную базу данных postgresql, данные которой можно смонтировать на моем компьютере с Windows 10. Затем я хочу иметь возможность отправлять данные этой базы данных в репозиторий GitLab. Если после этого какой-либо другой пользователь захочет использовать новейшую версию базы данных, ему просто нужно получить изменения, а затем смонтировать данные в докеризованном postgresql.
Почему я хочу это сделать?
Мы, будет много изменений в этой базе данных. Люди также одновременно работают над разными версиями нашей программы. С постоянной базой данных мне нужно было бы управлять разными версиями базы данных для каждой отдельной функциональной ветки, ветки разработки и основной/выпускной ветки. Это слишком много, чтобы справиться. Таким образом, в идеале любые изменения, внесенные в базу данных для конкретной функциональной ветки, можно найти только в этой конкретной функциональной ветке. Не было бы конфликтов. Это также позволяет экспериментировать с базой данных, не разрушая ее для любого другого пользователя.
Ну а в чем тогда проблема?
Docker для Windows поставляется с ограничениями, см.: https://github.com/docker/for-win/issues/445
Вкратце: сейчас невозможно монтировать тома из контейнеров Windows в контейнеры Linux. Для этого есть обходные пути, как сказано в ссылке, но не для того, чтобы получать эти данные из базы данных, активно отправлять/распространять их и т. д., а просто для того, чтобы база данных была постоянной в локальной системе.
Ну, я попробовал почти все, что пришло мне в голову:
Делал ли docker-compose, использовал именованные тома, и я также пытался использовать
/c/this/is/my/windows/path:this/is/my/linux/path
вместо
C:\this\is\my\windows\path:this/is/my/linux/path
но и это не помогло.
Я также использовал, как было сказано ранее, именованные тома в файле docker-compose:
version: '3'
services:
postgres:
image: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgress
- POSTGRES_DB=lol
ports:
- "5432:5432"
volumes:
- data:/var/lib/postgresql/data
volumes:
data: {}
Но угадайте, что: это все еще не удалось.
Я знаю, что могу создать дамп своей базы данных и отправить его, но проблема здесь в том, что я не хочу делать это вручную все время. Я бы предпочел плавное решение, без создания и загрузки дампа каждый раз. Я просто хочу запустить файл docker-compose, который монтирует данные базы данных, и все: очень простое и приятное решение.
Да, это тоже пришло мне в голову. Но я применил гораздо более простой обходной путь: я использую sqlcipher (зашифрованный sqlite3) в качестве файловой базы данных. Таким образом, мне не нужно создавать экземпляр докера базы данных на основе SQL. Это не настоящее решение, но в моем случае это мне очень помогло. Но есть еще один способ сделать это: в вашем dockerfile установите функциональность git. Создайте скрипт в этом dockerfile, который позволит вам извлекать файлы из определенных репозиториев. Теперь просто скопируйте файлы в папку /var/lib/postgresql/data. Также не забудьте переключиться на контейнеры Linux!
Я могу упустить вашу мысль, но что, если вы запустите свой контейнер, например: docker run --name postgres -e POSTGRES_PASSWORD=postgres -d -v "D:\postgres:/postgresdata" -e PGDATA=/postgresdata postgres. Конечным результатом будет то, что ваш контейнер сохраняет информацию базы данных в папку Windows. Я ничего не тестировал с git, но я предполагаю, что это должно работать.
В дополнение к моему предыдущему комментарию: сначала вам нужно создать том вместо размещенного тома: docker volume create --name postgres-data -d local, а затем использовать этот том при запуске докера: docker run --name postgres -e POSTGRES_PASSWORD=postgres -d -v postgres-data:/postgresdata -e PGDATA=/postgresdata postgres.





Я в одной лодке с тобой. Одним из моих обходных путей является копирование данных во время создания образа докера и/или использование docker cp для копирования всего из контейнера на мой хост Windows.