web-dev-qa-db-fra.com

Construire un conteneur Docker PostgreSQL avec le schéma initial

Je cherche à créer des dockerfiles qui représentent des bases de données d'entreprise qui existent déjà. De même, j'aimerais créer un fichier docker qui commence par restaurer un vidage psql.

J'ai mon psql_dump.sql dans le . répertoire.

FROM postgres
ADD . /init_data
run "createdb" "--template=template0" "my_database"
run  "psql" "-d" "my_database"  --command="create role my_admin superuser"
run  "psql" "my_database" "<" "init_data/psql_dump.sql"

Je pensais que ce serait assez bon pour le faire. Je voudrais éviter les solutions qui utilisent un .sh script. Comme cette solution .

J'utilise template0 car la documentation psql indique que vous avez besoin des mêmes utilisateurs créés que ceux qui se trouvaient dans la base de données d'origine, et vous devez créer la base de données avec template0 avant de restaurer.

Cependant, cela me donne une erreur:

createdb: could not connect to database template1: could not connect to server: No such file or directory
        Is the server running locally and accepting

J'utilise également docker compose pour l'application globale, si la résolution de ce problème dans docker-compose est meilleure, je serais heureux d'utiliser l'image psql de base et d'utiliser docker compose pour ce faire.

33
jQwierdy

Selon le guide d'utilisation pour l'image Docker PostreSQL officielle, tout ce dont vous avez besoin est:

Dockerfile

FROM postgres
ENV POSTGRES_DB my_database
COPY psql_dump.sql /docker-entrypoint-initdb.d/

Le POSTGRES_DB la variable d'environnement demandera au conteneur de créer un my_database schéma lors de la première exécution.

Et n'importe quel .sql fichier trouvé dans le /docker-entrypoint-initdb.d/ du conteneur sera exécuté.

Si vous souhaitez exécuter .sh scripts, vous pouvez également les fournir dans le /docker-entrypoint-initdb.d/ répertoire.

41
Thomasleveil

Comme indiqué dans les commentaires, la réponse @Thomasleveil est géniale et simple si la récréation de votre schéma est rapide. Mais dans mon cas, c'est lent, et je voulais utiliser des volumes de docker, alors voici ce que j'ai fait

  1. Utilisez d'abord l'image docker comme dans la réponse @Thomasleveil pour créer un conteneur avec postgres avec toute l'initialisation du schéma

Dockerfile:

FROM postgres
WORKDIR /docker-entrypoint-initdb.d
ADD psql_dump.sql /docker-entrypoint-initdb.d
EXPOSE 5432
  1. puis exécutez-le et créez un nouveau répertoire local qui contient les données postgres après leur remplissage à partir du fichier "psql_dump.sql": docker cp mypg:/var/lib/postgresql/data ./postgres-data

  2. Copiez les données dans un dossier de données temporaires et démarrez un nouveau conteneur docker-compose postgres dont le volume se trouve dans le nouveau dossier de données temporaires:

startPostgres.sh:

rm -r ./temp-postgres-data/data
mkdir -p ./temp-postgres-data/data
cp -r ./postgres-data/data ./temp-postgres-data/
docker-compose -p mini-postgres-project up

et le fichier docker-compose.yml est:

version: '3'
services:
  postgres:
    container_name: mini-postgres
    image: postgres:9.5
    ports:
    - "5432:5432"
    volumes:
      - ./temp-postgres-data/data:/var/lib/postgresql/data

Vous pouvez maintenant exécuter les étapes # 1 et # 2 sur une nouvelle machine ou si votre psql_dump.sql change. Et chaque fois que vous voulez une nouvelle base de données propre (mais déjà initialisée), vous ne pouvez exécuter startPostgres.sh qu'à partir de l'étape 3. Et il utilise toujours des volumes de docker.

6
yishaiz