![]()
A háttérfeladatok ütemezett futtatása a háttérszolgáltatások alapkövetelménye. A telepítés megszokása egyszerű volt – a feladatokat a szerverén kell meghatároznia crontab és hívd naponta. Nézzük meg, hogyan lehet hasznosítani cron miközben a Dockert használta a telepítéshez.
A szolgáltatásainak tárolása növeli a fejlesztői termelékenységet. Ezzel párhuzamosan elgondolkodtathatja, hogy a hagyományos rendszergazda hogyan viszonyul a Docker-fogalmakhoz. Több lehetősége van a használat során cron Docker konténerekkel, és az alábbiakban az alkalmasság sorrendjében feltárjuk őket. A folytatás előtt győződjön meg arról, hogy elkészítette az alkalmazás Docker-képét.
A Host Crontab használata
A legalapvetőbb, mindig felhasználhatja a cron a Docker Engine-t futtató gazdagép telepítése. Győződjön meg róla cron telepítve van, majd szerkessze a rendszerét crontab mint általában.
Te tudod használni docker exec parancs futtatásához egy meglévő tárolón belül:
*/5 * * * * docker exec example_app_container /example-scheduled-task.sh
Ez csak akkor működik, ha idő előtt biztos lehet a tároló nevében. Általában jobb egy új tárolót létrehozni, amely kizárólag a feladat futtatásához létezik:
*/5 * * * * docker run --rm example_app_image:latest /example-scheduled-task.sh
Öt percenként a rendszere cron A telepítés új Docker-tárolót hoz létre az alkalmazás képe alapján. Docker végrehajtja a /example-scheduled-task.sh szkript a tárolóban. A konténert megsemmisítik (--rm), amint a szkript kilép.
A Cron használata a konténerein belül
A gazdagép használata crontab megtöri a Docker tárolását, mivel az ütemezett feladatok kézi beállításokat igényelnek a rendszeren. Biztosítania kell cron telepítve van minden gazdagépre, amelyre telepít. Bár hasznos lehet a fejlesztésben, meg kell vizsgálni az integrációt cron lehetőség szerint a Dockerised szolgáltatásaiba.
A legnépszerűbb Docker alapképek nem tartalmazzák a cron démon alapértelmezés szerint. Telepítheti a Dockerfile majd regisztrálja jelentkezését crontab.
Először hozzon létre egy újat crontab fájl a kódalapon belül:
*/5 * * * * /usr/bin/sh /example-scheduled-task.sh
Ezután módosítsa a Dockerfile üzembe helyezni cron és regisztrálja a crontab – a következőképpen teheti meg ezt egy Debian-alapú képpel:
RUN apt-get update && apt-get install -y cron
COPY example-crontab /etc/cron.d/example-crontab
RUN chmod 0644 /etc/cron.d/example-crontab &&
crontab /etc/cron.d/example-crontab
Telepítjük cron és másolja a kódalapunkat crontab bele /etc/cron.d Könyvtár. Ezután módosítanunk kell az engedélyeket a crontab hogy biztosan hozzáférhető legyen cron. Végül használja a crontab parancs a fájl megismerésére a cron démon.
A beállítás befejezéséhez módosítania kell a kép parancsát vagy belépési pontját a fájl elindításához cron démon, amikor a konténerek futni kezdenek. Ezt nem lehet elérni a RUN színpad a Dockerfile mert ezek átmeneti lépések, amelyek nem maradnak fenn a kép felépítési szakaszán túl. A szolgáltatást a réteg felépítéséhez használt mulandó tárolón belül indítanák, nem pedig a kész képet futtató végső tárolókon.
Ha a tárolójának egyetlen feladata a futtatás cron – amelyet az alábbiakban bővebben megbeszélünk – hozzáadhatja ENTRYPOINT ["cron", "-f"] a te Dockerfile hogy előtérben indítsa el. Ha egy másik folyamatot kell tartania az előtérben, például egy webszervert, akkor létre kell hoznia egy dedikált belépési parancsfájlt (pl. ENTRYPOINT ["bash", "init.sh"]), és adjuk hozzá service cron start mint parancsot abban a fájlban.
A Cron elválasztása az alkalmazás szolgáltatásaitól
Az előző szakaszban leírt beállítások megvalósítása robusztusabb megoldást nyújt, mint a gazdagépre támaszkodni crontab. A cron Az alkalmazását kiszolgáló tárolók démonja biztosítja, hogy bárki, aki a Docker képet használja, automatikusan ütemezett feladatokat állítson be.
Ez mégis aggodalmak keveredését eredményezi. A tárolók két felelősséggel járnak: egyrészt az alkalmazás funkcionalitásának biztosítása, másrészt a megtartása cron életben és futtassa az ütemezett feladatokat. Ideális esetben minden tárolónak egy meghatározott funkcionalitási egységet kell biztosítania.
Ahol csak lehetséges, futtassa a cron feladatokat külön tárolóban az alkalmazásához. Ha webes háttérképet hoz létre, ez azt jelentené, hogy az egyik tároló biztosítja a webkiszolgálót, a másik pedig fut cron az előtérben.
E szétválasztás nélkül nem használhat olyan hangszerelőt, mint a Docker Swarm vagy a Kubernetes az alkalmazás többszörös másolatának futtatásához. Mindegyik konténer futna a maga cron démon, az ütemezett feladatok többszöri futtatását okozva. Ezt enyhíteni lehet egy megosztott Docker-kötetbe kötött zárfájlok használatával. Mindazonáltal fenntarthatóbb a gyökérprobléma kezelése és egy külön tároló bevezetése a cron démon.
Általában azt szeretné, ha mindkét tároló az alkalmazás Docker képén alapulna. Mindegyiknek kapcsolatra van szüksége a szolgáltatás Docker köteteihez és hálózataihoz. Ez biztosítja a cron a konténer azonos környezettel rendelkezik az alkalmazási konténerrel, az egyetlen különbség az előtér folyamata.
Ez nem egy gyors és gyors szabály – egyes projektekben az ütemezett feladatok triviális szkriptek lehetnek, amelyek a kódbázistól függetlenül működnek. Ebben az esetben a cron A tároló minimális alapképet használhat, és megszünteti a felesleges perifériás erőforrásokkal való kapcsolatokat.
A telepítés egyik módja külön cron konténer lenne használni docker-compose. Megadnád a cron konténer extra szolgáltatásként. Használhatja az alkalmazás alapképét, felülírva a belépési parancsot a cron démon. Használata docker-compose egyszerűsíti a tároló csatolását az összes szükséges kötethez és hálózathoz.
version: "3"
services:
app:
image: demo-image:latest
volumes:
- data:/app-data
cron:
image: demo-image:latest
entrypoint: /bin/bash
command: ["cron", "-f"]
volumes:
- data:/app-data
volumes:
data:
A fenti példa alapján egy konténer szolgálja az alkalmazásunkat a kép alapértelmezett belépési pontjának felhasználásával. Győződjön meg róla, hogy ez megtörténik-e nem indítsa el a cron démon! A második tároló felülírja a futtatni kívánt kép belépési pontját cron. Amíg a kép még megvan cron telepítve és a crontab konfigurálva, használhatja docker-compose up hogy előhozza az alkalmazásodat.
A Kubernetes Cron Jobs használata
Végül nézzünk meg egy egyszerű példát az ütemezett feladatok futtatására a Kubernetesen belül. A Kubernetes sajátjaival érkezik CronJob erőforrás, amelyet felhasználhat a manifestjeiben.
Nem kell telepítenie cron a képen, vagy speciális tárolókat állíthat be, ha Kubernetes-t használ. Legyen tisztában ezzel CronJob egy béta erőforrás, amely a jövőbeni Kubernetes kiadásokban változhat.
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-cron
namespace: my-namespace
spec:
schedule: "*/5 * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: my-container
image: my-image:latest
command: ["/bin/bash", "/my-cron-script.sh"]
restartPolicy: OnFailure
Új létrehozásához alkalmazza a fenti jegyzéket a fürtjére cron ami futni fog /my-cron-script.sh öt percenként. A gyakoriságot szabályként adják meg cron meghatározása a schedule írja be az erőforrást spec.
Testreszabhatja a ConcurrencyPolicy nak nek ellenőrzik, hogy Kubernetes lehetővé teszi a munkáinak átfedését. Alapértelmezés szerint Allow de megváltoztatható Forbid (megakadályozza, hogy új munkahelyek induljanak, amíg már létezik) vagy Replace (megszüntet egy meglévő munkát, amint egy új megkezdődik).
A Kubernetes beépített erőforrásának használata az ajánlott módszer az ütemezett feladatok kezelésére a fürtökön belül. Könnyen hozzáférhet a munkanaplókhoz, és nem kell aggódnia a tárolók használatra való előkészítésével kapcsolatban cron. Csak egy Docker-képet kell készítenie, amely mindent tartalmaz, amelyre a feladatok futtatásához szüksége van. A Kubernetes az Ön által megadott ütemezés szerint kezeli a konténerpéldányok létrehozását és megsemmisítését.
