Inizializzare un database PostgreSQL con Docker Compose

Docker Compose è uno strumento potente per definire ed eseguire ambienti multi-container. In questo articolo vedremo come utilizzarlo per avviare rapidamente un database PostgreSQL e inizializzarlo con uno script SQL personalizzato.

1. Prerequisiti

  • Docker installato sul sistema
  • Docker Compose installato
  • Conoscenza base di YAML e SQL

2. Struttura del progetto

Organizziamo i file in una semplice struttura:

.
├── docker-compose.yml
└── init.sql

3. Contenuto del file docker-compose.yml

Il file docker-compose.yml definisce il servizio PostgreSQL e specifica il volume che monta lo script di inizializzazione.


services:
  db:
    image: postgres
    container_name: postgres_db
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"

4. Contenuto del file init.sql

Questo script verrà eseguito automaticamente all’avvio del container, creando tabelle o inserendo dati iniziali.

CREATE TABLE IF NOT EXISTS users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL UNIQUE
);

INSERT INTO users (username, email)
VALUES ('alice', 'alice@example.com'),
       ('bob', 'bob@example.com');

5. Avvio del servizio

Avvia il container con il seguente comando:

docker compose up -d

Il database PostgreSQL sarà accessibile sulla porta 5432 del tuo host e il contenuto di init.sql verrà eseguito alla creazione del volume dati.

6. Verifica

Puoi connetterti al database per verificare che le tabelle siano state create:

docker exec -it postgres_db psql -U user -d mydb

All'interno della shell psql, puoi eseguire:

SELECT * FROM users;

Conclusione

Inizializzare PostgreSQL con Docker Compose è un modo rapido ed efficace per preparare ambienti di sviluppo o test. Grazie alla possibilità di eseguire script all’avvio, puoi definire facilmente la struttura del database e i dati di esempio.

Torna su