Je veux passer la commande de démarrage à postgres avec docker-compose.

introduction

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.)

POINT D'ENTREE et piège CMD

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.

#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.

Sujet principal

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.

Sommaire

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

Je veux passer la commande de démarrage à postgres avec docker-compose.
Je souhaite utiliser le mode sombre avec l'application SWT
Je veux revenir à l'écran précédent avec kotlin et java!
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
Je veux passer l'argument d'Annotation et l'argument de la méthode d'appel à aspect
Je veux introduire un comité avec des rails sans devenir trop sale
[Pour les débutants] Je souhaite saisir automatiquement des données pré-enregistrées dans le formulaire de saisie avec une commande de sélection.
J'ai essayé de lier grafana et postgres [docker-compose]
Je veux utiliser java8 forEach avec index
Je veux var_dump le contenu de l'intention
Je souhaite transmettre APP_HOME pour me connecter à Gradle
passer deux arguments à l'URI avec link_to
Je veux jouer avec Firestore de Rails
Je veux tronquer après la virgule décimale
Je veux réduire les erreurs simples. Pour vous commander.
Je souhaite effectuer un traitement d'agrégation avec spring-batch
[Rails] Je veux charger du CSS avec webpacker
Je veux obtenir la valeur en Ruby
[Eclipse] Je veux utiliser la fonction de complétion, mais je veux réussir à confirmer la complétion avec un espace
Je voulais démarrer un serveur AP et déboguer avec juste la commande Maven
[Java] Je souhaite calculer la différence par rapport à la date
Je veux intégrer n'importe quel TraceId dans le journal
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
Je veux juger la gamme en utilisant le diplôme mensuel
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je souhaite authentifier les utilisateurs auprès de Rails avec Devise + OmniAuth
Je veux faire des transitions d'écran avec kotlin et java!
Je veux appeler la méthode principale en utilisant la réflexion
[Commentaire approximatif] Je veux épouser la méthode du pluck
Je veux retourner la position de défilement de UITableView!
Je souhaite simplifier la sortie du journal sur Android
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
Je souhaite modifier le chemin après une nouvelle inscription après m'être connecté avec plusieurs appareils.
Je veux accéder à l'API avec Rails sur plusieurs docker-composes configurés localement
Pourquoi puis-je utiliser la commande rails installée avec gem? ??
[Débutant] Je souhaite modifier le fichier de migration-Comment utiliser la restauration-
L'histoire qui a conduit à résoudre l'erreur car postgres n'a pas commencé avec docker-compose up
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
Je veux convertir des caractères ...
(´-`) .. oO (Je veux trouver facilement la sortie standard" Hello ".
Après avoir publié un article avec Rails Simple Calendar, je souhaite le refléter dans le calendrier.
Je veux pousser une application créée avec Rails 6 vers GitHub
Je souhaite utiliser l'applet Java facilement sur la ligne de commande sans utiliser l'IDE
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Je veux faire une liste avec kotlin et java!
Je veux appeler une méthode et compter le nombre
Je veux créer une fonction avec kotlin et java!