Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.

Einführung

Wenn es einen Befehl gibt, den Docker-Compose ausführen soll, um den Container zu starten, schreiben Sie ihn in command:. Der postgreSQL-Container des offiziellen Bildes startet jedoch nicht das wesentliche postgre (DB), wenn der Befehl auf diese Weise ausgeführt wird. Ich war wirklich begeistert und verbrachte ungefähr 2 Tage. (Ich würde mich freuen, wenn Sie mich in den Kommentaren wissen lassen könnten, ob es einen besseren Weg gibt oder ob dies funktioniert.)

ENTRY POINT und CMD-Trap

Bevor Sie zu Docker-Compose über Dockerfile gehen, denken Sie, dass Sie häufig ENTRY POINT und CMD in Dockerfile festlegen. Ich werde die Details von ENTRY POINT und CMD weglassen, aber auf den Punkt gebracht

1.ENTRY POINT wird immer ausgeführt, wenn der Container gestartet wird.
2.CMD ist ein Argument, wenn ENTRY POINT gesetzt ist
3.CMD kann als Befehl ausgeführt werden, wenn ENTRY POINT nicht festgelegt ist
4.CMD ist Docker-compose.Kann mit dem Befehl yml überschrieben werden

Hier ist der Ort. Es ist einfach für diejenigen, die es sagen, aber ich werde alles überprüfen. (Eigentlich schreibe ich einen Artikel, um zu überprüfen, ob mein Verständnis falsch ist.)

mkdir test
cd test
touch Dockerfile
touch docker-compose.yml

Erstellen Sie ein solches Testverzeichnis und bereiten Sie zwei Dateien vor: Dockerfile und docker-compose.yml. Beschreiben Sie, wie Sie einen Nginx-Container entsprechend erstellen.

#Unten finden Sie den Inhalt der Docker-Datei
FROM nginx
RUN apt update && apt install -y procps
ENTRYPOINT [ "ps"]

docker-compose.yml


version: '3'
services:
  nginx:
    build: .
    tty: true
$ docker-compose up
nginx_1  |   PID TTY          TIME CMD
nginx_1  |     1 pts/0    00:00:00 ps

Sie können sehen, dass das Ergebnis des Befehls ps folgendermaßen zurückgegeben wird. Lassen Sie uns CMD in der Docker-Datei einstellen.

#Unten finden Sie den Inhalt der Docker-Datei
FROM nginx
RUN apt update && apt install -y procps
ENTRYPOINT [ "ps"]
CMD ["ax"]

Da der vorherige Container geschlossen und die Docker-Datei aktualisiert wurde, wird auch das zuvor erstellte Nginx-Image gelöscht.

$ docker-compose down
$ docker rmi -f Bild-ID
$ docker-compose up
nginx_1  |   PID TTY      STAT   TIME COMMAND
nginx_1  |     1 pts/0    Rs+    0:00 ps ax

Dieses Mal können Sie sehen, dass der COMMAND-Teil zu ps ax wird und ax als Argument übergeben werden kann. Versuchen Sie als Nächstes, die CMD der Docker-Datei mit dem Befehl docker-compose.yml zu überschreiben.

docker-compose.yml


version: '3'
services:
  nginx:
    build: .
    tty: true
    command: r
$ docker-compose up
nginx_1  |   PID TTY      STAT   TIME COMMAND
nginx_1  |     1 pts/0    Rs+    0:00 ps r

Die Option könnte mit r überschrieben werden.

Schließlich, wenn nur CMD angegeben ist und es keinen ENTRY POIN gibt.

#Unten finden Sie den Inhalt der Docker-Datei
FROM nginx
RUN apt update && apt install -y procps
CMD ["ps"]
$ docker-compose up
nginx_1  |   PID TTY          TIME CMD
nginx_1  |     1 pts/0    00:00:00 ps

Nun, das ist wie erwartet. Wenn Sie nur CMD verwenden, können Sie es natürlich mit docker-compose.yml überschreiben. Sie können alle Bereiche mit dem Befehl inspect überprüfen, sodass Sie sofort sehen können, ob er überschrieben wurde oder ob ENTRY POINT festgelegt wurde.

Hauptthema

Die Einführung ist länger geworden, spiegelt sich aber im Hauptthema wider. Es gibt eine solche Dockerfile und docker-compose.yml.

#Unten finden Sie den Inhalt der Docker-Datei
FROM postgres
RUN apt update && apt install -y procps

docker-compose.yml


version: '3'
services:
  db:
    build: .
    tty: true
    environment:
      POSTGRES_PASSWORD: tekitou_koreiruyo
$ docker-compose up -d
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
0ca675fda6e3        test_db             "docker-entrypoint.s…"   29 seconds ago      Up 28 seconds       5432/tcp                 test_db_1

Es ist ein gutes Gefühl. Gehen Sie in den Container und überprüfen Sie mit dem Befehl ps, ob db ausgeführt wird.

# ps ax
PID TTY      STAT   TIME COMMAND
    1 pts/0    Ss+    0:00 postgres
   65 ?        Ss     0:00 postgres: checkpointer
   66 ?        Ss     0:00 postgres: background writer
   67 ?        Ss     0:00 postgres: walwriter
   68 ?        Ss     0:00 postgres: autovacuum launcher
   69 ?        Ss     0:00 postgres: stats collector
   70 ?        Ss     0:00 postgres: logical replication launcher
   81 pts/1    Ss     0:00 bash
   87 pts/1    R+     0:00 ps ax

Das ist gut Es wäre schön, SQL ausführen zu können, wenn der Container gestartet wird. Sie können Benutzer automatisch erstellen, Kennwörter hinzufügen und vieles mehr.

Führen Sie den folgenden Befehl im Container aus.

psql -U postgres --command='CREATE DATABASE test'
>>CREATE DATABASE

Sie können eine Verbindung zur Datenbank herstellen und SQL ausgeben, indem Sie Ihre bevorzugte SQL-Anweisung im Teil "--command" übergeben. Dann psql -U postgres --command = 'CREATE DATABASE test' Sie können dies mit CMD von Dockerfile oderBefehl:von docker-compose.yml übergeben, aber das allein funktioniert nicht. ..

Denn wenn Sie sich den Postgres-Container ansehen, den Sie zuvor mit inspect erstellt haben

{
    "Cmd": [
      "postgres"
    ],
    "Entrypoint": [
      "docker-entrypoint.sh"
    ],
}

Weil es eine solche Beschreibung gibt. (Der obige json lässt den Inhalt erheblich weg.) Mit anderen Worten, dies wird von Anfang an festgelegt, um das am Anfang erläuterte Argument (CMD) an ENTRYPOIN zu übergeben.

Selbst wenn Sie in diesem Zustand einfach zu "command:" in docker-compose.yml hinzufügen, wird dies nur als Argument von ENTRYPOINT erkannt und es tritt ein Fehler auf. Mit anderen Worten, standardmäßig wird der Befehl "docker-entrypoint.sh postgres" ausgeführt, wenn der Container ausgeführt wird. Also zusätzlich "psql -U postgres --command =" CREATE DATABASE test "" Wie kann ich diesen Befehl ausführen, wenn ich den Container ausführe? Platzieren Sie sh und sql in docker-entrypoint-initdb.d im Container. Sh und SQL, die in diesem Verzeichnis gespeichert sind, werden automatisch ausgeführt, wenn der Container gestartet wird.

In diesem Fall scheint es gut, den Teil "CREATE DATABASE test" als SQL-Datei direkt unter "docker-entrypoint-initdb.d" im Container abzulegen. Erstellen Sie "create_table.sql" im selben Verzeichnis wie Dockerfile und docker-compose.yml. Ändern Sie dann die Docker-Datei so, dass sie wie folgt aussieht.

FROM postgres
RUN apt update && apt install -y procps
COPY *.sql /docker-entrypoint-initdb.d/

Die SQL-Datei wird mit einem Platzhalter angegeben, diesmal jedoch mit "create_table.sql", sodass Sie den Dateinamen auch normal angeben können. Führen Sie nun docker-compose up -d aus

Geben Sie den Container "docker exec -it container ID bash" ein und geben Sie die Datenbank mit "psql -U postgres" ein.

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 test      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
(4 rows)

Sie können sehen, dass sich unten eine Datenbank mit dem Namen "test" befindet.

Jetzt können Sie Ihr Lieblings-SH oder SQL beim Start ausführen, auch wenn im offiziellen Image ENTRY POINT angegeben ist.

Zusammenfassung

Ich schrieb in command: psql -U postgres --command = 'CREATE DATABASE test' in docker-compose.yml und beklagte, dass es nicht funktioniert hat, aber es funktioniert nicht, weil ich es als Argument von ENTRYPOINT übergeben habe. .. Wenn Sie wissen, wie man in docker-compose.yml schreibt, lassen Sie es mich bitte in den Kommentaren wissen.

Recommended Posts

Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben
Ich möchte ein Komitee mit Rails vorstellen, ohne zu schmutzig zu werden
[Für Anfänger] Ich möchte mit einem Auswahlbefehl automatisch vorregistrierte Daten in das Eingabeformular eingeben.
Ich habe versucht, grafana und postgres [docker-compose] zu verknüpfen
Ich möchte Java8 für jeden mit Index verwenden
Ich möchte den Inhalt der Absicht var_dump
Ich möchte APP_HOME an Logback in Gradle übergeben
Übergeben Sie mit link_to zwei Argumente an den URI
Ich möchte mit Firestore von Rails spielen
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte einfache Fehler reduzieren. Sich selbst befehlen.
Ich möchte die Aggregationsverarbeitung mit Spring-Batch durchführen
[Rails] Ich möchte CSS mit Webpacker laden
Ich möchte den Wert in Ruby erhalten
[Eclipse] Ich möchte die Abschlussfunktion verwenden, aber ich möchte es schaffen, den Abschluss mit einem Leerzeichen zu bestätigen
Ich wollte einen AP-Server starten und nur mit dem Befehl Maven debuggen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte eine TraceId in das Protokoll einbetten
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich möchte den Bereich anhand des monatlichen Abschlusses beurteilen
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte Benutzer mit Devise + OmniAuth bei Rails authentifizieren
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Ich möchte die Hauptmethode mit Reflektion aufrufen
[Grober Kommentar] Ich möchte die Zupfmethode heiraten
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich möchte die Protokollausgabe unter Android vereinfachen
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Ich möchte den Pfad nach der neuen Registrierung ändern, nachdem ich mich mit mehreren Geräten angemeldet habe.
Ich möchte die API mit Rails auf mehreren lokal eingerichteten Docker-Composes treffen
Warum kann ich den mit gem installierten Befehl Rails verwenden? ??
[Anfänger] Ich möchte die Migrationsdatei ändern.
Die Geschichte, die zur Lösung des Fehlers führte, weil postgres nicht mit Docker-Compose begann
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Ich möchte Zeichen konvertieren ...
(´-`) .. oO (Ich möchte die Standardausgabe" Hallo "leicht finden.
Nachdem ich einen Artikel mit Rails Simple Calendar veröffentlicht habe, möchte ich ihn im Kalender wiedergeben.
Ich möchte eine mit Rails 6 erstellte App an GitHub senden
Ich möchte Java Applet einfach in der Befehlszeile verwenden, ohne IDE zu verwenden
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte eine Funktion mit Kotlin und Java erstellen!