x86bit-destroyer
x86bit-destroyer

Reputation: 15

Load SQL Create DB file to Docker

I am having trouble to load in my SQL File to create the schema and the associated tables, I have also tried to use the 'volumes' option in the compose file to copy the sql file into the 'docker-entrypoint-initdb.d' directory but that fails to so anything.


Table + Schema: https://pastebin.com/RTBBGZhn

MySQL Dump: https://pastebin.com/6ApQwt1F


Docker Compose File

version: '2'

services:
  melissabot:
    image: melissabot
    build: .
    ports:
      - 7000:7000
      - 7070:7070
    depends_on:
      - mysqlMelissa
    links:
      - mysqlMelissa:db

  mysqlMelissa:
    image: mysql
    build: ${PWD}/Docker/DB/
    environment:
      - MYSQL_ROOT_PASSWORD=root
      # - MYSQL_DATABASE=MelissaBot
    ports:
      - "3306:3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    restart: always
    ports:
     - 8080:80
    volumes:
     - /sessions
    links:
      - mysqlMelissa:db

Dockerfile

FROM mysql:5.6
ENV MYSQL_ROOT_PASSWORD=root
# ENV MYSQL_DATABASE=MelissaBot
COPY setup.sh /mysql/setup.sh
COPY dump.sql /mysql/Melissa.sql
RUN chmod +x /mysql/setup.sh
RUN /mysql/setup.sh

setup.sh

#!/bin/bash
set -e
service mysql start
mysql -u root MelissaBot < /mysql/Melissa.sql
service mysql stop

Upvotes: 0

Views: 2202

Answers (1)

Tarun Lalwani
Tarun Lalwani

Reputation: 146510

You are doing it wrongly. There is no init system inside docker. So you should not be using server start/stop inside a container. Look at the official image documentation always

https://hub.docker.com/_/mysql

Initializing a fresh instance When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.

So you can either copy your default dump files to /docker-entrypoint-initdb.d or mount them using a volume mount when running the container. So you chuck your setup.sh and change your Dockerfile to something like below

FROM mysql:5.6
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=MelissaBot
COPY dump.sql /docker-entrypoint-initdb.d/

But I would rather prefer the approach of volume mounting it inside my compose file

  mysqlMelissa:
    image: mysql:5.6
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=MelissaBot
    ports:
      - "3306:3306"
    volumes:
      - dump.sql:/docker-entrypoint-initdb.d/dump.sql

Upvotes: 3

Related Questions