Néhány nappal ezelőtt úgy döntöttünk, hogy az egyik szerveren a docker tárolót (az a mappa, ahol a docker az összes konténerfájlt, képet tárolja) egy külön partícióra helyezzük, amely
nagyobb kapacitással rendelkezik. A feladat, látszólag, triviálisnak tűnt, és nem ígért semmi rosszat…
Kezdjük:
1. Leállítjuk és megölünk minden konténert az alkalmazásunkból:
docker-compose downha sok konténer van, és különböző compose-okat használnak, akkor így:
docker rm -f $(docker ps -q)2. Leállítjuk a docker démon-t:
systemctl stop docker3. Áthelyezzük a mappát a megfelelő helyre:
cp -r /var/lib/docker /docker/data/storage4. Értesítjük a docker démont, hogy nézze az új könyvtárat. Itt van néhány lehetőség: vagy a -g kapcsolóval adjuk meg az új utat a démonnak, vagy a systemd konfigurációs fájlokat használjuk, ahogy mi is tettük. Vagy szimbolikus link. Erről nem írok részletesebben, az interneten van kézikönyv a docker root új helyre történő áthelyezéséről.
5. Indítsuk el a docker démont, és figyeljük, hogy hova néz:
systemctl status dockerA kimenet egyik sorában látnunk kell:
├─19493 /usr/bin/dockerd --data-root=/docker/data/storageMeggyőződtünk arról, hogy a démontól megkaptuk a választási lehetőséget, most ellenőrizzük, hogy alkalmazta-e (köszönet )!
docker info | awk '/Root Dir/ {print $NF}' 6. Indítsuk el az alkalmazásunkat:
docker-compose up -d7. Ellenőrizzük
Itt kezdődik a legérdekesebb rész, az SGBD, MQ, minden rendben! Az adatbázis épen maradt, minden működik… kivéve az nginx-t. Van egy saját nginx-ünk Kerberos-szal és kurvák nélkül. A konténer naplóinak átnézése azt mutatta, hogy nem tud írni a /var/tmp könyvtárba – A hozzáférés megtagadva. Pihentetem az ujjaimat a halántékomon, és próbálom analizálni a helyzetet… Hogyan történhetett ez? A docker kép nem változott. Csak a könyvtárat helyeztük át. Mindig működött, és most… Kísérletképpen beléptem a konténerbe, és megváltoztattam a jogosultságokat a megadott mappához, volt root, root 755, adtam root, root 777. És minden elindult… A fejemben megszólalt egy gondolat – valami őrültség… Gondoltam, talán valamit elfelejtettem…
Úgy döntöttem, hogy a fájlok hozzáférési jogait elvesztettük az áthelyezés során. Leállítottuk az alkalmazást, a docker démont, töröltük az új mappát, és a /var/lib/docker mappa másolását végeztük rsync -a.
Most már biztos vagyok benne, hogy minden rendben lesz, indítom a dockert, az alkalmazást.
Hát… a probléma megmaradt… Be volt rekedve a szemem. Elrohantam a virtuális gépem konzolára, ahol különféle teszteket futtattam, volt ez az nginx kép, és beléptem a konténerbe, és ott a /var/tmp mappán a jogosultságok root, root 777. Tehát ugyanazok, amiket manuálisan kellett beállítanom. De hiszen a képek azonosak!
Mindenhol xfs fájlrendszert használtak.
Összehasonlítottam a következő paranccsal
docker inspect my-nginx:12345Minden hash azonos, mind egy az egyben. Akár a szerveren, akár a virtuális gépemen. Töröltem a helyi nginx képet, és újra letöltöttem a registry-ből, ami különböző okok miatt ugyanazon a gépen van. És ugyanaz a probléma… Most a második szemem is elkezdett remegni.
Már nem emlékszem, mik jártak a fejemben, a „AAAAAAA” felkiáltáson kívül. Éjszaka 4 óra van, elővettem a docker forráskódot, hogy megértsem a réteg hash-elésének elvét. Megnyitottam a harmadik energiaitalos dobozt. És végül rájöttem, hogy a hash-elés csak a fájlt és annak tartalmát veszi figyelembe, de NEM A HOZZÁFÉRÉSI JOGOKAT! Tehát valami rejtélyes módon a jogosultságok megsérültek, pedig a selinux le volt kapcsolva, az acl nem volt használva, sticky bit pedig nem volt.
Töröltem a helyi képet, töröltem a registry-beli képet is és újra feltöltöttem. És minden működött. Tehát úgy tűnik, hogy a átvitel során a jogosultságok megsérültek, mind a helyi képben, mind a registry-ben található képben. Ahogy már mondtam, különböző okok miatt itt a gépen helyezkedett el. És következésképpen egy mappában /var/lib/docker.
És előre látva a kérdést, nem próbáltuk visszafordítani a dockert a régi mappába — nem, sajnos, a körülmények nem tették lehetővé. De nagyon akartam megérteni.
A cikk megírása után a probléma megoldása számomra nyilvánvalónak tűnik, de a kérdés tisztázása pillanatában nem tűnt annak. Őszintén keresgéltem a neten, és nem találtam hasonló helyzeteket.
Összegzés: a problémát megoldottam, az okot viszont nem értettem meg =(
Ha valaki tudja vagy sejtette, hogy mi lehetett a probléma okainak egyike — nagyon örülnék, ha megosztanád a kommentekben!
Forrás: habr.com
