2017-08-16 2 views
0

Ich muss MariaDB in vorhandenen Docker Container ausführen.Kann nicht MariaDB innerhalb Docker Container

Bau und Installation funktioniert gut, aber wenn Docker

führt
RUN mysql < init.sql 

DB-Schema I

Can't connect to MySQL server (111 Connection refused) 

jedoch erhalten zu laden, wenn ich den Behälter laufen und führen

docker exec -it silly_allen /bin/bash -c "mysql < init.sql" 

es funktioniert gut.

Was könnte das Problem sein?

Danke!

EDIT: Hier ist ein Teil der Dockerfile im Zusammenhang mit DB.

FROM centos:7 

WORKDIR /root 

... 
RUN echo "[mariadb]" >> /etc/yum.repos.d/MariaDB.repo 
RUN echo "name = MariaDB" >> /etc/yum.repos.d/MariaDB.repo 
RUN echo "baseurl = http://yum.mariadb.org/10.1/centos7-amd64" >> /etc/yum.repos.d/MariaDB.repo 
RUN echo "gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB" >> /etc/yum.repos.d/MariaDB.repo 
RUN echo "gpgcheck=1" >> /etc/yum.repos.d/MariaDB.repo 
RUN rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB 
RUN yum install -y MariaDB-server MariaDB-client 
RUN yum clean all 

RUN echo "[mysqld]" > /etc/my.cnf 
RUN echo "bind-address=0.0.0.0" >> /etc/my.cnf 

RUN /etc/init.d/mysql restart 

ADD init.sql /root 
RUN mysql < /root/init.sql 
... 
+0

Sie die volle docker-Datei zur Verfügung stellen kann? – yamenk

+0

es ist ziemlich groß. Ich kann nur die mit DB verbundenen Teile liefern. – LaBrie

Antwort

0

Von dem, was ich sehen kann, versuchen Sie, mysql < init.sql vor dem Starten der Datenbank auszuführen. Der Fehler zeigt, dass für diesen Befehl die Datenbank ausgeführt werden muss.

Um dieses Problem zu lösen, ist ein Startskript in Sie Container hinzufügen enthält:

mysqld 
mysql < init.sql 

Und Ihre Dockerfile CMD ändern, um dieses Skript aufrufen.

1

Gemäß den Best Practices von Docker sollten Sie einen Container pro Prozess haben, den Sie ausführen möchten.

Außerdem gibt es eine offizielle mariadb image, mit der Sie ein Verzeichnis als Volume bereitstellen können, das SQL-Dumps enthalten könnte. Diese Speicherabbilder werden automatisch importiert, wenn der Container erstellt wird. Dies könnte sich als nützlich erweisen.

Ich würde vorschlagen, anstatt eine sehr große dockerfile zu haben, können Sie es brechen in getrennten Dienste mit docker-compose

Wenn Sie jedoch dies die Art und Weise zu halten, wollen es ist, ich würde vorschlagen, dass Sie die ADD init.sql ... bewegen Teil an die Spitze, und verketten Sie den Server Start Teil und den Dump-Import, da jeder RUN Befehl eine separate Schicht mit Docker ist. Also würde man so etwas braucht, was in der Antwort dieser StackOverflow question beschrieben ist:

RUN /bin/bash -c "/usr/bin/mysqld_safe &" && \ 
    sleep 5 && \ 
    mysql -u root -e "CREATE DATABASE mydb" && \ 
    mysql -u root mydb < /root/init.sql 

so dass der Server initialisiert und die Dump wird in einer Schicht importiert

0

Auf diese Weise ist richtig:

# cat Dockerfile 
... 
ADD init.sql /tmp 
ADD initdb.sh /tmp 
RUN /tmp/initdb.bash 
CMD ["/usr/bin/mysqld_safe --datadir=/var/lib/mysql"] 

Und das Skript:

# cat dump/initdb.bash 
#!/bin/bash 

set -e 
set -x 

mysqld_safe --datadir='/var/lib/mysql' --user=root & 
until mysqladmin ping >/dev/null 2>&1; do 
    sleep 0.2 
done 

mysql -e 'create database init;' && \ 
mysql init < /tmp/init.sql && \ 
echo "Successfully imported" && exit 0 
Verwandte Themen