Перемещенное окно настройки-compose.yml создает новую базу данных postgres

#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.