A Docker kitűnően használható parancssoros programok futtatására. Ebben a bejegyzésben azt járom körül, hogy mire kell ilyenkor figyelni és mutatok pár konkrét példát, amiket az elmúlt pár hónapban én is használtam.

Velem sokszor előfordul, hogy ki szeretnék próbálni dolgokat vagy csak egy-egy specifikus feladathoz kéne telepítenem valamilyen eszközt a gépemre. Az adott eszközzel még nem is lenne általában gond; az igazi problémát az adott eszköz függőségei okozzák. Ha el szeretnénk távolítani az adott eszközt, akkor az adott eszközzel együtt szeretnénk eltávolítani annak nem használt függőségeit is.

Bár a csomagkezelőknek vannak olyan kapcsolói, amelyek eltávolítják a csomaggal együtt a függőségeket is, amik nem szükségesek más csomaghoz, csakhogy így eltávolíthatunk számunkra fontos csomagokat, melyek pechünkre éppen az adott eszköz függőségei voltak.

Természetesen van olyan is, amikor az adott csomag egy olyan függőséget hoz magával, ami ugyan van a gépünkön, csak nem a megfelelő a verziója. Ilyenkor a többi, ettől függő eszközünk hibásan vagy eltérően működhet, ráadásul a csomagkezelő nem fogja visszarakni a korábbi verziót az adott csomag eltávolítása után.

A Dockert megelőző időben átlagosan félévente újra kellett installálni a gépemet, mivel elég sokat kísérletezek új eszközökkel. Amióta Dockert használok, erre nincs szükségem.

Nézzünk pár példát, hogy hogyan tudod egyszerűbbé tenni az életed Docker segítségével.

Ebben a blogbejegyzésben azt nézzük meg, mire kell figyelni, ha parancssoros alkalmazásokat szeretnénk Dockeren belül futtatni.

Ahelyett, hogy azt írnánk hogy parancs, azt fogjuk írni, hogy docker run [kapcsolók] [image]. Amennyiben paramétereket is kell megadni, akkor a parancs [paraméterek] helyett azt fogjuk írni, hogy docker run [kapcsolók] [image] [paraméterek] . Tehát egyszerűen lecseréljük a rövid parancsot a hosszabb dockereres megfelelőjére. Amennyiben sokat használunk valamit, akkor érdemes egy aliast rátenni, így tényleg olyan lesz, mintha a parancsot írnánk be, holott a háttérben sok minden más egyéb is meg fog történni.

Nézzük meg röviden, hogy milyen docker run kapcsolókra lesz szükségünk, ha parancssoros alkalmazásokat futtatunk.

Egyik nagyon fontos kapcsoló a -it, mely lehetővé teszi, hogy a host gép terminálja fogadjon és küldjön adatokat. Ettől fognak megjelenni a kimeneten a karakterek és ez teszi lehetővé, hogy a billentyűzet parancsokat is fogadja a parancssoros alkalmazás. Ez természetesen nem egy kapcsoló, hanem kettő mégpedig az --interactive és a --tty rövidített változata.

Praktikus, ha a parancs futtatása után a Docker nem őrzi meg az adott konténert, mert nem fogjuk azt többet futtatni. Ezt a --rm kapcsolóval tudjuk megtenni, ami automatikusan törli a konténert.

Végül beszélnünk kell a -v vagy --volume kapcsolóról, ami lehetővé teszi azt, hogy a konténeren belül található könyvtárakat elérhetővé tegyük a host gépen is. A legtöbbször az aktuális könyvtárat szoktuk a konténeren belül található egyik könyvtárhoz kapcsolni. Ezért látható a $(pwd) karaktersor, amely nem más mint a pwd parancs eredménye, ami az aktuális könyvtár teljes útvonalát adja vissza.

A $(pwd) csak PowerShell-ben működik Windows-on. A sima cmd vagy GitBash más megoldást kíván. A legegyszerűbb, hogy ehelyett ilyenkor beírod a könyvtár teljes elérési útvonalát.

Figyelj arra, hogy mind az OSX, mind a Windows operációs rendszereken nem minden könyvtár mappelhető szabadon, de ha a saját könyvtáradban állsz, akkor nagy valószínűséggel nem lesz probléma.

Akkor nem marad más hátra, mint megnézni egy pár konkrét példát, amiket én az elmúlt hónapokban használtam.

Video átalakítás

Valamikor réges régen tartottam egy előadást “Hogyan legyél jó programozó öt egyszerű lépésben címmel”, aminek a felvétele elérhető volt a Ustream szerverén. A hosszú évek alatt azonban megváltozott a világ és bár a videó elérhető maradt, sajnos csak egy olyan kódolással, amit már nem képes a böngészőm megjeleníteni. Ezért aztán letöltöttem a videót és átkódoltam, majd feltöltöttem a vimeo-s tárhelyemre. Az átkódoláshoz a ffmpeg programot használtam, amit nem kellett telepítenem a gépemre, elég volt kiadni a következő parancsot:

docker run --rm -it -v $(pwd):/data vimagick/ffmpeg -i video.mov video.mp4

Weboldal másolás

Van olyan, amikor szükségem van egy-egy oldal teljes másolatára. Ilyenkor a httrack programot szoktam használni, ami nincs a gépre telepítve, hanem annak is a dockerizált verziójával dolgozom:

docker run --rm -it -v $(pwd):/app -e HTTRACK_URI=https://example.com ralfbs/httrack

Halott linkek ellenőrzése

Érdemes néha ránézni a weboldalunkra, hogy vannak-e rajta halott vagy hibás linkek. Ezt is meg tudjuk tenni egy egyszerű parancs segítségével:

docker run --rm -it dcycle/broken-link-checker:2 -o html -r 3 https://example.com > check.html

Ez a parancs készít egy check.html fájlt, amiben a hibás linkek lesznek megtalálhatóak. A -r 3 kapcsolót kihagyhatjuk, ha teljes riportot szeretnénk.

RAR fájl kicsomagolása

Tudom, hogy a rar formátum nagyon népszerű volt valamikor korábban, de bevallom férfiasan, hogy lassan 15 éve csak akkor van szükségem rá, ha valamelyik tanítványom ilyen fájlt küld. Ilyenkor jön jól a következő parancs:

docker run --rm -it -v $(pwd):/files maxcnunes/unrar unrar x MY_FILE.rar

Saját image készítése

Természetesen nem mindig érhető el minden parancssoros alkalmazáshoz megfelelő image, bár ezt egyre kevésbé lehet elmondani szerencsére. Szóval ilyenkor nekünk kell készíteni egy image-et, ami igazából nem nagyon különbözik attól mint amikor megpróbáljuk egy linuxos gépre feltelepíteni az adott alkalmazást a szükséges függőségekkel. Azonban egy fizikai vagy virtuális gépnél sokkal gyorsabban és egyszerűbben tudjuk ezt megtenni, mivel nem kell számolni azzal, hogy ha esetleg elrontunk valamit akkor újra kell telepíteni az egész gépet, mert Dockerrel ez pontosan 0 időveszteség.

Hogy mire érdemes még figyelni, arról a Konténerizált Fejlesztői Környezet kialakítása workshopon fogok beszélni.