Solución:
Varias bases de datos en un solo contenedor de Docker
Las respuestas en otras partes de esta página configuran un contenedor dedicado para cada base de datos, pero un solo servidor MySQL es capaz de albergar múltiples bases de datos. Si debería hacerlo es una pregunta diferente, pero si desea varias bases de datos en un solo contenedor, aquí tiene un ejemplo.
docker-compose.yml:
version: '3'
volumes:
db:
driver: local
services:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./docker/provision/mysql/init:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: local
docker / provision / mysql / init / 01 -bases.sql:
# create databases
CREATE DATABASE IF NOT EXISTS `primary`;
CREATE DATABASE IF NOT EXISTS `secondary`;
# create root user and grant rights
CREATE USER 'root'@'localhost' IDENTIFIED BY 'local';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
¿Como funciona esto?
Esto funciona porque el proyecto MySQL Docker tiene un script de punto de entrada que se ejecutará a través de todos los archivos en el /docker-entrypoint-initdb.d
carpeta, si existe. Esto es útil para configurar bases de datos e inicializar su esquema y datos. En docker-compose, estamos usando volumes
para asignar esa carpeta virtual a una carpeta en el sistema host.
Está intentando vincular ambos contenedores de la base de datos al mismo puerto: 3306
. Lo que es esencialmente imposible. Necesita cambiar la asignación de puertos para una de las bases de datos, por ejemplo mysql
mantiene 3306:3306
, y mysql2
debería usar 3307:3306
.
Solo como una actualización para cualquier otra persona que pueda investigar esto.
Resolví esto eliminando:
MYSQL_DATABASE: dbname
de docker-compose.yml y agregar las declaraciones de creación de base de datos relevantes directamente al archivo sql que se pasa a docker-entrypoint-initdb.d.
En esa etapa, los comandos sql se realizan en root, por lo que también deberá agregar una declaración para otorgar permisos relevantes al usuario de la base de datos que desea usar.