Si vous souhaitez que docker-compose exécute une commande pour démarrer le conteneur, écrivez-la dans command:
.
Cependant, le conteneur postgreSQL de l'image officielle ne démarre pas le postgre essentiel (DB) lors de l'exécution de la commande de cette manière.
J'étais vraiment dedans et j'ai passé environ 2 jours.
(Je vous serais reconnaissant si vous pouviez me faire savoir dans les commentaires s'il existe une meilleure façon ou si cela fonctionne.)
Avant de passer à docker-compose, à propos de dockerfile, je pense que vous définissez souvent ENTRY POINT et CMD dans dockerfile. Je vais omettre les détails de ENTRY POINT et CMD, mais en un mot
1.ENTRY POINT est toujours exécuté au démarrage du conteneur.
2.CMD est un argument si le POINT D'ENTREE est défini
3.CMD peut être exécuté comme une commande si le POINT D'ENTREE n'est pas défini
4.CMD est docker-compose.Peut être écrasé avec la commande yml
C'est l'endroit. C'est facile pour ceux qui le disent, mais je vais tout vérifier. (En fait, j'écris un article pour vérifier si ma compréhension est fausse.)
mkdir test
cd test
touch Dockerfile
touch docker-compose.yml
Créez un répertoire de test comme celui-ci et préparez deux fichiers, Dockerfile et docker-compose.yml. Décrivez comment créer un conteneur nginx de manière appropriée.
#Ci-dessous le contenu du Dockerfile
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
Vous pouvez voir que le résultat de la commande ps est renvoyé comme ceci. Définissons CMD dans le Dockerfile.
#Ci-dessous le contenu du Dockerfile
FROM nginx
RUN apt update && apt install -y procps
ENTRYPOINT [ "ps"]
CMD ["ax"]
Étant donné que le conteneur précédent a été fermé et que le Dockerfile a été mis à jour, l'image nginx créée précédemment est également supprimée.
$ docker-compose down
$ docker rmi -f ID de l'image
$ docker-compose up
nginx_1 | PID TTY STAT TIME COMMAND
nginx_1 | 1 pts/0 Rs+ 0:00 ps ax
Vous pouvez maintenant voir que la partie COMMAND est ps ax et vous pouvez passer ax comme argument. Ensuite, essayez d'écraser le CMD du Dockerfile avec la commande docker-compose.yml.
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
L'option pourrait être remplacée par «r».
Enfin, lorsque seul CMD est spécifié et qu'il n'y a pas de POIN D'ENTREE.
command: r
dans docker-compose.yml.#Ci-dessous le contenu du Dockerfile
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
Eh bien, c'est comme prévu. Bien sûr, si vous n'utilisez que CMD, vous pouvez l'écraser avec docker-compose.yml. Vous pouvez vérifier toutes les zones avec la commande inspect, afin de voir immédiatement si elle a été écrasée ou si le POINT D'ENTREE est défini.
L'introduction est devenue plus longue, mais elle se reflète dans le sujet principal. Il existe un fichier Dockerfile et un docker-compose.yml.
#Ci-dessous le contenu du Dockerfile
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
C'est un sentiment agréable. Entrez dans le conteneur et utilisez la commande ps pour vérifier si db est en cours d'exécution.
# 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
C'est bon Ce serait bien de pouvoir exécuter SQL au démarrage du conteneur. Vous pouvez créer des utilisateurs automatiquement, ajouter des mots de passe, etc.
Exécutez la commande suivante dans le conteneur.
psql -U postgres --command='CREATE DATABASE test'
>>CREATE DATABASE
Vous pouvez vous connecter à la base de données et émettre SQL en passant votre instruction SQL préférée dans la partie --command
.
Alors psql -U postgres --command = 'CREATE DATABASE test'
Vous pouvez passer ceci avec CMD
de Dockerfile ou` la commande: ʻof docker-compose.yml, mais cela seul ne fonctionne pas. ..
Parce que si vous regardez le conteneur postgres que vous avez créé plus tôt avec inspect
{
"Cmd": [
"postgres"
],
"Entrypoint": [
"docker-entrypoint.sh"
],
}
Parce qu'il y a une telle description. (Le json ci-dessus omet considérablement le contenu.) En d'autres termes, ceci est défini depuis le début pour passer l'argument (CMD) à ENTRYPOIN expliqué au début.
Dans cet état, même si vous ajoutez simplement à command:
dans docker-compose.yml, il ne sera reconnu que comme un argument de ENTRYPOINT et une erreur se produira.
En d'autres termes, par défaut, la commande docker-entrypoint.sh postgres
s'exécutera lors de l'exécution du conteneur.
Donc en plus de cela, psql -U postgres --command = 'CREATE DATABASE test'
Comment puis-je exécuter cette commande lors de l'exécution du conteneur?
Placez sh et sql dans docker-entrypoint-initdb.d
dans le conteneur. Sh et sql stockés dans ce répertoire sont automatiquement exécutés au démarrage du conteneur.
Dans ce cas, il semble bon de simplement placer la partie CREATE DATABASE test
dans un fichier .sql directement sous docker-entrypoint-initdb.d
dans le conteneur.
Créez create_table.sql
dans le même répertoire que Dockerfile et docker-compose.yml.
Modifiez ensuite le Dockerfile pour qu'il ressemble à celui ci-dessous.
FROM postgres
RUN apt update && apt install -y procps
COPY *.sql /docker-entrypoint-initdb.d/
Le fichier sql est spécifié à l'aide d'un caractère générique, mais cette fois il s'agit de create_table.sql
, vous pouvez donc également spécifier le nom du fichier normalement.
Maintenant, lancez docker-compose up -d
Entrez le conteneur docker exec -it container ID bash
et entrez dans la base de données avec psql -U postgres
.
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)
Vous pouvez voir qu'il y a une base de données nommée test
en bas.
Vous pouvez maintenant exécuter votre sh ou sql préféré au démarrage même si le POINT D'ENTREE est spécifié dans l'image officielle.
J'ai écrit dans command: psql -U postgres --command = 'CREATE DATABASE test'
dans docker-compose.yml et j'ai déploré que cela ne fonctionne pas, mais cela ne fonctionne pas parce que je l'ai passé comme argument de ENTRYPOINT. ..
Si vous savez écrire dans docker-compose.yml, merci de me le faire savoir dans les commentaires.
Recommended Posts