sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo crear Usuario/Base de datos en script para Docker Postgres

EDITAR:desde el 23 de julio de 2015

La imagen acoplable oficial de postgres ejecutará .sql scripts encontrados en /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 una base de datos , es más fácil usar el 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 Docker de postgres, se dice que

[...] obtendrá cualquier script *.sh que se encuentre en ese directorio [/docker-entrypoint-initdb.d ] para realizar más inicializaciones antes de iniciar el servicio

Lo importante aquí es "antes de iniciar el servicio" . Esto significa que su secuencia de comandos make_db.sh se ejecutará antes de que se inicie el servicio de postgres, por lo que aparece el mensaje de error "no se pudo conectar a la base de datos de postgres" .

Después de eso, hay otra información útil:

Si necesita ejecutar comandos SQL como parte de su inicialización, se recomienda encarecidamente 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 secuencia de comandos de inicialización debe iniciar el servicio postgres en modo único antes de realizar sus acciones. Entonces podrías cambiar tu make_db.ksh script de la siguiente manera y debería acercarte más a lo que quieres:

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, el uso de --single se requería el modo:

gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL