¿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
.
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!
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:
-
docker cp
, en el contenedor de solo datos de la configuración, o - Use un volcado SQL de los datos, en lugar de mover archivos binarios (que es lo que haría).
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