EDITAR - desde el 23 de julio de 2015
La imagen oficial de docker postgres ejecutará los .sql
scripts encontrados en la /docker-entrypoint-initdb.d/
carpeta.
Entonces, todo lo que necesita es crear el siguiente script sql:
init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
y agréguelo en su Dockerfile:
Dockerfile
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/
Pero desde el 8 de julio de 2015, si todo lo que necesita es crear un usuario y base de datos , es más fácil simplemente hacer uso de la POSTGRES_USER
, POSTGRES_PASSWORD
y POSTGRES_DB
variables de entorno:
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres
o con un Dockerfile:
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
para imágenes anteriores al 23 de julio de 2015
De la documentación de la imagen de Docker postgres , se dice que
[...] obtendrá cualquier script * .sh encontrado en ese directorio [ /docker-entrypoint-initdb.d
] para realizar una inicialización adicional antes de iniciar el servicio
Lo importante aquí es "antes de comenzar el servicio" . Esto significa que su script make_db.sh se ejecutará antes de que se inicie el servicio postgres, por lo tanto, el mensaje de error "no se pudo conectar a la base de datos postgres" .
Después de eso hay otra información útil:
Si necesita ejecutar comandos SQL como parte de su inicialización, se recomienda el uso del modo de usuario único de Postgres.
De acuerdo, esto puede ser un poco misterioso a primera vista. Lo que dice es que su script de inicialización debe iniciar el servicio postgres en modo único antes de realizar sus acciones. Por lo tanto, puede cambiar su script make_db.ksh de la siguiente manera y debería acercarse a lo que desea:
NOTA , esto ha cambiado recientemente en la siguiente confirmación . Esto funcionará con el último cambio:
export PGUSER=postgres
psql <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
Anteriormente, --single
se requería el uso del modo:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
gosu postgres postgres --single < /tmp/somefile.sql