2016-05-02 13 views
1

Versuchen, Dockerfile für Postgres db für meine App zu machen.Dockerfile mit Postgres konfigurieren

Dockerfile

FROM postgres:9.4 
RUN mkdir /sql 
COPY src/main/resources/sql_scripts/* /sql/ 
RUN psql -f /sql/create_user.sql 
RUN psql -U user -W 123 -f create_db.sql 
RUN psql -U user -W 123 -d school_ats -f create_tables.sql 

Lauf

docker build . 

Ergebnis:

Sending build context to Docker daemon 3.367 MB 
Step 1 : FROM postgres:9.4 
---> 6196bca94565 
Step 2 : RUN mkdir /sql 
---> Using cache 
---> 6f57c1e759b7 
Step 3 : COPY src/main/resources/sql_scripts/* /sql/ 
---> Using cache 
---> 3b496bfb28cd 
Step 4 : RUN psql -a -f /sql/create_user.sql 
---> Running in 33b2230a12fa 
psql: could not connect to server: No such file or directory 
    Is the server running locally and accepting 
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 
The command '/bin/sh -c psql -a -f /sql/create_user.sql' returned a non-zero code: 2 

Wie kann ich db in Docker für mein Projekt angeben?

+1

Die Basis dockerfile 'postgres: 9.4' nicht wirklich laufen Postgres, bis der Einstiegspunkt gestartet. Sie müssen den Container zuerst vom Basisbild aus starten. –

Antwort

3

Beim Erstellen Ihres Docker-Image wird Postgres nicht ausgeführt. Die Datenbank wird gestartet, wenn der Container gestartet wird. Danach können alle SQL-Dateien ausgeführt werden. Einfachste Lösung ist die SQL-Dateien in spezielles Verzeichnis zu setzen:

FROM postgres:9.4 
COPY *.sql /docker-entrypoint-initdb.d/ 

Beim Startskript Boote werden alle Dateien aus diesem Verzeichnis auszuführen. Sie können darüber in der Dokumentation lesen https://hub.docker.com/_/postgres/ in Abschnitt So erweitern Sie dieses Bild. Wenn Sie einen anderen Benutzer benötigen, sollten Sie auch die Umgebungsvariablen POSTGRES_USER und POSTGRES_PASSWORD setzen. Es ist einfacher, benutzerdefinierte Skripts zum Erstellen von Benutzern zu verwenden.

+0

Nach den neuesten Empfehlungen sollten wir lieber "COPY" als "ADD" verwenden. –

+0

Stimmt, habe das behoben :) – jazgot

1

Wie der Kommentar oben während der Erstellung des Images sagt, erhalten Sie keine laufende Instanz von Postgres.

Sie könnten etwas anderen Ansatz nehmen. Anstatt zu versuchen, SQL-Skripte selbst auszuführen, können Sie sie in das Verzeichnis /docker-entrypoint-initdb.d/ kopieren. Sie werden beim Start des Containers ausgeführt.

Werfen Sie einen Blick, wie Postgres: 9.4 Bild ist Baujahr:

Auch in Ihrer Dockerfile Variablen Datenbankdetails setzen:

  • POSTGRES_DB
  • POSTGRES_USER
  • POSTGRES_PASSWORD