Dockerizace! (zatím alespoň pro lokální vývoj) #37
					 6 changed files with 129 additions and 0 deletions
				
			
		
							
								
								
									
										36
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							|  | @ -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
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							|  | @ -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
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								docker_entrypoint.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -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
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								docs/docker.rst
									
									
									
									
									
										Normal file
									
								
							|  | @ -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`` | ||||
|  | @ -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
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								mamweb/settings_docker.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -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…
	
		Reference in a new issue