Как создать две базы данных postgres при запуске docker-compose?

Dockerfile:

FROM python:3.9
ENV PYTHONUNBUFFERED=1
RUN apt-get update && apt-get upgrade -y  \
&& apt-get install -y gcc gunicorn3 libcurl4-gnutls-dev librtmp-dev libnss3 libnss3-dev wget \
&& apt-get clean \
&& apt -f install -y

WORKDIR /App

COPY requirements.txt /App/
RUN pip install -r requirements.txt
COPY . /App/
>! RUN pip install django~=4.1.1

RUN mkdir -p /App/data/db/
RUN chown -R 1000:1000 /App/data/db/

EXPOSE 7000
EXPOSE 8001

`

У меня есть base-compose файл, который содержит изображение базы данных, вот содержимое файла:

version: '3.3'

networks:
  shared_network:
   driver: bridge

services:
  testdb:
    image: postgres:latest
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=develop_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "5432:5432"
    networks:
      - shared_network

volumes:
  postgres_data:

Вот мой файл docker-compose:

version: '3.3'

include:
  - ./base-compose.yml

services:
  test_develop:
    container_name: test_develop
    build: .
    command: python manage.py runserver 0.0.0.0:7000
    ports:
      - "7000:7000"
    env_file:
      - ./environments/.env.develop
    depends_on:
      - testdb
    networks:
      - shared_network
    links:
      - testdb

Вот мой файл docker-compose-prod.yml:

version: '3.3'

include:
  - ./base-compose.yml

services:
  test_production:
    container_name: test_production
    build: .
    command: python manage.py runserver 0.0.0.0:8001
    ports:
      - "8001:8001"
    env_file:
      - ./environments/.env.prod
    depends_on:
      - testdb
    networks:
      - shared_network
    links:
      - testdb

Когда я запускаю docker-compose up --build, он создает develop_db, но я хочу создать prod_db тоже.

Я пытаюсь создать две базы данных с именами develop_db и prod_db, когда docker-compose up --build.

Я использовал эти две команды для запуска обоих файлов docker-compose.

docker-compose -f docker-compose up --build
docker-compose -f docker-compose-prod.yml up --build

Вы можете управлять этим, как правило, с помощью переменных окружения.

Ключевым понятием здесь является то, что в Compose есть понятие проекта. Все в файле Compose связано с проектом, и имена объектов Docker по умолчанию, которые создает Compose, включают в себя имя проекта. Вы можете изменить имя проекта с помощью опции docker-compose -p или переменной окружения COMPOSE_PROJECT_NAME. Имя проекта по умолчанию соответствует имени текущего каталога, поэтому если вы хотите запустить две установки Compose из одного каталога, вам нужно задать имя проекта для одной или другой.

Примечание заключается в том, что ваши два файла Compose практически идентичны, за исключением имен контейнеров (которые Compose может назначить), номера внутреннего порта Docker (который не должен меняться), конкретного файла окружения и порта хоста. Вы можете сгладить это в один файл Compose, который будет работать в обоих окружениях с правильными настройками

version: '3.8'

services:
  db:
    image: postgres:latest
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=develop_db
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

 test:
    build: .
    ports:
      - "${HOST_PORT:-8000}:8000"
    env_file:
      - ./environments/.env.${COMPOSE_PROJECT_NAME}
    depends_on:
      - db

volumes:
  postgres_data:

Теперь вы можете бегать

COMPOSE_PROJECT_NAME=develop HOST_PORT=7000 docker-compose up -d --build
COMPOSE_PROJECT_NAME=prod HOST_PORT=8000 docker-compose up -d --build

Compose создаст отдельную копию этого стека для каждого COMPOSE_PROJECT_NAME: двух сетей (develop_default и prod_default), двух томов, двух контейнеров баз данных и двух контейнеров приложений. Эти две среды будут логически отделены друг от друга, даже если они работают на одной хост-системе.

Я просто создал init.sql файл и добавил его в docker-entrypoint-init.db, вот как я это сделал. Лучше создать папку psql и добавить в нее файл init.sql.

Удалите - POSTGRES_DB=develop_db из файла base-compose и измените его.

version: '3.3'

networks:
  shared_network:
   driver: bridge

services:
  testdb:
    image: postgres:latest
    volumes:
      - postgres_data:/var/lib/postgresql/data
      # add here 
      - ./psql/init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "5432:5432"
    networks:
      - shared_network

volumes:
  postgres_data:

Вот мой init.sql файл. Я только что создал DATABASE просто убедитесь, что вы создали DATABASE используя USER & PASSWORD.

-- Creation of DATABASE

CREATE DATABASE test_db;
CREATE DATABASE test_prod_db;

[enter image description here enter image description here enter image description here enter image description here

Вернуться на верх