Nuestro grupo especializado pasados muchos días de trabajo y de recopilar de información, hemos dado con los datos necesarios, esperamos que te sea útil en tu trabajo.
Solución:
Terminé con este Dockerfile:
FROM postgres:10.0-alpine
USER postgres
RUN chmod 0700 /var/lib/postgresql/data &&
initdb /var/lib/postgresql/data &&
echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf &&
echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf &&
pg_ctl start &&
psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'main'" | grep -q 1 || psql -U postgres -c "CREATE DATABASE main" &&
psql -c "ALTER USER postgres WITH ENCRYPTED PASSWORD 'mysecurepassword';"
EXPOSE 5432
Este dockerfile crea la base de datos ‘principal’ (si no existe), inicia postgres y establece la contraseña de usuario predeterminada
Pude hacerlo usando comandos exec, por lo que puedo ejecutar postgres en un contenedor en ejecución, en este caso, alpine 3.7. Nota $CONTAINER_NAME
es la identificación del contenedor de docker ps
:
# Install postgresql, create user, db & start the daemon (for testing)
sudo docker exec $CONTAINER_NAME sh -c 'apk add postgresql'
sudo docker exec $CONTAINER_NAME sh -c 'addgroup -S postgres && adduser -S postgres -G postgres'
sudo docker exec $CONTAINER_NAME sh -c 'mkdir -p /var/lib/postgresql/data'
sudo docker exec $CONTAINER_NAME sh -c 'mkdir -p /run/postgresql/'
sudo docker exec $CONTAINER_NAME sh -c 'chown -R postgres:postgres /run/postgresql/'
sudo docker exec $CONTAINER_NAME sh -c 'chmod -R 777 /var/lib/postgresql/data'
sudo docker exec $CONTAINER_NAME sh -c 'chown -R postgres:postgres /var/lib/postgresql/data'
sudo docker exec --user postgres $CONTAINER_NAME sh -c 'initdb /var/lib/postgresql/data'
sudo docker exec --user postgres $CONTAINER_NAME sh -c 'echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf'
sudo docker exec --user postgres $CONTAINER_NAME sh -c 'pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log'
sudo docker exec --user postgres $CONTAINER_NAME sh -c "psql --command "ALTER USER postgres WITH ENCRYPTED PASSWORD 'buildpgpass';""
sudo docker exec --user postgres $CONTAINER_NAME sh -c "psql --command "CREATE DATABASE builddb;""
También puede incluir esto en su Dockerfile así:
# Postgres
RUN apk add postgresql=11.1-r0
RUN (addgroup -S postgres && adduser -S postgres -G postgres || true)
RUN mkdir -p /var/lib/postgresql/data
RUN mkdir -p /run/postgresql/
RUN chown -R postgres:postgres /run/postgresql/
RUN chmod -R 777 /var/lib/postgresql/data
RUN chown -R postgres:postgres /var/lib/postgresql/data
RUN su - postgres -c "initdb /var/lib/postgresql/data"
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf
RUN su - postgres -c "pg_ctl start -D /var/lib/postgresql/data -l /var/lib/postgresql/log.log && psql --command "ALTER USER postgres WITH ENCRYPTED PASSWORD 'postgres';" && psql --command "CREATE DATABASE builddb;""
Esto parece funcionar muy bien si quieres probar algo sobre la marcha.
Hay varios problemas con su dockerfile. Supongo que está intentando iniciar el servidor al crear la imagen para crear la base de datos principal. Esto no funcionará ya que cada comando en el dokefile se ejecutará en su propia capa y, por lo tanto, cuando llegue RUN psql ...
la base de datos no se iniciará ya que se inició en una capa diferente. Entonces necesita agrupar los comandos en una línea.
El segundo problema es que el archivo /etc/init.d/postgresql
no existe. El servidor se puede iniciar usando el comando postgres:
RUN postgres &
psql --command "IF NOT EXISTS (SELECT FROM pg_catalog.pg_user WHERE usename = 'user')
THEN CREATE USER user WITH SUPERUSER ENCRYPTED PASSWORD 'password'; END IF;" &
createdb main
Si entiendes que te ha resultado de ayuda nuestro post, sería de mucha ayuda si lo compartieras con más programadores de esta forma contrubuyes a dar difusión a nuestro contenido.