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.)
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.
command: r
auch in docker-compose.yml.#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.
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.
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