He estado tratando de configurar un contenedor para una instancia de postgres de desarrollo creando un usuario y una base de datos personalizados. Estoy usando la imagen oficial de docker postgres . En la documentación, le indica que inserte un script bash dentro de la /docker-entrypoint-initdb.d/
carpeta para configurar la base de datos con cualquier parámetro personalizado.
Mi script bash: make_db.sh
su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"
Dockerfile
FROM library/postgres
RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/
El error que obtengo de docker logs -f db
(db es el nombre de mi contenedor) es:
createuser: no se pudo conectar a la base de datos postgres: no se pudo conectar al servidor: No existe tal archivo o directorio
Parece que los comandos dentro de la /docker-entrypoint-initdb.d/
carpeta se están ejecutando antes de que se inicie postgres. Mi pregunta es, ¿cómo configuro un usuario / base de datos mediante programación usando el contenedor oficial de postgres? ¿Hay alguna manera de hacer esto con un script?
fuente
gosu postgres postgres --single < /tmp/somefile.sql
psql -U myDb -d myDb -f myDb.sql
docker-entrypoint-initdb.d
, vi miinit.sql
con el código sql. ¡PERO cuando abro mysql (usando el acceso raíz) y escribo show database, solo veo el valor predeterminado deldocker-compose.yml
archivo! ¿Por qué no me funciona?db.sql
incluso 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.yml
Expediente:
Docker/init.sql
Expediente:
Docker/db.Dockerfile
Servicios 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