¿Cómo usar un contenedor PostgreSQL con datos existentes?


Estoy intentando configurar un contenedor PostgreSQL ( https://hub.docker.com/_/postgres / ). Tengo algunos datos de una instancia actual de PostgreSQL. Lo copié de /var/lib/postgresql/data y quiero configurarlo como un volumen en un contenedor PostgreSQL.

Mi parte de docker-compose.archivo yml sobre 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

Cuando hago docker-compose up recibo este mensaje:

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

Traté de crear mi propia imagen desde el contenedor, así que mi Dockerfile es:

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

Pero tengo lo mismo error, ¿qué estoy haciendo mal?

Actualización

Obtuve SQL usando pg_dumpall y lo puse en /docker-entrypoint-initdb.d, pero este archivo se ejecuta cada vez que lo hago docker-compose up.

Author: Peter Mortensen, 2016-02-28

2 answers

Para construir sobre la respuesta de irakli, aquí hay una solución actualizada:

  • utilice la versión más reciente 2 Docker Compose file
  • separate volumes section
  • ajustes adicionales eliminados

Docker-compose.yml

version: '2'

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

volumes:
  data: {}

Demo

Iniciar el servidor de base de datos Postgres:

$ docker-compose up

Mostrar todas las tablas de la base de datos. En otra terminal, hable con los Postgres del contenedor:

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

No mostrará nada, ya que la base de datos está en blanco. Crear un cuadro:

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

Listar la tabla recién creada:

$ 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! Ahora hemos iniciado una base de datos Postgres utilizando un volumen de almacenamiento compartido, y almacenamos algunos datos en ella. El siguiente paso es verificar que los datos realmente se peguen después de que el servidor se detenga.

Ahora, mata el contenedor del servidor Postgres:

$ docker-compose stop

Inicie de nuevo el contenedor Postgres:

$ docker-compose up

Esperamos que el servidor de base de datos reutilice el almacenamiento, por lo que nuestros datos muy importantes todavía están allí. Comprobación:

$ 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 |                   | 

Hemos utilizado con éxito un nuevo archivo Docker Compose de estilo para ejecutar una base de datos Postgres utilizando un volumen de datos externo, y hemos comprobado que mantiene nuestros datos sanos y salvos.

Almacenamiento de datos

Primero, hacer una copia de seguridad, almacenando nuestros datos en el host:

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

Zap nuestros datos de la base de datos de huéspedes:

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

Restaurar nuestra copia de seguridad (almacenada en el host) en el contenedor Postgres.

Nota: use "exec-i", no "- it", de lo contrario obtendrá un error" input device is not a TTY".

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

Lista las tablas para verificar que la restauración funcionó:

$ 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 |                   | 

En resumen, hemos verificado que podemos iniciar una base de datos, los datos persisten después de un reinicio, y podemos restaurar una copia de seguridad en ella desde el host.

Gracias Tomasz!

 35
Author: johntellsall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-22 19:21:28

Parece que la imagen de PostgreSQL está teniendo problemas con los volúmenes montados. FWIW, es probablemente más un problema PostgreSQL que Dockers, pero eso no importa porque montar discos no es una forma recomendada para persistir archivos de base de datos, de todos modos.

En su lugar, debería crear contenedores Docker de solo datos. Así:

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"

Que probé y trabajé bien. Puede leer más sobre los contenedores de solo datos aquí: Por qué Contenedores de Datos Docker (Volúmenes!) ser Bueno

En cuanto a: cómo importar datos iniciales, puede:

  1. docker cp, en el contenedor de solo datos de la configuración, o
  2. Use un volcado SQL de los datos, en lugar de mover archivos binarios (que es lo que haría).
 9
Author: irakli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-25 05:08:13