PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como persistir dados usando a imagem do docker postgres?


Primeiro, essas variáveis ​​de ambiente parecem suspeitas. Dê uma olhada na documentação da imagem oficial do Docker , e observe que você precisa de POSTGRES_DB , POSTGRES_USER e POSTGRES_PASSWORD , em vez de DB_NAME , DB_USER e DB_PASS .

Fora isso, você parece estar no caminho certo. Aqui está um exemplo completo:

Primeiro, eu inicio um container Postgres. Estou localizando o armazenamento persistente em algum lugar fora do meu diretório pessoal, porque, como você já notou, os arquivos não serão de sua propriedade, o que pode ser confuso em seu diretório pessoal (embora não necessariamente problemático):
docker run --rm --name postgres \
  -v /tmp/postgres:/var/lib/postgresql/data \
  -e POSTGRES_DB=larstest \
  -e POSTGRES_USER=lars \
  -e POSTGRES_PASSWORD=secret postgres

Como esta é a primeira vez que iniciei o postgres apontando para esse diretório de dados, veremos ele inicializar o banco de dados:
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

Agora, de outra janela, posso me conectar a ele...
$ psql -h 172.17.0.4 -U lars larstest
Password for user lars: 
psql (9.5.4, server 9.6.0)
WARNING: psql major version 9.5, server major version 9.6.
         Some psql features might not work.
Type "help" for help.

...e crie alguns dados:
larstest=# create table testtable (id integer);
CREATE TABLE
larstest=# insert into testtable values (1);
INSERT 0 1
larstest=# select * from testtable;
 id 
----
  1
(1 row)

Agora, eu saio do contêiner:
^CLOG:  received fast shutdown request
LOG:  aborting any active transactions
FATAL:  terminating connection due to administrator command
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down

Podemos verificar se ele não está mais em execução:
$ docker ps | grep postgres

Mas se iniciarmos novamente com os mesmos argumentos de linha de comando;
docker run --rm --name postgres \
  -v /tmp/postgres:/var/lib/postgresql/data \
  -e POSTGRES_DB=larstest \
  -e POSTGRES_USER=lars \
  -e POSTGRES_PASSWORD=secret postgres

Vemos que ele não inicializa o banco de dados, pois já existe, e pula direto para:
LOG:  database system was shut down at 2016-10-21 03:13:50 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

Neste ponto, podemos reconectar ao banco de dados e descobrir que nossos dados ainda existem:
$ psql -h 172.17.0.2 -U lars larstest
Password for user lars: 
psql (9.5.4, server 9.6.0)
WARNING: psql major version 9.5, server major version 9.6.
         Some psql features might not work.
Type "help" for help.

larstest=# select * from testtable;
 id 
----
  1
(1 row)

Isso é praticamente tudo o que há para isso.