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.