Docker, база данных, скопированная на том, имеет размер 0 КБ - PullRequest
0 голосов
/ 27 мая 2020

Я создал образ docker, используя следующий файл Docker:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY . .
ENTRYPOINT ["dotnet", "RPDemo.dll"]

База данных проекта находится в этом месте ./database/db_demo.db

Docker образ создается без проблем:

docker build -t rpdemo-docker:1.0.0 .

Я хотел бы сохранить базу данных вне контейнера. Я указал установку тома с помощью этой команды:

docker run --name rpdemo-container -v /mnt/cache/dev/database:/app/database -p 8383:80 rpdemo-docker:1.0.0

Кажется, что папка внутри контейнера монтируется во внешнюю папку. База данных скопирована, но имеет размер 0 КБ.

Без флага -v приложение работает, а база данных находится внутри контейнера и ее можно использовать. База данных и другие файлы должны быть сохранены во внешней папке.

ОБНОВЛЕНИЕ: я снова создал контейнер с флагом -v. Папка / database была подключена к внешней папке / mnt / cache / dev / database, но папка / database внутри контейнера была пустой. Одна из страниц приложения извлекает данные из базы данных. Как только я щелкнул по этой странице, был создан файл db длиной 0 КБ. Строка подключения предполагает, что база данных будет расположена. Кажется, что -v / mnt / cache / dev / database: / app / database перезаписывает содержимое папок.

1 Ответ

0 голосов
/ 27 мая 2020

Как сказал Дэвид в комментарии, когда вы монтируете том, он заменяет текущий каталог на том.

Если ваш том новый, это будет пустой каталог.

Фактически, вы добавляете базу данных в образ, но при запуске контейнера вы заменяете каталог базы данных новым, и ваше приложение может создать файл базы данных, если он не существует. Вот почему вы нашли пустую базу данных sqlite.

Если вы хотите разместить свою базу данных внутри тома, у вас есть 2 варианта: - Скопировать вручную ее в свой том - Иметь сценарий инициализации, который копирует базу данных откуда-то в каталог вашей базы данных, если он не существует

Для второго варианта вы можете сделать это в сценарии точки входа, и у вас может быть каталог с другим именем для вашей базы данных, например /app/init-database, и сценарий проверит если /app/database/db_demo.db существует, если нет, сделайте cp /app/init-database/db_demo.db /app/database/db_demo.db

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