#postgresql #docker #docker-compose
Вопрос:
Я настроил базу данных Postgres в docker на ubuntu с помощью docker-compose.yml только для этой базы данных в папке ~/postgres
, и я бы запустил docker-compose up -d
, чтобы запустить свою базу данных из ~/postgres
папки.
Вот мой docker-compose.yml
:
version: '3'
services:
database:
image: "postgres"
ports:
- "0.0.0.0:5432:5432"
env_file:
- database.env
volumes:
- database-data:/var/lib/postgresql/data/
volumes:
database-data:
Эта база данных настроена и работает идеально, поэтому я решил также настроить свое веб-приложение, и, поскольку docker-compose.yml
файл находился внутри этой папки, я переместил его наружу ~/
, чтобы я мог использовать его и для своего веб-приложения.
Вот как docker-compose.yml
~/
выглядит вход:
version: "3"
services:
database:
image: "postgres"
ports:
- "0.0.0.0:5432:5432"
env_file:
- postgres/database.env
volumes:
- database-data:/var/lib/postgresql/data/
webapp:
image: webapp/site
build:
context: ./retro-search-engine
dockerfile: Dockerfile
args:
buildno: 1
links:
- "database:db"
ports:
- "0.0.0.0:8000:80"
volumes:
- webapp:/var/www
environment:
db_host: db
db_username: xxxx
db_password: xxxx
db_database: xxxx
db_port: 5432
volumes:
database-data:
webapp:
Как вы можете видеть, конфигурация docker базы данных в основном та же, единственное, что меняется, — это путь к database.env
файлу, поскольку он все еще находится в предыдущей папке.
Итак, проблема здесь в том , что когда я запускаюсь docker-compose up -d
~/
, все начинается нормально, но когда я получаю доступ к базе данных, все мои таблицы исчезают.
Если я вернусь ~/postgres
и сделаю docker-compose up -d
это в этой папке (с предыдущей docker-compose.yml
) и подключусь к базе данных, я смогу получить доступ к своим таблицам.
Поэтому я думаю, что происходит то, что он либо создает новый контейнер, либо каким-то образом папка, в которой хранятся данные, связана с docker-compose.yml
файлом, и он создает новую базу данных, потому что не может найти старые файлы.
Я понятия не имею, как решить эту проблему, я погуглил и ничего не смог найти, поэтому решил спросить здесь, прежде чем я сброшу всю свою базу данных и восстановлю ее в новый контейнер, чего я не хочу делать, потому что это база данных объемом 16 ГБ, и это займет вечность.
У кого-нибудь есть идеи, как я могу использовать свой новый docker-compose.yml с данными из моей базы данных?
Заранее спасибо.
Ответ №1:
Первый:
- Заменить :
postgres/database.env
на./postgres/database.env
- Использование
docker compose up --build
: он восстановит изображение (полезно, если вы внесли некоторые изменения в свой файл dockerfile). старайтесь избегать использования-d при разработке, вы избежите работы с тоннами контейнеров.
Второй:
Я предлагаю вам следовать следующей рекомендации, это решит вашу проблему и будет чище, если вы хотите использовать конвейерный CI/CD и создавать более «автономный» образ и контейнер по требованию.
rootfolder
|-docker-compose.yaml
|-postgres/
| |--All_other_files_for_the_postgres_docker_image
|-webapp/
|-- Dockerfile
|-- All_other_files_for_the_webapp_docker_image
ниже вы найдете мою «поправку». :
version: "3"
services:
database:
image: "postgres"
container_name: "my_postgres_container"
ports:
- "0.0.0.0:5432:5432"
env_file:
- ./postgres/database.env
volumes:
- database-data:/var/lib/postgresql/data/
webapp:
image: webapp/site
container_name: "my_webapp_container"
build:
context: ./retro-search-engine
dockerfile: Dockerfile
links:
- "database:db"
ports:
- "0.0.0.0:8000:80"
volumes:
- webapp:/var/www
environment:
db_host: db
db_username: xxxx
db_password: xxxx
db_database: xxxx
db_port: 5432
volumes:
database-data:
webapp:
Если вы хотите использовать существующее изображение postgres, которое уже присутствует (чтобы увидеть, существует ли уже изображение, вы можете сделать : docker image | grep postgres
)
затем вы можете сделать это непосредственно в своем докере-составить : изображение: «<имя_имя_имя>»
Комментарии:
1. база данных-данные-это том, между томами и монтированием есть разница. В большинстве случаев тома лучше, чем монтирование для баз данных. Кроме того, что я собирался предложить заменить postgres/database.env на ./postgres/database.env, как вы предложили, вы опередили меня :). Исправьте свой ответ, и я проголосую за
2. делаю это ! тх, сэр
3. Также файл создания
4. Спасибо, что прочитали дважды за меня 🙂
5. Извините, это не сработало, я получаю эту ошибку при запуске
docker-compose up --build
: Ошибка построения базы данных: нет этапа сборки в текущем контексте У меня пустой файл dockerfile в каталоге postgres, потому что я использую необработанное изображение postgres.