2016-08-01 9 views
3

Ich lerne docker in diesen Tagen, und beginnt mit dem Erstellen von mysql-Bild von mir.Wie führe ich das Init-Skript nur einmal nach dem Andocken aus, aber vor dem Einsprungpunkt?

Dockerfile:

FROM centos 
MAINTAINER Michael 
ENV REFRESHED_AT 2016-07-29 
RUN yum install -y mysql mariadb-server 
VOLUME /var/lib/mysql 
ENTRYPOINT ["/usr/libexec/mysqld", "--user=root"] 
EXPOSE 3306 

Docker Fahrbefehl

docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql 

Dies gab einen Fehler, da ich exec müssen mysql_install_db erste DB init. Aber ich konnte RUN mysql_install_db in der Dockerfile nicht hinzufügen, da ich Volume als externen Datenspeicher verwenden möchte.

Also wie soll ich das tun?

Ich weiß, es gibt ein offizielles Bild mit dem Namen mysql. Ich möchte das nur als Übung machen.


UPDATE: Dank @Pieter. Ich habe schließlich diese durch seine Lösung verwendet, die bieten eine weitere entrypoint.sh kombiniert & Init-Skripte starten dann machen es so ENTRYPOINT in Dockerfile:

FROM centos 
MAINTAINER Michael 
ENV REFRESHED_AT 2016-07-29 
RUN yum install -y mysql mariadb-server 
VOLUME /var/lib/mysql 
COPY entrypoint.sh /usr/local/bin/ 
ENTRYPOINT ["entrypoint.sh"] 
EXPOSE 3306 

entrypoint.sh

#!/bin/bash 

if [ ! -d "/var/lib/mysql/mysql" ]; then #check whether the DB is initialized. 
    echo 'Initializing database' 
    mysql_install_db 
    echo 'Database initialized' 
fi 

/usr/libexec/mysqld --user=root 

Docker Lauf

docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql 

Und das gibt eine generische Lösung für ein solches Szenario.

Antwort

3

Ich bin kein Experte, aber für alles, was ich weiß, gibt es keine Möglichkeit, ein Skript vor ENTRYPOINT als ENTRYPOINT auszuführen, ist buchstäblich das erste, was Ihr Container ausführt.

Sie können Ihrem Andock-Container ein benutzerdefiniertes Skript hinzufügen, das sowohl die Anweisungen mysql_install_db als auch mysqld enthält und diese als Einstiegspunkt verwenden.

So könnte Ihre Dockerfile so aussehen.

FROM centos 
MAINTAINER Michael 
ENV REFRESHED_AT 2016-07-29 
RUN yum install -y mysql mariadb-server 
VOLUME /var/lib/mysql 
COPY start.sh/
ENTRYPOINT ["/entrypoint.sh"] 
EXPOSE 3306 

entrepoint.sh würde einfach so aussehen.

Beachten Sie, dass die gleiche Technik auch in der offiziellen Mariadb Docker Bild verwendet wird. Siehe https://github.com/docker-library/mariadb/tree/d969a465ee48fe10f4b532276f7337ddaaf3fc36/10.1

Beachten Sie, dass das offizielle Bild ENTRYPOINT mit CMD kombiniert. Wenn Sie Docker lernen, sollten Sie sich vielleicht einen Blick auf https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/ werfen, um mehr darüber zu erfahren, wie ENTRYPOINT und CMD zusammen verwendet werden können.

UPDATE dass mysql_install_db nur einige Dateien unter/var/lib/mysql Sie sollten in der Lage zu laufen mysql_install_db als Teil Ihrer Docker Build erstellt Unter der Annahme. (Das bedeutet nicht, dass Sie das tun sollten -> siehe offizielles Mariadb-Bild).

Der Befehl docker run initialisiert ein neu erstelltes Volume mit allen Daten, die an der angegebenen Position im Basisimage vorhanden sind.Siehe https://docs.docker.com/engine/reference/builder/#/volume

+0

Danke! du hast meinen Tag gerettet. – Michael

Verwandte Themen