Ich habe versucht, einen Container für eine Postgres-Entwicklungsinstanz einzurichten, indem ich einen benutzerdefinierten Benutzer und eine benutzerdefinierte Datenbank erstellt habe. Ich verwende das offizielle Postgres-Docker-Bild . In der Dokumentation werden Sie angewiesen, ein Bash-Skript in den /docker-entrypoint-initdb.d/
Ordner einzufügen , um die Datenbank mit benutzerdefinierten Parametern einzurichten.
Mein Bash-Skript: make_db.sh
su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"
Dockerfile
FROM library/postgres
RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/
Der Fehler, den ich von docker logs -f db
(db ist mein Containername) bekomme, ist:
createuser: konnte keine Verbindung zur Datenbank herstellen postgres: konnte keine Verbindung zum Server herstellen: Keine solche Datei oder kein solches Verzeichnis
Es scheint, dass die Befehle im /docker-entrypoint-initdb.d/
Ordner ausgeführt werden, bevor postgres gestartet wird. Meine Frage ist, wie ich einen Benutzer / eine Datenbank programmgesteuert mit dem offiziellen Postgres-Container einrichte. Gibt es eine Möglichkeit, dies mit einem Skript zu tun?
quelle
gosu postgres postgres --single < /tmp/somefile.sql
psql -U myDb -d myDb -f myDb.sql
docker-entrypoint-initdb.d
sehe ich meineinit.sql
mit dem SQL-Code darin. ABER wenn ich MySQL öffne (mit Root-Zugriff) und show database einfüge, sehe ich nur die Standardeinstellung in derdocker-compose.yml
Datei! Warum funktioniert es bei mir nicht?db.sql
selbst nachdem es in `docker-entrypoint-initdb.d` kopiert wurdeSie können jetzt SQL-Dateien im Init-Verzeichnis ablegen:
Aus den Dokumenten
Das Kopieren Ihrer .sql-Datei in funktioniert also.
quelle
Mit
docker-compose
:Angenommen, Sie haben folgendes Verzeichnislayout:
Datei:
docker-compose.yml
Datei:
Docker/init.sql
Datei:
Docker/db.Dockerfile
Dienste komponieren und starten:
quelle
Ich füge einer Umgebung, die nach dem Starten von Diensten in einer CMD aufgerufen wird, benutzerdefinierte Befehle hinzu. Ich habe dies nicht mit postgres, sondern mit Oracle getan:
und beginnen mit
.
quelle
Sie können diese Befehle verwenden:
quelle
ENCODING 'LATIN1'
ist sehr seltsam ... Sie müssen ganz besondere Bedürfnisse haben, um die Verwendung von utf8 zu vermeidenSie müssen die Datenbank ausführen, bevor Sie die Benutzer erstellen. Dafür benötigen Sie mehrere Prozesse. Sie können Postgres entweder in einer Subshell (&) im Shell-Skript starten oder ein Tool wie Supervisord verwenden, um Postgres auszuführen und anschließend Initialisierungsskripte auszuführen.
Eine Anleitung zu Supervisord und Docker https://docs.docker.com/articles/using_supervisord/
quelle
Mit Docker Compose gibt es eine einfache Alternative (es ist nicht erforderlich, eine Docker-Datei zu erstellen). Erstellen Sie einfach eine init-database.sh:
Und verweisen Sie darauf im Abschnitt Bände:
quelle