在一个容器中使用Docker compose管理多个数据库

5

我想创建 Docker 容器并将 3 个数据库导入其中。我已尝试使用以下代码:

version: '3.3'
services:
  web:
    build:
      context: ./php56
      dockerfile: Dockerfile
    container_name: php56
    depends_on:
      - db
    volumes:
      - ../www:/var/www/html/
    ports:
      - 8000:80
  db:
    container_name: mysql
    image: mysql:5.7.21
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dkum
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    entrypoint:
      sh -c "
        echo 'CREATE DATABASE IF NOT EXISTS dkum_joomla; CREATE DATABASE IF NOT EXISTS dkum_test;' > /docker-entrypoint-initdb.d/init.sql;
        /usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
      "
    volumes:
      - ../sql/baze/dkum.sql:/docker-entrypoint-initdb.d/dkum.sql
      - ../sql/baze/dkum_joomla.sql:/docker-entrypoint-initdb.d/dkum_joomla.sql
      - ../sql/baze/dkum_test.sql:/docker-entrypoint-initdb.d/dkum_test.sql
    ports:
      - 6033:3306

这段代码只会创建一个名为dkum的数据库,并从dkum.sql卷中导入数据。如果我删除dkum_joomla.sql和dkum_test.sql卷,那么它将创建三个数据库(dkum,dkum_joomla和dkum_test),只有dkum数据库填充有数据。
以下是我的SQL文件。稍后我将扩展它们。

dkum.sql

CREATE TABLE dkum_table (
    DkumID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

dkum_joomla.sql

CREATE TABLE dkum_joomla_table (
    DkumJoomlaID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

dkum_test.sql

CREATE TABLE dkum_test_table (
    DkumTestID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

似乎dkum_joomla.sql文件中存在问题(例如语法错误)。 - Henry
我检查了文件,一切正常。 - kac26
请注意,转储将按顺序进行,因此请确保没有任何依赖关系。 - Adiii
在转储文件中没有任何依赖项。这是非常简单的SQL代码,目前在每个数据库中生成一个独立的表格。我以后会扩展这些数据库。 - kac26
看一下这个链接,我不知道它是否有帮助?https://github.com/abagayev/docker-bootstrap-collection/tree/master/mysql-few-databases - Intellidroid
请将来自数据库容器的日志添加进去。 - LinPy
1个回答

6

不要在docker-compose文件中创建额外的数据库,而是直接在SQL文件中创建它们:

version: '3.3'
services:
  web:
    build:
      context: ./php56
      dockerfile: Dockerfile
    container_name: php56
    depends_on:
      - db
    volumes:
      - ../www:/var/www/html/
    ports:
      - 8000:80
  db:
    container_name: mysql
    image: mysql:5.7.21
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dkum
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    volumes:
      - ../sql/baze/dkum.sql:/docker-entrypoint-initdb.d/dkum.sql
      - ../sql/baze/dkum_joomla.sql:/docker-entrypoint-initdb.d/dkum_joomla.sql
      - ../sql/baze/dkum_test.sql:/docker-entrypoint-initdb.d/dkum_test.sql
    ports:
      - 6033:3306

dkum.sql

CREATE TABLE dkum_table (
    DkumID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

dkum_joomla.sql

CREATE DATABASE IF NOT EXISTS dkum_joomla;
USE dkum_joomla;

CREATE TABLE dkum_joomla_table (
    DkumJoomlaID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

dkum_test.sql

CREATE DATABASE IF NOT EXISTS dkum_test;
USE dkum_test;

CREATE TABLE dkum_test_table (
    DkumTestID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接