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

Como criar usuário/banco de dados em script para Docker Postgres

EDITAR - desde 23 de julho de 2015


A imagem oficial do docker postgres executará .sql scripts encontrados em /docker-entrypoint-initdb.d/ pasta.

Então tudo que você precisa é criar o seguinte script sql:

init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

e adicione-o no seu Dockerfile:

Dockerfile
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/

Mas desde 8 de julho de 2015, se tudo que você precisa é criar um usuário e um banco de dados , é mais fácil usar o POSTGRES_USER , POSTGRES_PASSWORD e POSTGRES_DB variáveis ​​ambientais:
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres

ou com um Dockerfile:
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker

para imagens anteriores a 23 de julho de 2015


A partir da documentação da imagem postgres Docker, diz-se que

ele irá originar qualquer script *.sh encontrado nesse diretório [/docker-entrypoint-initdb.d ] para fazer mais inicialização antes de iniciar o serviço

O importante aqui é "antes de iniciar o serviço" . Isso significa que seu script make_db.sh será executado antes que o serviço postgres seja iniciado, daí a mensagem de erro "não foi possível conectar ao banco de dados postgres" .

Depois disso, há outra informação útil:

Se você precisar executar comandos SQL como parte de sua inicialização, o uso do modo de usuário único do Postgres é altamente recomendado.

Concordo que isso pode ser um pouco misterioso à primeira vista. O que ele diz é que seu script de inicialização deve iniciar o serviço postgres em modo único antes de executar suas ações. Assim, você pode alterar seu make_db.ksh script da seguinte forma e deve aproximá-lo do que você deseja:

OBSERVAÇÃO , isso mudou recentemente no seguinte commit. Isso funcionará com a alteração mais recente:
export PGUSER=postgres
psql <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

Anteriormente, o uso de --single modo era necessário:
gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL