EDITAR - desde el 23 de julio de 2015
La imagen oficial de docker postgres ejecutará los .sqlscripts 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_PASSWORDy POSTGRES_DBvariables 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, --singlese 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.sqlpsql -U myDb -d myDb -f myDb.sqldocker-entrypoint-initdb.d, vi miinit.sqlcon el código sql. ¡PERO cuando abro mysql (usando el acceso raíz) y escribo show database, solo veo el valor predeterminado deldocker-compose.ymlarchivo! ¿Por qué no me funciona?db.sqlincluso después de que se copia en `docker-entrypoint-initdb.d`Ahora puede poner archivos .sql dentro del directorio init:
De los documentos
Así que copiar su archivo .sql funcionará.
fuente
Warning: scripts in /docker-entrypoint-initdb.d are only run if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup. One common problem is that if one of your /docker-entrypoint-initdb.d scripts fails (which will cause the entrypoint script to exit) and your orchestrator restarts the container with the already initialized data directory, it will not continue on with your scripts.Al usar
docker-compose:Suponiendo que tiene el siguiente diseño de directorio:
Expediente:
docker-compose.ymlExpediente:
Docker/init.sqlExpediente:
Docker/db.DockerfileServicios de composición e inicio:
fuente
Agrego comandos personalizados a un entorno evocado en un CMD después de iniciar los servicios ... No lo he hecho con postgres, pero con Oracle:
y empezar con
.
fuente
Puedes usar estos comandos:
fuente
ENCODING 'LATIN1'es muy raro ... Debe tener necesidades muy particulares para evitar usar utf8Debe tener la base de datos ejecutándose antes de crear los usuarios. Para esto necesitas múltiples procesos. Puede iniciar postgres en un subshell (&) en el script de shell, o usar una herramienta como supervisor para ejecutar postgres y luego ejecutar cualquier script de inicialización.
Una guía para supervisor y acoplador https://docs.docker.com/articles/using_supervisord/
fuente
Con docker compose hay una alternativa simple (no es necesario crear un Dockerfile). Simplemente cree un init-database.sh:
Y referencia en la sección de volúmenes:
fuente