Comment utiliser un conteneur PostgreSQL avec des données existantes?

je suis en train de mettre en place un PostgreSQL conteneur (https://hub.docker.com/_/postgres/). J'ai des données sur une instance PostgreSQL. J'ai copié à partir de /var/lib/postgresql/data et que vous voulez définir comme un volume à un PostgreSQL conteneur.

Ma partie de docker-composer.fichier yml sur PostgreSQL:

db:
    image: postgres:9.4
    ports:
        - 5432:5432
    environment:
        POSTGRES_PASSWORD: postgres
        POSTGRES_USER: postgres
        PGDATA : /var/lib/postgresql/data
    volumes:
        - /projects/own/docker_php/pgdata:/var/lib/postgresql/data

Quand je fais menu fixe-composer jusqu'j'obtiens ce message:

db_1  | initdb: directory "/var/lib/postgresql/data" exists but is not empty
db_1  | If you want to create a new database system, either remove or empty
db_1  | the directory "/var/lib/postgresql/data" or run initdb
db_1  | with an argument other than "/var/lib/postgresql/data".

j'ai essayé de créer ma propre image à partir du conteneur, donc mon fichier Dockerfile est:

FROM postgres:9.4
COPY pgdata /var/lib/postgresql/data

Mais j'ai eu la même erreur, ce que je fais mal?

mise à Jour

J'ai eu SQL en utilisant pg_dumpall et je l'ai mis dans /docker-entrypoint-initdb.d, mais ce fichier s'exécute chaque fois que je fais docker-compose up.

24
demandé sur Peter Mortensen 2016-02-28 10:40:22

2 réponses

pour construire sur la réponse d'irakli, voici une solution mise à jour:

  • utiliser la nouvelle version 2 docker composer le fichier
  • distinct volumes
  • paramètres supplémentaires supprimés

menu fixe-composer.yml

version: '2'

services:
  postgres9:
    image: postgres:9.4
    expose:
      - 5432
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data: {}

démo

Démarrer le serveur de base de données Postgres:

$ docker-compose up

afficher tous les tableaux de la base de données. Dans un autre terminal, parlez au Postgres:

$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'

il ne montrera rien, car la base de données est vide. Créer un tableau:

$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'create table beer()'

Liste nouvellement créée, la table:

$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'

                         Access privileges
 Schema |   Name    | Type  | Access privileges | Column access privileges 
--------+-----------+-------+-------------------+--------------------------
 public | beer      | table |                   | 

Yay! Nous avons maintenant commencé une base de données Postgres en utilisant un volume de stockage partagé, et y avons stocké quelques données. La prochaine étape consiste à vérifier que les données restent après l'arrêt du serveur.

maintenant, désactivez le conteneur du serveur Postgres:

$ docker-compose stop

démarrage du container Postgres encore une fois:

$ docker-compose up

nous nous attendons à ce que le serveur de base de données réutilise le stockage, donc nos données très importantes sont toujours là. Vérifier:

$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'
                         Access privileges
 Schema |   Name    | Type  | Access privileges | Column access privileges 
--------+-----------+-------+-------------------+--------------------------
public | beer      | table |                   | 

nous avons utilisé avec succès un fichier de composition de Docker de nouveau style pour exécuter une base de données Postgres en utilisant un volume de données externe, et vérifié qu'il garde nos données saines et sûres.

stockage des données

tout d'Abord, faire une sauvegarde, le stockage de nos données sur l'ordinateur hôte:

$ docker exec -it $(docker-compose ps -q postgres9 ) pg_dump -Upostgres > backup.sql

Zappez nos données du invité de la base de données:

$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'drop table beer'

restaurer notre sauvegarde (stockée sur l'hôte) dans le conteneur Postgres.

Remarque: utilisation de "exec -je", "- it", sinon vous obtiendrez une erreur" l'appareil d'entrée n'est pas un TTY".

$ docker exec -i $(docker-compose ps -q postgres9 ) psql -Upostgres < backup.sql

la Liste des tables pour vérifier la restauration a fonctionné:

$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'
                         Access privileges
Schema |   Name    | Type  | Access privileges | Column access privileges 
--------+-----------+-------+-------------------+--------------------------
public | beer      | table |                   | 

pour résumer, nous avons vérifié que nous pouvons démarrer une base de données, les données persistent après un redémarrage, et nous pouvons restaurer une sauvegarde hôte.

Merci Tomasz!

35
répondu johntellsall 2017-03-22 19:21:28

on dirait que L'image PostgreSQL a des problèmes avec les volumes montés. FWIW, il est probablement plus un problème PostgreSQL que Dockers, mais cela n'a pas d'importance parce que le montage des disques n'est pas une façon recommandée pour les fichiers de base de données persisting, de toute façon.

vous devriez plutôt créer des conteneurs Docker ne contenant que des données. Comme ceci:

postgres9:
  image: postgres:9.4
  ports:
    - 5432:5432
  volumes_from:
    - pg_data
  environment:
    POSTGRES_PASSWORD: postgres
    POSTGRES_USER: postgres
    PGDATA : /var/lib/postgresql/data/pgdata

pg_data:
  image: alpine:latest
  volumes:
    - /var/lib/postgresql/data/pgdata
  command: "true"
Pourquoi Docker Conteneurs De Données (Volumes!) sont Bonnes

comme pour: comment importer des données initiales, vous pouvez soit:

  1. docker cp, dans le conteneur data-only de la configuration, ou
  2. utilisez un dump SQL des données, au lieu de déplacer des fichiers binaires (ce que je ferais).
9
répondu irakli 2018-07-25 05:08:13