PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

docker compose :postgresql crée une base de données, passe l'utilisateur et accorde l'autorisation

Sur la base des commentaires, je vais essayer de répondre ici.

Je pense que vous devriez utiliser l'image postgres 11-alpine. Et je vais essayer d'expliquer pourquoi ici.

Les images Docker officielles présentent un certain nombre d'avantages que vous devez toujours prendre en compte avant de créer les vôtres.

  1. Le chemin de mise à niveau est simple - lorsqu'une nouvelle révision de l'application enveloppée dans l'image est publiée, l'image officielle du docker sera dans la plupart des cas mise à jour avec elle. Et généralement, les modifications respectent les conventions de configuration établies par l'image. Tels que les variables d'environnement, les spécificités de démarrage. Pour que les utilisateurs puissent simplement changer la balise dans leurs piles et mettre à niveau. Il peut bien sûr y avoir des changements avec rupture - vérifiez toujours cela.
  2. Grande base d'utilisateurs - lorsque des images comme postgres ont été téléchargées plus de 10 millions de fois (2019), cela ne signifie pas seulement qu'elles sont populaires, mais fonctionnent intrinsèquement comme une garantie que l'image a été testée de manière approfondie. Tous les bogues élémentaires ont déjà été éliminés et vous aurez du plaisir avec l'image.
  3. Optimisé pour la taille et les performances - vous pouvez être sûr que l'attention a été portée sur de nombreux détails, en minimisant la taille de l'image et en maximisant les performances. De nombreux projets publient leurs applications sur quelques distributions Linux différentes. Comme postgres - ils publient debian et un alpine images basées. L'alpine l'image est la plus petite, tandis que debian est légèrement plus grand, mais vous donne accès aux vastes dépôts de paquets debian si vous avez besoin d'installer des paquets supplémentaires.
  4. Configuration facile - les mainteneurs des images officielles comprennent généralement très bien les cas d'utilisation de leur base d'utilisateurs. Et ils essaient de nous faciliter la vie en tant que développeurs et administrateurs (que Dieu les bénisse). Les images officielles ont généralement une assez bonne documentation sur la page de destination de leur hub Docker, ou un lien vers un référentiel github où le README.md couvrira les cas d'utilisation courants. Je trouve que ces instructions valent la peine d'être lues de fond en comble.

Je comprends que vous vouliez garder l'image petite, mais qu'en savez-vous - le projet postgres couvre votre cas d'utilisation.

La dernière image postgres alpine taguée 11-alpine a une empreinte compressée de 28 Mo et décompressé de 70 Mo . Alors que archlinux/base l'image avec laquelle vous souhaitez commencer a une empreinte de base compressée de 153 Mo et une taille décompressée de 445 Mo . Et c'est avant que vous ne présentiez postgres lui-même.

Ajoutez à cela que la base de données et l'utilisateur que vous souhaitez créer au démarrage - peuvent être gérés uniquement dans les variables d'environnement pour l'image officielle de postgres. Comme ceci :

docker run -d --name some-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=simha \
  -e POSTGRES_DB=btgapp \
postgres:11-alpine

Si cela ne couvre pas l'initialisation dont vous avez besoin pour votre base de données, vous pouvez copier .sql scripts (et .sh scripts) dans un emplacement spécial de l'image - et ils seront exécutés au démarrage. Pour cela, vous pouvez étendre leur image comme ceci :

init-user-db.sh

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER simha;
    CREATE DATABASE btgapp;
    GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;
EOSQL

Et puis avec un Dockerfile comme ceci :

Dockerfile

FROM postgres:11-alpine
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh

(Ceci est tiré de la description de postgres sur docker hub )

En conclusion - je vous recommande de ne pas donner la priorité à la distribution sur laquelle une image est basée sur la convivialité et la maintenabilité. Docker nous permet d'exécuter des applications dans des conteneurs sans trop nous soucier de la distribution à l'intérieur du conteneur. Tout est Linux de toute façon. En fin de compte, je m'attends à ce que vous souhaitiez un conteneur de base de données postgres stable comme moi. C'est ce que j'obtiens avec l'image officielle de postgres.

J'espère que je vous ai aidé à évaluer vos options à ce sujet.