Dockerizace! (zatím alespoň pro lokální vývoj) #37

Open
borek wants to merge 6 commits from dockerizace into master
  1. 36
      Dockerfile
  2. 23
      docker-compose.yml
  3. 19
      docker_entrypoint.sh
  4. 15
      docs/docker.rst
  5. 3
      mamweb/settings.py
  6. 33
      mamweb/settings_docker.py

36
Dockerfile

@ -0,0 +1,36 @@
FROM python:3.9.18-slim-bullseye
# set work directory
WORKDIR /usr/mamweb-docker
# set environment variables
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install dependencies
RUN apt-get update && apt-get install -y \
libpq-dev \
gcc \
locales \
imagemagick \
netcat \
postgresql-client
RUN pip install --upgrade pip
COPY ./requirements.txt .
COPY ./constraints.txt .
RUN pip install -r requirements.txt
# allow correct locales
RUN sed -i '/cs_CZ.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen
ENV LANG cs_CZ.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL cs_CZ.UTF-8
# copy project
COPY . .
# create test data once db is ready
RUN chmod +x /usr/mamweb-docker/docker_entrypoint.sh
ENTRYPOINT ["/usr/mamweb-docker/docker_entrypoint.sh"]

23
docker-compose.yml

@ -0,0 +1,23 @@
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/usr/mamweb-docker
ports:
- 8000:8000
depends_on:
- db
db:
image: postgres:13-bullseye
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=mam-web
- POSTGRES_PASSWORD=RoEGG5g7&b # Random generated string corresponding with Django settings
- POSTGRES_DB=mam_docker
volumes:
postgres_data:

19
docker_entrypoint.sh

@ -0,0 +1,19 @@
#!/bin/sh
echo "Waiting for Postgres..."
while ! nc -z "db" "5432"; do
sleep 0.1
done
echo "PostgreSQL started"
PGPASSWORD="RoEGG5g7&b" # Random generated, corresponds to the one in docker-compose.yml
if psql "postgresql://mam-web:$PGPASSWORD@db:5432/mam_docker" -t -c '\dt' | cut -d \| -f 2 | grep -qw "seminar_cisla"; then
echo "\nExistuje tabulka 'seminar_cisla' v db, testdata pravděpodobně byla vygenerována.\n"
else
python ./manage.py testdata
python ./manage.py loaddata data/*
fi
exec "$@"

15
docs/docker.rst

@ -0,0 +1,15 @@
Lokální vývoj pomocí dockeru
============================
Přijde vám standardní zprovoznění painful? Docker comes to the rescue. Stačí mít nainstalovaný ``docker`` a spustit ``docker compose up``.
Co se děje under the hood
-------------------------
- ``docker-compose.yml`` specifikuje, že chceme kontejner pro web, který je závislý na kontejneru s PostgreSQL db
- ``web`` se buildí z ``Dockerfilu``, mountuje si kořen repa jako svůj volume (takže vidí změny), na konci spouští webserver a vysatvuje ho na port 8000 localhosta
- ``db`` je z ``postgres:13-bullseye`` a má nastavené nějaké parametry, svoje data ukládá jako docker volume
- ``Dockerfile`` staví ``web`` na pythonu3.9 a debianu bullseye (mělo by odpovídat gimlimu) - nainstaluje dependencies, nastaví locale a entrypoint (co se má vykonat při spouštění kontejneru)
- ``docker_entrypoint.sh`` počká na Postgres ready v ``db``, podívá se jestli jsou v něm testdata a když ne, tak je vygeneruje, pak spustí command z compose (i.e. webserver)
- ``mamweb/settings.py`` vybere django settings podle cesty (jako doteď), vybere ``mamweb/settings_docker.py``, které importuje všechno z ``mamweb/settings_local.py``, přepíše jen ``DATABASES`` a ``SECRET_KEY``, aby se jako DB Engine používal Postgres ve vedlejším kontejneru, aby se celý web choval stejně jako ``_test`` a ``_prod`` (``_local`` aktuálně používá DB Engine sqlite3, které se v něčem chová trochu rozdílně)
- kontejner ``web`` se musí nějak připojovat k postgresu v ``db``, k tomu slouží user ``mam-web``, náhodně vygenerované heslo (v ``docker-compose.yml`` a ``docker_entrypoint.sh``, musí se shodovat), db se jmenuje ``mam_docker``

3
mamweb/settings.py

@ -14,6 +14,9 @@ if "mamweb-test" in os.path.abspath(__file__):
elif "mamweb-prod" in os.path.abspath(__file__):
from .settings_prod import *
elif "mamweb-docker" in os.path.abspath(__file__):
from .settings_docker import *
else:
from .settings_local import *

33
mamweb/settings_docker.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
#
# Docker nastaveni settings.py
#
# Pro vyber tohoto nastaveni muzete pouzit tez:
# DJANGO_SETTINGS_MODULE=mamweb.settings_docker ./manage.py ...
#
# Import common settings
from .settings_common import * # zatim nutne, casem snad vyresime # noqa
from mamweb.settings_local import * # Import all the settings for local development
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'EZfSzeuDCycKr5ZjiCQ^45ZqFU@8Ke#YDwn9ThqerfEpu^yV#p'
# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'mam_docker',
'USER': 'mam-web',
'PASSWORD': 'RoEGG5g7&b', # Random generated string corresponding with docker-compose
'TEST': {
'NAME': 'mam-docker-testdb',
},
"HOST": "db",
"PORT": "5432",
},
}
Loading…
Cancel
Save