Utilizzare Postgres con Docker su Windows

Stavo cercando qualcosa di breve su come iniziare con Docker Compose e ho trovato questo video:

Docker Compose in 12 Minutes (Mar 14, 2017) - Learn how to use Docker Compose to run multi-container applications easily. This is the second video in this Docker series.

È un bel video con un esempio molto semplice e ben spiegato. C’è un progetto con cui fare pratica su GitHub.

Dopo questo esempio mi sono ricordato di questo post:

ASP.Net Core Web API with Docker Compose, PostgreSQL and EF Core.

e ho voluto provare quanto descritto nel post. Qui il codice sorgente.

Ma prima volevo iniziare a utilizzare PostgreSql con Docker. Così ho seguito le indicazioni di questo post: Setup PostgreSQL on Windows with Docker e di questo: Stop Installing Postgres on Your Laptop : Use Docker Instead.

Quindi questa è stata la mia prima idea per un docker container:

docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -d postgres

con tutti i dati dei database del server contenuti nel container.

Guardando nella documentazione di Postgres Postgres Official Docker Image ho scoperto che è possibile mappare un folder sulla macchina host con il folder dei dati di Postgres all’interno del container in modo da mantenere i database creati anche se il container viene eliminato per fare un update dell’immagine.

Quindi questa è stata l’evoluzione:

docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -v /c/Users/myuser/DockerProjects/postgres/postgres_db:/var/lib/postgresql/data -d postgres

Ma con Docker Toolbox for Windows 10 Home (il mio caso), il mio container postgres non funzionava.

Guardando ai logs con docker logs postgres_db ho scoperto il problema:

FATAL: data directory "/var/lib/postgresql/data" has wrong ownership

Questa è una soluzione:

postgresql:
  image: postgres:93
  volumes:
  - postgres:/var/lib/postgresql/data
  - ./postgresql/conf:/etc/postgresql/
...
volumes:
  postgres:

Qui qualcosa di simile:

In conclusione: la soluzione alternativa è creare un volume (locale) con:

$ docker volume create --name data-postgresql --driver local

Di conseguenza il file docker-compose.yml diventa qualcosa del genere:

services:
  pgsql:
    volumes:
      - data-postgresql:/var/lib/postgresql

volumes:
  data-postgresql:
    external: true

Mi sono anche letto Start a container with a volume nella sezione Use Volume - Docker Documentation.

Questa la mia soluzione per un container di test:

$ docker volume create --name postgres-volume

$ docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -v postgres-volume:/var/lib/postgresql/data -d postgres

E finalmente riesco a sperimentare con Postgres :-)

Messaggi di questa serie