Sziasztok,
Szeretnék egy környezetet kialakítani ahol csak az alap rendszer (Linux) és felette docker konténerek vannak.
A konténerek működnek is, csak az elérési utakkal vagyok bajban.
Tehát van sok könyvtár, benne egy-egy docker-compose.yaml, illetve egyeseskben még Dockerfile is van a helyi image gyártáshoz.
A docker-compose fájlokban van egy-egy volume kivezetés a helyi fájlrendszerre.
Rendszerint ez:
volumes:
- $PWD/idetedd:/container/belso/konyvtar
Ezzel az a baj, hogy ez az éppen aktuális könyvtárat mutatja, tehát ha mondjuk a root könyvtárból indítom a containert:
/root# docker-compose -f /fajl/helye/a/fajlrendszeren up
Akkor a root könyvtárban lesz egy ilyenem: /idetedd
Mit kell használnom a $PWD helyett, hogy az mindig egy adott könyvtárra mutasson, de mégse legyen beégetve?
A végső cél az lenne, hogy elindítom a következő parancsot:
# docker-compose -f docker/container1/docker-compose.yaml -f docker/container2/docker-compose.yaml up
Akkor mindegyik konfiguráció, a saját könyvtárán belül hozza létre a saját hostra kötött könyvtárát.
Google keresés nem segített, lehet, hogy nem jó felé nézelődtem.
üdv: redman
Hozzászólások
Beírod a teljes elérési útvonalat:
- /var/www/akarmi/idetedd:/container/belso/konyvtar
Vagy használj .env -et külön a mappákban, ahol a docker-compose.yml fájl van:
.env
WORKING_DIR=/var/www/akarmi
- $WORKING_DIR/idetedd:/container/belso/konyvtar
Szerintem abszolót elérési útvonalat használni compose-ban antipattern, kivéve ha mondjuk /env/data/servicename /env/log/servicename és az /env/data ill /env/log külön partíción laknak.
Igen, erre gondoltam elsöként én is, de vagy túl egyszerü ez a megfejtés vagy én értelmezem félre a kérdést.
Mindenesetre álljon itt, ha már mindenképp a változók használata a követelmény:
https://docs.docker.com/compose/environment-variables/
Ez lesz az köszi.
Akkor parancssorból előbb meg kell mondani neki az .env fájlt.
Mondtam én, hogy nem jó volt a keresés :)
https://www.redman.hu
szerintem nem kell, elég, ha mellette van. Arra figyelj, hogy a futtató környezetben ne legyen az a változó összeszemetelve, mert az erősebb.
Nem a $PWD-ből veszed hanem egy saját mondjuk WORKDIR változóból.
A WORKDIR-t meg a docker-compose előtt beállítod.
WORKDIR=/opt/app/akarmi docker-compose -f ...
A "docker szép" megoldás amúgy a volume-ok használata lenne. Előre létrehozod a volume-okat (akár egy scripttel) és a compose-ban már nincsenek elérési utak csak volume hivatkozások.
Gábriel Ákos
igazából elég a compose fileba felsorolni a volumeokat. Csak akkor ugye valahol lesz, nem ott kényelmesen mellette.
Így van, tök jól néz ki, csak nekem valahogy ez jobban bejön.
Sőt, hogy ha "véletlen" kiírtom a volume-okat, akkor ezek a könyvtárak megmaradnak utána is.
https://www.redman.hu
Véletlen kiirtás ellen szerintem a mentés a jó megoldás.
Majd a tapasztalat megmutatja neked hogy ez a folder alapú volume-ozás elég jó-e az igényeidhez.
IOT cuccon használom még mindig én is, nagyobbon már inkább nem.
Gábriel Ákos
Köszönöm, így már jó lesz. Lehetne még kényelmesebb, de azért ez is nagyon jó.
Tehát leteszünk valahova egy environment fájlt
/srv/docker/config.env
Aminek a tartalma ez:
WORKING_DIR=/srv/docker/data
A docker-compos fájlba használjuk a változót:
volumes:
- $WORKING_DIR/mysql:/var/lib/mysql
Majd indítjuk a dolgot:
docker-compose --env-file /srv/docker/config.env -f /srv/docker/mysql/docker-compose.yml up
https://www.redman.hu
Ha "config.env" helyett ".env" -nek hívod, akkor elvileg nem kell a --env-file, lásd fentebb, bár csak elivleg, mert egyrészt ezt mondja:
később meg ezt:
kiemelések tőlem, szóval vagy a docker-compose.yml könyvtára, vagy a $PWD, ahol a .env-et keresi. Sajna az utóbbira tippelnék, mert szerintem csak az elején írtak faszságot, de ki tudja, hátha.
Kipróbáltam, sajnos nem működik .env file-lal. Nem veszi figyelembe
https://www.redman.hu
Esetleg egy jó systemd-s service template?
https://lovethepenguin.com/docker-compose-as-systemd-service-c758c5f749…
Talán ilyesmi lehetne:
Egy nagyon fontos infót nem írtak le itt a kollegák. A docker-compose.yml esetében, ha a mappát ponttal (.) adod meg, akkor az a docker-compose.yml -t tartalmazó mappa lesz. Tehát, ha relatív útvonalvezetést használsz, akkor a docker-compose.yml -t tartalmazó mappától számítva is tudsz útvonalakat megadni. Így nem kell égetni az útvonalat (ami nagyon megköti a környezetet, nem költöztethető, nem lesz kipróbálható lokális gépen, stb), és nem kell kívülről definiált environment változóra hagyatkozni.
Amit én javaslok kipróbálásra (ha docker-compose -ban gondolkodtok, és nem merül fel a Kubernetes), az a POCO https://github.com/shiwaforce/poco
Ezt eredetileg házon belül fejlesztettük ki, de közkinccsé tettük, mert sokak számára hasznos lehet.
A lényeg: a projekt gyökerében tudsz lerakni egy poco.yml fájlt, amiben különböző scenariok (plan-ek) mentén különböző konténereket tudsz elindítani.
Példa konfig:
Az egyes planeket a poco up PLAN segítségével indítod el. De lehetőség van pl plan-specifikus environment változók definiálására is, így különféle derivációkra van lehetőség benne. A lényeg, hogy egy egyparancsos indítást tudsz megvalósítani többféle konfigurációra.
Mi úgy csináljuk, hogy a docker-compose -os fragment YML-ek azok egy flat könyvtárszerkezetben vannak, és a globálisan behívott docker/conf/default/conf.env -ben van definiálva egy PROJECT_ROOT nevű változó, ami relatív hivatkozással tartalmazza a git repo gyökerére való hivatkozást, a fenti példában ez "PROJECT_ROOT=.." -ot tartalmaz (a docker mappánál eggyel kijebb kezdünk), és az egyes fragmentekben már minden volume mount útvonal ami a projekten belülről jön, úgy van behivatkozva, hogy:
Érdemes emiatt egy mappában tartani a Docker Compose konfigokat.
Arra figyelj, hogy ez egy régi projekt, és még nem a hivatlaos Docker Compose pluginre épül, hanem a Pythonban írt docker-compose utilityre. Nem sok különbség van, de azért van.
Blog | @hron84
via @snq-
Baszki, tényleg, a volumeok a filetól, nem a pwdtől függenek...
Nagyon köszönöm. Egyelőre akkor a ./ lesz a megoldás, de megnézem POCO-t is.
Így lesz az egyszerű :)
https://www.redman.hu