Docker: PostgreSQL

De wikijoan
Salta a la navegació Salta a la cerca

Referències

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