Docker volume mount

Fórumok

Sziasztok!

Van egy konténerem aminek a fáljait szeretném felmountolni a /var/asd mappába. 

Ezt megtudom csinálni egy új konténer indításánál:

docker run --name=asd -d -v /var/asd/:/config -p 1234:1234 asd

Csakhogy ezzel egy teljesen új konténert indít, mindent beállítást elölről kell kezdeni a konténerben lévő programba. A már meglévő konténert viszont nem lehet -v kapcsolóval indítani. 

Van rá valami megoldás, hogy a már meglévő konténert mountoljam fel a host-ra, vagy pedig újra kell kezdeni az új konténerrel?

Köszi

Hozzászólások

Rendszergarázdaként megnézheted (lsof -p), hogy ténylegesen milyen fájlokat/könyvtárakat használ a konténerben futó process, van némi esély, hogy megtalálod a 'config'-ot benne.

Pedig jól csinálod szerintem, csak azt nem veszed figyelembe, hogy nem a konténer mappáját mountolja a hostra, hanem fordítva: a host /var/asd-t a konténerbe a /config alá. Azaz ha a hoston ez üres, akkor a konténerben is az lesz. Ha előbb átmásolod a meglévő konfigjaidat a /var/asd mappába, akkor már működni fog amit szeretnél.

TL;DR ha jól értem a bajod akkor egy docker cp asd:/config/* /var/asd segíteni fog kiszedni a jelenlegi configot, aztán azzal már indíthatsz új konténert.

Bár a kérdésed kissé ellentétes azzal, mint amit fölötte feszegetsz (+volume hozzáadása meglévő konténerhez vs konténer tartalmának elérése a hostról), de lássuk.

Először is, valamit nem jól csinálsz. A konténerek természetüknél fogva eldobhatóak, nem szabad bennük perisztens adatnak lenni, csak a futtatókörnyezetnek, éppen azért, amit látsz. Minden konfigot, adatbázis fileokat, ilyesmit az kintről kell valahogy betenni. Pl volumeokkkal, vagy env varokkal. Ha a konténer, amit használsz, valami gyári cucc mondjuk a docker hubról, akkor le is lesz írva, hogy mit kell így csinálni. Ha saját image, akkor a jövőben erre figyelj.

Na most, hogy mit lehet tenni, arra azért van több megoldás.

Egyrészt docker commit segítségével a létező konténerből csinálhatsz egy új imaget, amiből már indíthatsz egy új konténert, aminek tudsz -v t adni. Persze ha pont a config mappát szeretnéd most már betenni, akkor nem lesz jó. Persze játszhatod azt, hogy máshova mountolsz, másolsz, aztán rendezkedsz, de ennél akkor már egyszerűbb a fent mutatott docker cp, amivel tudsz fileokat kimásolni konténerből.

Aztán persze rootként elérhető a konténer komplett filerendszere, docker inspect megmondja, honnan van mountolva, valószínűleg a GraphDriver/Data/MergedDir kell neked (függ a storage drivertől szerintem, hogy hogyan hívják)

És végül, ha mindenképp volumet akarsz hozzátenni egy létező konténerhez, akkor leállítás után kézzel valószínűleg bele lehet hekázni a /var/lib/docker/containers/<id>/config.v2.jsonba a plusz mountpointot, aztán imádkozni. Mondjuk hogy mit fog csinálni ha már vannak ott adatok, az passzpiros, szerintem simán csak felülmountolja, szóval ennek is csak akkor van értelme, ha új könyvtár kell.

A konténeren belüli mappákat akartam felcsatolni a host /var/asd mappájába, hogy könnyebben elérjem. Útközben rájöttem, hogy alapból a /usr/share/asd mappába csatol mindent, úgyhogy ez a probléma meg is van oldva.

Most azzal van a gondom, hogy a konfigurált konténerből szeretnél image-t csinálni, a docker committal, viszont a változásokat nem menti el, olyan mintha az eredeti image-t csak klónozná.

Mit csinálok nem jól?

Oszinten, az eddigiek bol az jon le, hogy kb mindent (se a volumos moka, se a commit nem tul container native dolog) :) A commit lezarja az aktualisan irt fs layert. Amit utanna a docker diff paranccsal tudsz ellenorizni. Viszont "The commit operation will not include any data contained in volumes mounted inside the container." ha jol ertem mi a baj.

Szia!

Kicsit tegyük rendbe ezeket a fogalmakat, mert szerintem vagy valami olyan próbálsz meg megcsinálni amit nem célszerű, vagy mi nem értjük a problémádat.

A docker alapötlete az, hogy a konténeren belüli fájlrendszer az egy eldobható dolog, így a konténerbe nem célszerű sem konfig állományokat, sem pedig hasznos fájlokat elmenteni, mert ez pont szembemegy az alapötlettel.

Egy példán keresztül talán világosabb: van egy kupac fájlod amit szeretnél a weben elérhetővé tenni. Fogod az nginx nevű konténert, csinálsz hozzá egy konfigot, meg felcsatolod bele a mappát amiben a fájljaid vannak. Itt sem a konfig, sem pedig maguk a hasznos fájlok nem kerülnek bele a konténerbe, ott csak az lakik amit a készítője belerakott. Ha egy másik gépen (poénból mondjuk másik architektúrán is) akarod ugyan ezt a dolgot beállítani, akkor csak a konfigot, meg a fájlokat kell áthordoznod oda és elindítani az nginx konténert ugyan úgy ahogy az első esetben.

Ha te mégis azt szeretnéd, hogy a konfigurációs állományod legyen része magának a konténer image-nek (ami ismétlem nem jó gyakorlat, de ettől még lehet ilyet)  akkor célszerűbb ha csinálsz egy Dockerfile-t, abban kiindulsz abból az alap konténerből amiből szeretnél és erre "rápakolod" a konfig fájlodat, majd docker build és máris van egy olyan konténer image-d amiben már benne van a konfig fájlod is. Arra azonban figyelj, hogy amennyiben ebben a konfigban vannak szenzitív adatok (pl. jelszavak) akkor innentől bárki aki hozzáfér a dokcer daemon-hoz, az ki tudja szedni a konténeredből ezeket. Ebből az is következik, hogy egy ilyen "beégetett" konfigos konténert a dockerhub-ra vagy más publikus dokcer repositoryba semmiképp ne pusholj fel.