Crear un usuario de base de datos usando Docker Postgres

David Mbochi Njonge 20 junio 2023
  1. Crear un nuevo proyecto
  2. Definir DDL para el usuario y la base de datos
  3. Definir un Dockerfile para la imagen
  4. Construir una imagen
  5. ejecutar un contenedor
  6. Conéctese al contenedor
  7. Iniciar sesión en PostgreSQL
  8. Crear una base de datos de usuarios sin un archivo de script
  9. Conclusión
Crear un usuario de base de datos usando Docker Postgres

Cuando desarrollamos aplicaciones, generalmente usamos sistemas de administración de bases de datos como PostgreSQL, MySQL, MongoDB y otros para registrar los datos de las aplicaciones.

Docker nos ayuda a ejecutar una instancia de estos sistemas de administración de bases de datos de aplicaciones. Esto ayuda a ahorrar tiempo y almacenamiento en la computadora porque no se necesita un DBMS en la computadora.

Cada base de datos creada a partir de estos DBMS tiene usuarios que tienen diferentes autorizaciones en la base de datos. En este tutorial, aprenderemos los diferentes enfoques para crear un usuario de base de datos utilizando Docker Postgres.

Crear un nuevo proyecto

Para este tutorial, usaremos WebStorm IDE, pero no dude en usar cualquier entorno de desarrollo. Abra WebStorm IDE y seleccione Archivo > Nuevo > Proyecto para crear un nuevo proyecto.

Seleccione la opción Proyecto vacío y en la ventana que se abre, cambie el nombre del proyecto de sin título a initdb.d o use el nombre que prefiera.

Definir DDL para el usuario y la base de datos

Para agregar una inicialización adicional a nuestra imagen personalizada usando una imagen base de PostgreSQL, debemos agregar *.sql, *.sql.gz o *.sh en la carpeta /docker-entrypoint-initdb.d.

Como queremos crear una consulta SQL, definiremos nuestra consulta utilizando el archivo con la extensión .sql. Cree un archivo llamado db-config.sql en la carpeta actual de nuestro proyecto y copie y pegue las siguientes instrucciones SQL en el archivo.

CREATE USER doe;
CREATE DATABASE employee_database;
GRANT ALL PRIVILEGES ON DATABASE employee_database TO doe;

El db-config.sql se ejecutará después de que el punto de entrada llame a initdb para crear el usuario y la base de datos Postgres predeterminados.

Tenga en cuenta que los scripts en /docker-entrypoint-initdb.d solo se ejecutan si el directorio de datos está vacío. Esto significa que durante el inicio, cualquier base de datos ejecutada antes de esta no cambiará.

Definir un Dockerfile para la imagen

Cree un archivo llamado Dockerfile en la carpeta actual y copie y pegue las siguientes instrucciones en el archivo.

FROM postgres:15.1-alpine
COPY db-config.sql /docker-entrypoint-initdb.d/

FROM: define la imagen base sobre la que crear una imagen personalizada utilizando las instrucciones posteriores. En este caso hemos utilizado alpine, que nos ayuda a optimizar el almacenamiento al ser una versión ligera de PostgreSQL.

COPY: copia archivos y carpetas del host al sistema de archivos de imágenes. En este caso, hemos copiado el archivo db-config.sql en la carpeta /docker-entrypoint-initdb.d/.

Construir una imagen

Abra una nueva ventana de terminal usando el atajo de teclado ALTF12 en su teclado y use el siguiente comando para construir una imagen con la etiqueta postgres-image.

~/WebstormProjects/initdb.d$ docker build --tag postgres-image:latest .

Producción :

 => [1/2] FROM docker.io/library/postgres:15.1-alpine@sha256:cc663286e63810373bdfc91a5ed24b772447fb5282d  0.0s
 => CACHED [2/2] COPY db-config.sql /docker-entrypoint-initdb.d/                                          0.0s
 => exporting to image                                                                                    0.4s
 => => exporting layers                                                                                   0.0s
 => => writing image sha256:fd33d80c880452dcb25de1d8f7d6415eeb874039bdab176cc3d3fe1c910ebcbc              0.1s
 => => naming to docker.io/library/postgres-image:latest

ejecutar un contenedor

Usando la misma ventana de terminal, use el siguiente comando para ejecutar un contenedor PostgreSQL con el nombre postgres-container.

~/WebstormProjects/initdb.d$ docker run --name postgres-container -e POSTGRES_PASSWORD=postgres -d postgres-image

Producción :

3b8e0f85c2b4ef4b1aa28e2bad169ae796751331580af6fbba251a1c05aa4fca

Tenga en cuenta que hemos utilizado una variable de entorno llamada POSTGRES_PASSWORD en el comando ejecutar. Al ejecutar PostgreSQL, podemos pasar varias variables de entorno para proporcionar detalles de superusuario, incluida la base de datos y el nombre de usuario.

La variable de entorno POSTGRES_PASSWORD es una variable obligatoria que proporciona la contraseña de superusuario. La contraseña predeterminada para PostgreSQL es postgres.

Otras variables de entorno que se pueden pasar son las opcionales, que incluyen POSTGRES_USER, POSTGRES_DB y POSTGRES_INITDB_ARGS, entre otras.

Dado que estamos ejecutando el contenedor en modo separado, no podemos ver la ejecución del archivo db-config.sql. Sin embargo, este archivo se ejecuta en segundo plano por el superusuario.

Conéctese al contenedor

Necesitamos conectarnos al contenedor usando un shell interactivo para que podamos iniciar sesión en PostgreSQL usando el nuevo usuario y la base de datos. Para lograr esto, use el siguiente comando para conectarse al contenedor.

~/WebstormProjects/initdb.d$ docker exec -it postgres-container bash

Producción :

bash-5.1#

Iniciar sesión en PostgreSQL

Una vez que tengamos acceso al shell de los contenedores, use el siguiente comando para iniciar sesión en la base de datos de empleados como usuario doe.

bash-5.1# psql -d employee_database -U doe

Producción :

psql (15.1)
Type "help" for help.

employee_database=>

Crear una base de datos de usuarios sin un archivo de script

En la sección anterior, aprendimos cómo crear un usuario de base de datos en Docker Postgres agregando un SQL que contiene el DDL a /docker-entrypoint-initdb.d/.

Hay un enfoque más sencillo para hacer esto sin escribir ningún archivo de script. Este enfoque utiliza las variables de entorno mencionadas en la sección anterior para definir los detalles de un nuevo usuario.

Estas variables de entorno se agregan al Dockerfile usando la instrucción ENV y estarán disponibles para el contenedor. Para ver esto en acción, reemplace las instrucciones en el Dockerfile con las instrucciones proporcionadas a continuación.

FROM postgres:15.1-alpine
ENV POSTGRES_USER=doe
ENV POSTGRES_DB=employee_database

Después de agregar las variables de entorno, repita todos los pasos cubiertos en las secciones anteriores, desde crear una imagen, ejecutar un contenedor, conectarse al contenedor e iniciar sesión en PostgreSQL.

Utilice el mismo comando para todos los pasos. Sin embargo, asegúrese de detener y retirar el contenedor existente.

También puede optar por crear una nueva imagen y contenedor.

Conclusión

En este tutorial, hemos aprendido dos enfoques que podemos usar para crear un usuario de base de datos con Docker Postgres. El primer enfoque creó un usuario agregando un script SQL a /docker-entrypoint-initdb.d/, y este archivo se ejecutó durante la inicialización de initdb.

En el segundo enfoque, hemos definido los detalles del usuario en el Dockerfile aprovechando las variables de entorno de Docker Postgres.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub