Образ Docker, предоставленный компанией Yugabyte для YugabyteDB, не создает и не запускает базу данных, поскольку ее можно использовать для разных целей: запустить один yb-master
или yb-tserver
, или оба с помощью yugabyted
. Рабочая база данных состоит из нескольких узлов. Однако для разработки или автоматизированного тестирования достаточно запустить один контейнер с определенной базой данных, пользователем и паролем.
YugabyteDB совместима с PostgreSQL, что означает, что вы можете заменить PostgreSQL на YugabyteDB без изменения приложения. Образ PostgreSQL позволяет создать базу данных и задать пользователя и пароль с помощью следующих переменных окружения: POSTGRES_USER POSTGRES_PASSWORD POSTGRES_DB, и вы, вероятно, хотите того же для YugabyteDB. И, почему бы и нет, с теми же переменными окружения.
Вот пример, основанный на тестовом наборе knex.js https://github.com/knex/knex/blob/master/scripts/docker-compose.yml.
Этот docker-compose.yml
запускает PostgreSQL с базой данных с именем knex_test
и пользователем/паролем testuser
/knextest
и запускает другой контейнер для проверки, когда это соединение доступно.
Вот как я добавляю YugabyteDB таким же образом:
version: '3'
services:
yugabytedb:
image: docker.io/yugabytedb/yugabyte:latest
command: |
bash -c "
# create database and user as soon as database is up
until [ -z "POSTGRES_USER" ] || PGPASSWORD=yugabyte bin/ysqlsh -v ON_ERROR_STOP=1 \
-c "create database $${POSTGRES_DB:-$${POSTGRES_USER}} " \
-c "create user $${POSTGRES_USER} password '$${POSTGRES_PASSWORD}' " \
2>/dev/null
do
echo "Waiting for YugabyteDB to be up for creating user $${POSTGRES_USER}." ; sleep 5
done &
# start YugabyteDB
bin/yugabyted start --daemon=false --tserver_flags='ysql_enable_auth=true'
"
environment:
- POSTGRES_USER=testuser
- POSTGRES_PASSWORD=knextest
- POSTGRES_DB=knex_test
ports:
- 25433:5433
- 27000:7000
waityugabyte:
image: postgres:13-alpine
links:
- yugabytedb
depends_on:
- yugabytedb
entrypoint:
- bash
- -c
- 'until PGPASSWORD=knextest /usr/local/bin/psql postgres://testuser@yugabytedb:5433/knex_test -c "SELECT 1"; do sleep 5; done'
База данных YugabyteDB запускается командой bin/yugabyted start --daemon=false --tserver_flags='ysql_enable_auth=true'
и фоновый цикл пытается подключиться для создания базы данных и пользователя в соответствии с переменными окружения.
Порт по умолчанию для YugabyteBD – 5433, что позволяет запускать его вместе с PostgreSQL на его порту по умолчанию. Порт 7000 – это графическая консоль.
Если вам нужен более сложный docker-compose.yaml с полным контролем над топологией кластера yb-master/yb-tserver, вот как я создаю его для своих лабораторий: https://github.com/FranckPachot/ybdemo/tree/main/docker/yb-lab.
Обновление от июня 2022 года
Следующая команда, вероятно, лучше, используя --initial_scripts_dir
:
command: |
bash -c '
mkdir -p /var/ybinit
echo "create database $${POSTGRES_DB:-$${POSTGRES_USER}} " > /var/ybinit/01-db.sql
echo "create user $${POSTGRES_USER} password '$${POSTGRES_PASSWORD}' " > /var/ybinit/02-usr.sql
# start YugabyteDB
bin/yugabyted start --daemon=false --initial_scripts_dir=/var/ybinit --tserver_flags=ysql_enable_auth=true
'
и еще один пример с докер-композитом Nakama, если waityugabyte
для вас не работает: https://dev.to/yugabyte/nakama-with-yugabytedb-1i5o