Dockerizace! (zatím alespoň pro lokální vývoj) #37
Open
borek
wants to merge 6 commits from dockerizace
into master
Loading…
Reference in new issue
There is no content yet.
Delete Branch 'dockerizace'
Deleting a branch is permanent. It CANNOT be undone. Continue?
Téměř určitě jsem porušil nějaké good practices a téměř určitě něco nefunguje. Nemělo by ale (snad) být rozbité nic okolo. Co mě napadlo jsem vyzkoušel, ale nemám zatím tolik představu, co se může rozbít.
Co to dělá:
docker-compose.yml
specifikuje, že chceme kontejner pro web, který je závislý na kontejneru s PostgreSQL dbweb
se buildí zDockerfilu
, 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 localhostadb
je zpostgres:13-bullseye
a má nastavené nějaké parametry, svoje data ukládá jako docker volumeDockerfile
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 vdb
, podívá se jestli jsou v něm testdata a když ne, vygeneruje, spustí command z compose (i.e. webserver)mamweb/settings.py
vybere docker settings podle cesty (jako doteď), vyberemamweb/settings_docker.py
, které by se mělo chovat ve většině stejně jakomamweb/settings_local.py
, ale používat jako DB Engine Postgres ve vedlejším kontejneru, aby se chovalo stejně jako_test
a_prod
Ještě by to možná chtělo si pořídit
.dockerignore
.Já jsem to zatím netestoval u sebe, pár pointů čistě ze čtení
Náhodou jsi testy spouštět nezkoušel (
make/test
)? Já taky nemám představu, co všechno se může rozbít :-) (Naše testy rozhodně nepokrývají moc funkcí, spíš různé drobnosti, takže když projdou, tak to nic neznamená, ale když ne, tak snad půjde snadno zjistit, kde je chyba…)Jidáš to trochu zkoušel testovat před týdnem, ale nevím, co všechno zkoušel a jak…
Nechceš to spíš připsat přímo do těch souborů, případně do
docs/
? Myšlenka za tím je, že až jednou přijde nový a zmatený org, tak spíš nebude procházet dávné pull requesty za účelem pochopení kódu. Díky za popsání!To vypadá OK, jen navrhuji rovnou „naincludovat“
settings_local
(klidně prostěfrom mamweb.settings_local import *
) a přepsatDATABASES
(případně udělat další relevantní změny), ať se zmenší šance, že ta nastavení budou divergovat. Settings jsou ve většině případů obyčejné Pythoní typy (slovníky, pole, stringy, skaláry, …)(Je možné, že se běžení v Dockeru dá zjistit nějak víc přímo, ale tohle je rozhodně good enough a pochopitelné, tak bych to víc neřešil.)
Teď zkusil, krásně selžou. 😁 Třeba se někdy dostanu k zjišťování, proč..
V souborech komentáře jsou, ale přidat to do
docs/
dává smysl.Velmi dává smysl, udělám.
Mně právě přišlo, že když se podle toho rozhoduje
settings_?
už teď, tak nebudu ani zkoumat, jak to udělat jinak.Zkusil jsem
make/test
. Zkapou všechny testy zapi.tests.test_skola_autocomplete.OrgSkolyAutocompleteTestCase
(test_skoly_pocet
,test_skoly_vraceny
atest_view_funguje
).Vždycky první na:
a pak
Nějaký tip, co s tím? Asi hlavně – má být
Skola
JSON serializable? Není mi jasné, jestli hledat "proč není serializable, když má být", nebo "proč se ji to snaží serializovat, když by nemělo".. nebo naopak začít odzadu a řešit tosekizai
?Jako mně to mimo docker funguje, takže bych tipoval, že někde chybí nainstalovaná/přidaná nějaká aplikace…
Myslím, že by to měl dělat
django_rest_framework
, který by dokonce měl být nainstalován a vINSTALLED_APPS
… Tak nevím.Zamergeoval jsem tam main s novějšími verzemi knihoven (např. Django 4 místo 3). A teď mi to funguje…
Nikoliv, o tuhle serializaci (
/api/autocomplete/skola
) se django-autocomplete-light myslím stará přímo (ostatně, seializovat školy do JSONu umí Django přímo, vizte třeba vapi/views/exports.py
nebo při./manage.py dumpdata …
).Hm, nicméně ta dokumentace není odnikud odkázaná. Asi se to v návodu na dokumentaci nepíše¹, ale zdá se mi, že buď je potřeba do
docs/index.rst
přidat jméno souboru s dokumentací (pak bude v obsahu)o ² odkázat z nějakého vhodného místa (pomocí:ref:`nadpis`
, příklad třeba na ř. 105docs/vyvoj.rst
.)¹Skvělá příležitost návod rozšířit a pomoci tak budoucím webařům :-P
²Tady mi
tea
nějak zblbla, asi je tu rozbitý komentář, pardon…Postřeh dneska ze sprchy: ty kontejnery (resp. jejich poskládání) by ve výsledku možná bylo lepší mít dva: pro nasazení a pro vývoj.
Mít spoustu vývojových nástrojů (sphinx, graphviz, …) v produkčním kontejneru zabírá místo (a potenciálně zvětšuje potenciál pro útok) a nejspíš i bude zpomalovat rebuild produkčního kontejneru (což asi nebolí moc, ale i tak je možná lepší se tomu vyhnout…)
Zatím mám pocit, že ta
správnálepší varianta je mít produkční-ish kontejner a ten zabalený ve vývojovém, který bude mít ty nástroje navíc (+možná upravenou konfiguraci?). (A nevím, co má reálně běžet na testwebu, ale ty vrstvy IIRC umí být dost lightweight, takže asi hrozí jen zběsilý dependency hell…)Neříkám, že je to potřeba zohledňovat v rámci tohohle PR (rozhodně není), ale napadlo mě to a chci to někam poznamenat a tohle znělo jako příhodné místo. Není to kritika vůbec ničeho :-)