Jak dodać bazę danych SQLite3 w kontenerze z docker compose?

0

Witam serdecznie.

Może mi ktoś powiedziec jak skonfigurowac docker-compose.yml, żeby używał bazy danych sqlite3? mój Dockerfile wyglada następująco:

FROM python:3.10.12
ENV PYTHONUNBUFFERED = 1
WORKDIR /code
COPY /var/docs/requirments.txt /code/
RUN pip install -r requirments.txt
COPY . /code/
CMD [ "python3", "manage.py" , "runserver", "0.0.0.0:9010"]
1

Nie rozumiem po co miałbyś mieć SQLite w kontenerze skoro w zamyśle jest to file-based rozwiazanie. Po co kombinować? 😛

0

Do testów jest mi potrzebne. Później będę używał bazy danych postgresql.

0

No to skoro Ci potrzebna tylko na cele testowe to nie lepiej dołączyć sobie bazę do rozwiązania zamiast wirtualizowac? Chyba, że musisz to zwirtualizowac to musisz podać definicje serwisu w swoim docker-compose a nie w dockerfile i wtedy mieć connection string ktorym uderzysz do bazy.

0

chodzi o to, ze na serwerze przechodza wszystkie testy a aplikacja i tak nie dziala prawidlowo.... musze to zwirtualizowac w dockerze i sprawdzic czy bedzie chodzic. Mozesz mi podac przykładowy docker-compose.yml zeby to przetestowac? ucze sie dopiero dockera i sam nie jestem w stanie tego zrobic.

7

Jeżeli uczysz się Dockera, to jest to doskonała chwila na to, by zrozumieć, że idealnym miejscem na kompaktowe bazy danych takie jak SQLite jest wolumen / zmapowany katalog, a nie przestrzeń kontenera.

services:
  your-container:
    [...]
	volumes:
	  - database:/database # dostosuj ścieżkę dla kontenera
	  
volumes:
  database:

Oczywiście nikt nie broni do Dockerfile dodać COPY some_db.db /database/some_db.db, ale nie jest to zgodne ze sztuką i tylko utrudnia cały proces zachowania danych w przypadku nowej wersji kontenera, a takie posunięcie jest tylko robieniem sobie kompletnie pod górkę, z kompletnie niezrozumiałych powodów.

0

Wklepuje komende sudo docker build . wszytko przechodzi. Potem biore numer contenera ktory został zbudowany i wpisuje sudo docker run #id-contneera i wyskakuje mi blad django.db.utils.OperationalError: unable to open database file. A moj docker-compose.yml wyglada nastepujaco:

version: "3.9"

services:
  your-container:
	volumes:
	  - db.sqlite3:/db.sqlite3 # dostosuj ścieżkę dla kontenera

volumes:
  volumes:
    database:

nie wiem może coś źle robie...

0

Docker compose odpalasz przez:

docker-compose -f docker-compose.yaml up -d
0
hubertsuder napisał(a):

Do testów jest mi potrzebne. Później będę używał bazy danych postgresql.

Jeden z najgorszych wyborów. Właściwie nic z doświadczeń nie da się przenieść
W SQLite kolumny nawet typów nie mają, ani prawdziwych rozmiarów.
NIC nie wytestujesz.

1

Jak już naprawdę chcesz czegoś do testow integracyjnych to dlaczego nie odpalisz sobie od razu testowego konteneru z PostgreSQL 😛

Mówią, że .NET taki zły, a masz test containers i lecisz 😅

EDIT:
https://dotnet.testcontainers.org/
Tutaj możesz poczytać o co kaman, ale fluent API Ci mówi co to robi, więc możesz to zrobić manualnie 😊

EDIT 2:
Nawet masz paczkę pod pythona 😂

0

+1 dla przedmówców. Postgresa odpala się banalnie w Dockerze, dajesz image i chyba 3 zmienne środowiskowe (domyślna baza, user i hasło) i bangla bez żadnej dodatkowej konfiguracji.

0
hubertsuder napisał(a):

Wklepuje komende sudo docker build . wszytko przechodzi. Potem biore numer contenera ktory został zbudowany i wpisuje sudo docker run #id-contneera i wyskakuje mi blad django.db.utils.OperationalError: unable to open database file. A moj docker-compose.yml wyglada nastepujaco:

version: "3.9"

services:
  your-container:
	volumes:
	  - db.sqlite3:/db.sqlite3 # dostosuj ścieżkę dla kontenera

volumes:
  volumes:
    database:

nie wiem może coś źle robie...

Kolega ci kazał zmapować wolumen, ale nazwał wolumen tak samo jak ścieżkę w kontenerze i się pogubiłeś, więc pokażę ci składnię na innym przykładzie:

version: 3.9
services: 
  your-container:
    volume:
      - your-volume:/path/in/container
volumes:
  your-volume:

To sprawi, że wolumen o nazwie your-volume będzie widoczny w kontenerze pod ścieżką /path/in/container. To jest ścieżka do folderu, a nie do pliku.

To oznacza, że dostaniesz tam pusty katalog i musisz sobie tam stworzyć lub skopiować swój plik do SQLite, jeśli twoja aplikacja tego nie robi sama.

Natomiast dołączam się do sugestii, abyś użył Postgresa.

Przykładowo tak:

version: 3.9
services:
  app:
    # tu to co masz dla tej twojej appki
    depends_on:
      - db
          
  db:
    image: 'postgres:16.1-alpine'
    container_name: db
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes: 
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

Ważne dla ciebie jest to, że:

  1. Możesz do kontenera przekazać stałe dane w zmiennych środowiskowych w sekcji environment. Ustawiasz w ten sposób użytkownika i hasło do Postgresa, ale również mógłbyś np. przekazać adres i port postgresa do swojej apki
  2. Kontenery uruchomione z jednego pliku docker-compose.yml są w jednej dockerowej sieci i "widzą" siebie nawzajem po swojej nazwie. Tak więc jeśli nazwiesz postgresa db w docker-compose'ie, to w aplikacji możesz się do niego połączyć po adresie hosta db (no i po domyślnym porcie 5432)
  3. depends_on określa jakie inne kontenery powinni być uruchomione zanim uruchomisz ten kontener. Tutaj to sprawi, że Docker uruchomi bazę (jeśli nie jest uruchomiona) przed tym, jak uruchomi apkę.
  4. Postgresa stawiasz inaczej niż swoją apkę, tj. używając image co oznacza, że pobierasz gotowca z repozytorium. Tutaj to jest obraz o nazwie postgres z tagiem wersji 16.1-alpine -

Poczytaj sobie tutaj https://hub.docker.com/_/postgres jakie zmienne środowiskowe możesz ustawić. Ja ci dałem jedynie użytkownika i hasło, co oznacza że dostaniesz bazę o tej samej nazwie co użytkownik. Ponadto te zmienne wpływają tylko na pierwsze uruchomienie, jak już się stan zapisze do wolumenu to nie zmienisz hasła tymi zmiennymi :p

1 użytkowników online, w tym zalogowanych: 0, gości: 1