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