Ga naar hoofdinhoud

Online zetten: je databases in één map

Je databases staan nu los in /app, tussen je code. Straks wil je ze buiten de container bewaren, en dat gaat het makkelijkst als ze samen in één map staan. Je zet ze in een map data.

In main.py​

Vervang in VS Code met Ctrl+H overal SqliteDict(" door SqliteDict("data/, met Replace All. Dan staat er SqliteDict("data/gastenboek.db"), SqliteDict("data/gebruikers.db"), en zo voor elke database.

SqliteDict maakt een bestand, maar geen map. Die maak je zelf, als hij er nog niet is. Zet bovenaan, bij je andere imports:

import os

En onder de imports, boven app = FastAPI():

os.makedirs("data", exist_ok=True)

os.makedirs maakt de map data in de map waar je server start. exist_ok=True betekent: bestaat hij al, dan is dat goed, geef geen fout.

In .dockerignore​

Zet data/ erbij:

.venv
__pycache__
.git
*.db
data/

*.db geldt in .dockerignore alleen voor bestanden direct in je map, niet voor bestanden in data. Zonder data/ gaan je testdatabases uit die map mee het image in. In .gitignore hoeft niets bij: daar geldt *.db ook voor bestanden in een map.

Bouwen en kijken​

De container uit les 17 draait nog met het oude image. Gooi hem weg, bouw opnieuw en start een nieuwe:

docker rm -f gastenboek
docker build -t gastenboek .
docker run -d --name gastenboek -p 8000:8000 gastenboek

Maak een account en schrijf een bericht. Kijk dan wat er in de map data in de container staat:

docker exec gastenboek ls data

docker exec voert een commando uit in een container die al draait. Hier is dat ls data, in /app.

De oude bestanden uit les 11, naast main.py in je projectmap, gebruikt je site niet meer. Je mag ze weggooien.

Zet de veranderingen in git. Alleen main.py en .dockerignore zijn veranderd; de databases in de container komen niet in je projectmap.

git add main.py .dockerignore
git commit -m "Databases in de map data"
git push
Controlevraag
Je start je project weer zonder Docker, in Ubuntu met fastapi run, zoals in les 11. Waar komen de databases nu?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

Er gaat iets mis​

The directory does not exist​

Bij het eerste verzoek dat een database opent, geeft je site een 500, en docker logs gastenboek eindigt met:

RuntimeError: Error! The directory does not exist, data

Oorzaak: de map data bestaat niet, want de regel met os.makedirs ontbreekt. SqliteDict maakt zelf geen map.

Oplossing: zet os.makedirs("data", exist_ok=True) onder je imports, en import os erbij. Bouw opnieuw.

Een database staat nog naast main.py​

Je site werkt, maar docker exec gastenboek ls toont nog een .db in /app, naast main.py.

Oorzaak: een SqliteDict("…") zonder data/ ervoor. Als root mag je site overal schrijven, dus je ziet nog geen fout. In de volgende les wel.

Oplossing: zoek in main.py naar SqliteDict(" zonder data/ erachter, verbeter het, en bouw opnieuw.

Je testberichten staan in de container​

Een nieuwe container begint niet leeg, maar met de berichten die je zonder Docker schreef.

Oorzaak: data/ staat niet in .dockerignore. Dan kopieert COPY . . de map data uit je project mee het image in, met je testdatabases.

Oplossing: zet data/ in .dockerignore, en bouw opnieuw.

Door naar les 19: niet als root.