Docker: PostgreSQL
Contingut
Referències
- https://hub.docker.com/_/postgres
- https://dev.to/andre347/how-to-easily-create-a-postgres-database-in-docker-4moj
Imatge oficial de PostgreSQL
Baixem la imatge oficial de postgres:
$ cd dockerprojects/ $ docker pull postgres ... Status: Downloaded newer image for postgres:latest docker.io/library/postgres:latest $ docker image ls ... postgres latest b2fcd079c1d4 2 weeks ago 315MB
The default postgres user and database are created in the entrypoint with initdb. Aquest entrypoint està en la imatge.
I ara ja podem arrencar la imatge:
$ docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6061e2acb18b postgres "docker-entrypoint.s…" 11 seconds ago Up 9 seconds 5432/tcp some-postgres
I ara, si volem entrar en el postgres:
$ docker exec -ti some-postgres psql -U postgres psql (13.3 (Debian 13.3-1.pgdg100+1)) Type "help" for help. postgres=#
Només tenim la base de dades postgres (i les altres dos per defecte). Però a partir d'aquí ja podem crear una base de dades, crear taules, etc.
Anem a esborrar tot el que hem fet. Primer, aturem i eliminem el contenidors:
$ docker stop 6061e2acb18b -> status: exited si fem ''ps -a'' $ docker rm 6061e2acb18b -> ja no apareix si fem ''ps -a''
I ara eliminem la imatge:
$ docker image rm b2fcd079c1d4 Untagged: postgres:latest Untagged: postgres@sha256:6647385dd9ae11aa2216bf55c54d126b0a85637b3cf4039ef24e3234113588e3 Deleted: sha256:b2fcd079c1d403dc1dba5397ca1bca606f17ebcf99b03b66c59941929acff57c Deleted: sha256:99eda903f9144cce86fd8420b7c8b4f149891a7526447b31fa75cbcf8319cffd ...
Modificació per treballar amb una base de dades pròpia
Ara el que volem és fer un dockerfile de manera que creem ja una base de dades per treballar.
En la primera referència, en l'apartat Initialization scripts, es comenta que hi ha la carpeta docker-entrypoint-initdb.d/, i que els scripts que conté s'executen en el moment del build (ja siguin .sh o .sql). Aquesta carpeta està en la imatge, no és un directori local.
Creem el script Dockerfile_postgres_
FROM postgres ENV POSTGRES_PASSWORD docker ENV POSTGRES_DB world COPY world.sql /docker-entrypoint-initdb.d/
La primera línia equival al pull que hem fet abans. És la imatge oficial de PostgreSQL. Seguim amb les instruccions de donar unes variables d'entorn, i tot seguit copiar el script local world.sql a la carpeta docker-entrypoint-initdb.d/, que és allà on es mira en la post-instal·lació.
El script world.sql el trobem en la referència (https://dev.to/andre347/how-to-easily-create-a-postgres-database-in-docker-4moj) i conté la creació de les taules, les dades, i les relacions entre taules.
I ara fem el build a partir d'aquest dockerfile:
$ docker build -t my-postgres-db -f ./Dockerfile_postgres ./ ... Step 4/4 : COPY world.sql /docker-entrypoint-initdb.d/ ---> 135f428bea67 Successfully built 135f428bea67 Successfully tagged my-postgres-db:latest
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE my-postgres-db latest 135f428bea67 24 seconds ago 315MB
Ara ja el podem executar, per tal de crear el contenidor a partir de la imatge:
$ docker run -d --name my-postgresdb-container -p 5432:5432 my-postgres-db $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8b4f4fefb380 my-postgres-db "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:5432->5432/tcp my-postgresdb-container
I ara ja podem executar el contenidor, i ja tindrem disponible la base de dades world:
$ docker exec -ti my-postgresdb-container psql -U postgres psql (13.3 (Debian 13.3-1.pgdg100+1)) Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- ... world | postgres | UTF8 | en_US.utf8 | en_US.utf8 | postgres=# \c world You are now connected to database "world" as user "postgres". postgres=# \dt postgres=# select * from country limit 5;
creat per Joan Quintana Compte, agost 2021