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 :-)