Как создать две базы данных 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;