[Python] script que haga lecturas e inserciones de vez en cuando en db

B

Hola!

Necesito hacerme un script en python que haga lecturas e inserciones de vez en cuando en BBDD, postgre por ejemplo, me gustaría dockerizarlo para poder ejecutarlo rápidamente, no quiero montar fastapi o django porque es para una chorrada y tampoco quiero matar moscas a cañonazos.

Me gustaría al final tener una imagen y generar el contenedor con la opción de que se borre cada vez que se pare, pero ¿cómo podría hacerlo para no perder los datos cada vez que se borre el contenedor? He visto que se usan como volúmenes, pero estoy muy perdido con eso.

Aclaro que estoy en Windows.

¿Tenéis algún ejemplo por ahí guardado que haga más o menos lo que quiero?

Actualizo para dejar el repositorio con el código por si le sirve a alguien

Báiscamente es un script que me informe de los seguidores que pierdo o gano en Twitter y me avise por telegram.

B

Básicamente tienes dos formas de persistir los datos:

  1. Crear un volumen, si levantas el docker con el volumen y no existe, te lo creará:
    docker -v myvol:/ruta/en/contenedor
  2. Bindear una carpeta del host:
    docker -v /ruta/en/host:/ruta/en/contenedor

https://docs.docker.com/storage/volumes/

Pongamos que tenemos el codigo el "/home/foo/super_code":

docker run -it --rm --name my-super-script -v /home/foo/super_code:/usr/src/mysuperapp -w /usr/src/mysuperapp python:3 python super_script.py
  • Se ejecuta el comando "python super_script.py"
  • Se le da el nombre al contenedor "my-super-script"
  • Se usa la imagen de "python:3"
  • Se especifica un volumen que es un bind a "/home/foo/super_code" y lo monta en el contenedor en "/usr/src/mysuperapp"
  • Estable el directorio de trabajo en "/usr/src/mysuperapp"
2 2 respuestas
B

#2 gracias tío, voy a darle a ver qué sale

1
JuAn4k4

También lo puedes hacer con docker compose.
O levantarte PostgreSQL a parte y conectarte a él desde tu app en docker. (Puedes hacerlo con docker o sin docker o externo).

1 1 respuesta
isvidal

Mongo tiene servicios cloud gratis que para lo que quieres te vale. La persistes arriba y lo unico que dockerizas es el scrapper de python.

https://www.mongodb.com/cloud

Este es el que hice yo para sacar data para Astrale con beautifulSoup4:

https://github.com/jvidalv/python-scrapers/tree/master/scrapers/astrale

Seguramente el fichero de docker sea una mierda, pero aun sabia menos que ahora que ya es decir.

1 1 respuesta
wdaoajw

Metes un cronjob para que lance tu veneno cuando quieras.

El cronjob únicamente hará:

docker run -v <volumen> --rm <imagen>

Esto levanta un contenedor que monta el path de tu equipo que le digas en el path del contenedor que me digas, y el --rm borra el contenedor cuando esté se para

1
B

Ya lo tengo chavales

#2 al final he mapeado un volumen a local

#4 lo he hecho con un docker compose y 2 dockerfiles uno para el script de python y otro para el postgre, y consigo conectarme también desde mi equipo local a través de datagrip mapeando el puerto 5432

#5 ni puta idea tenía de lo de mongo, para la siguiente lo uso seguro, así me ahorro tener los datos en local muchas gracias. Estuve el otro día viendo tu github, es una pasada

¿Sabéis cómo hacer que el docker compose up borre el contenedor cuando haga el down?

Muchas gracias a todos, me habéis sido de mucha ayuda. Cuando lo tenga acabado os comparto el código por si os sirve o tenéis curiosidad

1 respuesta
Unrack

#7 docker-compose down. Si haces stop no los borra.

1 2 respuestas
B

#8 gracias!

1 respuesta
JuAn4k4

#8 #9 Depende de cómo estén definidos los volúmenes los borrará o no.

2 respuestas
B

#10 he creado el volumen así:

$ docker volume create --name=postgresql-volume

Y tengo esto en el docker compose:

version: "3.8"
services:
  app :
    build: ./app/
  db:
    build: ./database/
    volumes:
    - postgresql-volume:/var/lib/postgresql/data
    ports:
    - "5432:5432"
volumes:
  postgresql-volume:
    external:
      true

He probado a borrar el contenedor y hasta la imagen y me respeta los datos, ni idea de dónde se guarda el volumen ni qué hacer con él cuando tenga que formatear xddd pero borrarlo no lo borra

2 respuestas
Unrack

#10 #11 No estoy muy seguro de cosas avanzadas pero para tocar los volumes se tira del flag -v.

wdaoajw

#11 dentro de /var/docker/volumes te crea un directorio que luego monta en los contenedores que hacen referencia a ese volumen que tú has creado previamente

El flag external lo único que le indica a compose es que el volumen que quieres montar ya existe previamente.

1 1 respuesta
B

#13 gracias, pero en windows existe /var/docker?

He ido a: C:\ProgramData\Docker\volumes y solo hay un fichero llamado metadata

2 respuestas
wdaoajw

#14 en Windows creo que lo meten en el directorio de Hyper V

JuAn4k4

#14 Con el comando docker volume puedes hacer inspect para ver dónde está y tal.

1 respuesta
B

#16 lo he hecho, pero me dice que está en /var/lib etc estoy en windows pero son linux containers, he entrado a esa ruta en wsl y no encuentro nada, y está funcionando, porque he probado a borrar el contenedor y la imagen y al volverlo a crear los datos siguen existiendo

No sé si perder mucho más tiempo en esto, puedo sacarme un backup de la base de datos cuando vaya a formatear y corriendo, total es para un bot de telegram que solo voy a usar yo

1 respuesta
JuAn4k4

#17 docker-compose down -v? No me acuerdo de cual era el parámetro para borrar volúmenes externos.
Sino docker volume rm

1 respuesta
B

#18 no, si no quiero borrarlo, solo me gustaría saber dónde está físicamente para copiármelo en caso de formatear el pc

1 respuesta
JuAn4k4

#19 el Mountpoint te pone /var/lib ?

Has mirado aquí ?
C:\Users\Public\Documents\Hyper-V\Virtual hard disks

1 respuesta
B

#20 sí tío, pero dentro no hay nada xddd

1 respuesta
Unrack

#21 Estarán en la red wsl? Prueba a meterte en el explorador directamente

\\wsl$\debian\var\lib\...

Echa un ojo a esto a ver.

1 respuesta
B

#22 joé, tampoco

1 respuesta
Unrack

#23 Al menos te ha salido el árbol de directorios? Creo que esto funciona con wsl2

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
1 respuesta
B

#24 llego hasta ahí, vamos que encuentra la ruta, pero no hay nada dentro

EDIT: no, hasta aquí sí llega \wsl$

1 respuesta
Unrack

#25 Pues acabo de crear yo uno y aquí lo tengo.

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\postgresql-volume
1 respuesta
B

#26 ¿cómo lo has creado?
así?

docker volume create --name=postgresql-volume
1 respuesta
Unrack

#27 Si he intentado hacer lo mismo.

1 respuesta
B

Prueba con

docker inspect <NOMBRE_CONTENEDOR>

en el apartado "Mounts" debería de decirte donde esta.

1 respuesta
B

#28 #29 me vais a perdonar por el retraso, pero no tenía docker con el flag de wsl activo, ahora sí me muestra el volumen :man_facepalming:

muchas gracias, no sabéis lo que me habéis ayudado y lo que he aprendido.

Lo dicho, cuando haga la parte del bot comparto el código

2 1 respuesta