Saltar al contenido

¿Cómo ejecutar Postgres en un contenedor docker Alpine Linux?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *