Docker beállítása


A különféle kurzus-tooling Docker-image-ként van élesítve.

A tooling minden egyes darabjához szükség van egy Dockerfile-ra, amely meghatározza, hogyan épül fel a gép. A repositoryd gyökérkönyvtárában kell lennie, és Dockerfile legyen a neve.

A Dockerfile-nak a lehető legkisebb image-et kell létrehoznia, amelyre a toolingnak a helyes és gyors működéshez szüksége van. A Bevált gyakorlatok oldalunk rengeteg tippet kínál, amelyek segítenek elérni ezt a célt.

Végrehajtás

Időtúllépések

A tesztfuttató minden megoldáshoz egy 20 másodperces időablakra 100% CPU-t és 3 GB memóriát kap. 20 másodperc után a folyamat leáll, és időtúllépést jelent a 408-as hibakóddal.

Note

Erősen ajánljuk, hogy kövesd a Teljesítményre vonatkozó bevált gyakorlatok dokumentumunkat, hogy csökkentsd az időtúllépések esélyét.

Stdout/stderr

Egy tooling-futtatás legfeljebb egy megabájtnyi stdoutot és stderr-t állíthat elő. Ha ennél többet állít elő, a folyamat a 413-as hibakóddal leáll.

Minden futtatás stdout és stderr tartalmát fájlokban tároljuk. Írhatsz egy results.out fájlt a kimeneti könyvtárba, amely hibakeresési információkat tartalmaz.

Caution

Jelenleg a karbantartók nem tudják megtekinteni ezeknek a fájloknak a tartalmát.

Eredmények

Az eredményfájl nem lehet nagyobb 500 kilobájtnál (a stack trace-eket stb. is beleértve). Ha a fájl ennél nagyobb, a tooling-futtatást a 460-as hibakóddal leállítjuk.

Konfiguráció

Minden megoldás 100%-os gépi erőforrásokat kap egy húsz másodperces időablakra. 20 másodperc után a folyamat leáll, és időtúllépésként jelentkezik.

Egyes eszközök (kis) eltéréseket igényelnek az alapértelmezett konfigurációtól. Ilyen esetben ezeket a Tooling Invoker repositoryban található tools.json fájlban konfiguráljuk.

Hálózat

Az eszközök internet-hozzáférés nélkül futnak. Két különböző konfigurációt használhatsz:

  1. none. Ez letiltja a konténeren belüli hálózati eszközt.
  2. internal. Ez hozzáad egy hálózati eszközt a konténeren belül, de a hálózatnak nincs hozzáférése semmi külsőhöz.

A különböző nyelvek eltérő konfigurációkkal teljesítenek jobban vagy rosszabbul (pl. a Ruby 2x gyorsabb none esetén. Az Elixir 12x gyorsabb internal esetén.

Helyben kísérletezhetsz a --network kapcsolóval, amikor a dockert futtatod. A --network none alapértelmezés szerint támogatott. A belső hálózat használatához először futtasd a docker network create --internal internal parancsot a hálózat létrehozásához, majd a konténer futtatásakor használd a --network internal kapcsolót.

Memória

A nyelvek beállíthatják a feladataik futtatásához szükséges maximális memóriát. Ha ezt a lehető legalacsonyabbra állítjuk, több feladatot tudunk gyorsabban párhuzamosan futtatni. Azt is jelenti, hogy akik visszaélésszerűen próbálják használni a memóriát, nem járhatnak sikerrel. A különböző nyelvek nagyon eltérő maximális memóriahasználatot igényelnek. Érdemes és nagyra értékeljük, ha benchmarkolod egy docker run végrehajtását, hogy megállapítsd, mennyi memóriát használ maximálisan.

A memóriát meg kell adni egy számmal, amelynek utótagja b, k, m vagy g, jelezve a bájtot, kilobájtot, megabájtot vagy gigabájtot.

A Docker futtatása helyben

A fenti beállításokat ezzel a paranccsal tesztelheted:

docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/

Dockerfile szerkesztése

A Dockerfile-ok minden módosításához a @exercism/maintainers-admin csapat PR-jóváhagyása szükséges, hogy elkerüljük biztonsági sebezhetőségek bevezetését.