Ich habe den Ansatz docker-entrypoint-initdb.d verwendet (Dank an @Kuhess). In meinem Fall möchte ich meine Datenbank jedoch anhand einiger Parameter erstellen, die ich in der ENV-Datei definiert habe
1) Zuerst definiere ich eine solche ENV-Datei in meinem Docker-Stammprojektverzeichnis
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) Dann definiere ich meine Datei docker-compose.yml. Also habe ich die args-Direktive verwendet, um meine Umgebungsvariablen zu definieren, und sie aus der ENV-Datei festgelegt
version: '2'
services:
### MySQL Container
mysql:
build:
context: ./mysql
args:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
ports:
- "${MYSQL_PORT}:3306"
3) Dann definiere ich einen MySQL-Ordner, der eine Docker-Datei enthält. Das Dockerfile ist das also
FROM mysql:5.7
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
4) Jetzt benutze ich mysqldump, um meine Datenbank zu sichern und die Datei data.sql in den Ordner mysql zu legen
mysqldump -h <server name> -u<user> -p <db name> > data.sql
Die Datei ist nur eine normale SQL-Dump-Datei, aber ich füge am Anfang 2 Zeilen hinzu, damit die Datei so aussieht
--
-- Create a database using `MYSQL_DATABASE` placeholder
--
CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;
-- Rest of queries
DROP TABLE IF EXISTS `x`;
CREATE TABLE `x` (..)
LOCK TABLES `x` WRITE;
INSERT INTO `x` VALUES ...;
...
...
...
Was also passiert ist, dass ich den Befehl "RUN sed -i / MYSQL_DATABASE / '$ MYSQL_DATABASE' / g '/etc/mysql/data.sql" verwendet habe, um den MYSQL_DATABASE
Platzhalter durch den Namen meiner Datenbank zu ersetzen, in der ich ihn festgelegt habe .env Datei.
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
Jetzt können Sie Ihren Container erstellen und ausführen
RUN
Befehl in einem anderen Container ausgeführt wird. Es ist hier gut erklärt: stackoverflow.com/questions/17891669/…