Ne více než před pár dny bylo na jednom ze serverů rozhodnuto přesunout úložiště dockeru (adresář, kde docker ukládá všechny soubory kontejnerů a obrázků) do samostatné sekce, která
měl větší kapacitu. Úkol se zdál triviální a nepředpovídal potíže...
Začínáme:
1. Zastavte a zabijte všechny kontejnery naší aplikace:
docker-compose down
pokud je kontejnerů hodně a jsou v různém složení, můžete to udělat:
docker rm -f $(docker ps -q)
2. Zastavte démona docker:
systemctl stop docker
3. Přesuňte adresář na požadované místo:
cp -r /var/lib/docker /docker/data/storage
4. Řekneme démonovi docker, aby se podíval do nového adresáře. Existuje několik možností: buď použijte parametr -g k nasměrování démona na novou cestu, nebo systémové konfigurace, které jsme použili. Nebo symbolický odkaz. Nebudu se o tom moc rozepisovat, je to na internetu.
5. Spusťte démona dockeru a ujistěte se, že vypadá na správném místě:
systemctl status docker
V jednom z výstupních řádků bychom měli vidět:
├─19493 /usr/bin/dockerd --data-root=/docker/data/storage
Ujistili jsme se, že možnost byla předána démonovi, nyní zkontrolujeme, zda ji použil (díky
docker info | awk '/Root Dir/ {print $NF}'
6. Začněme naši aplikaci:
docker-compose up -d
7. Kontrola
A tady začíná zábava, DBMS, MQ, všechno je v pořádku! Databáze je neporušená, vše funguje... kromě nginx. Máme vlastní sestavení nginx s Kerberos a kurtizány. A prohlížení protokolů kontejneru ukázalo, že nemůže zapisovat do /var/tmp - Povolení odepřeno. Hnětím si spánky prsty a snažím se analyzovat situaci... Jak je to možné? Obraz Dockeru se nezměnil. Právě jsme přesunuli adresář. Vždy to fungovalo a tady je to pro vás... Kvůli experimentu jsem šel do kontejneru rukama a změnil práva k tomuto adresáři. kořen, kořen 755, dal kořen, kořen 777. A všechno začalo... V hlavě se mi začala ozývat myšlenka - nějaký nesmysl... Říkal jsem si, no, možná jsem něco nevzal v úvahu...
Rozhodl jsem se, že jsme se při přenosu zamilovali do přístupových práv k souborům. Zastavili jsme aplikaci, démona docker, smazali nový adresář a zkopírovali adresář /var/lib/docker pomocí rsync -a
.
Myslím, že nyní je vše v pořádku, zvedneme aplikaci Docker.
Aaa... problém přetrvával... Zacukalo mi oko. Spěchal jsem do konzole svého virtuálního stroje, kde jsem spouštěl různé testy, měl jsem tento obraz nginx a vlezl jsem dovnitř kontejneru a zde jsou práva k adresáři /var/tmp root, root 777. stejně jako jsem musel nastavit ručně. Ale obrázky jsou stejné!
Všude se používal souborový systém xfs.
Porovnal jsem pomocí příkazu
docker inspect my-nginx:12345
Všechny hashe jsou identické, všechny jedna ku jedné. Jak na serveru, tak na mém virtuálním počítači. Smazal jsem místní obraz nginx a znovu jej vytáhl z registru, který je z mnoha důvodů na stejném počítači. A problém je stejný... Teď mi cuká druhé oko.
Už si nepamatuji, jaké myšlenky se mi honily hlavou, kromě křiku „AAAAAAAAA“ a dalších věcí. Byly 4 hodiny ráno a zdrojový kód Dockeru byl použit k pochopení principu hashování obrazových vrstev. Otevřel třetí plechovku energetického nápoje. A nakonec mi došlo, že hašování bere v úvahu pouze soubor, jeho obsah, ale NEPŘÍSTUPOVÁ PRÁVA! To znamená, že nějakým záhadným způsobem byla ztracena naše práva, selinux je zakázán, acl se nepoužívá a není tam žádný lepivý kousek.
Smazal jsem místní bitovou kopii, smazal jsem ji také z registru dockeru a znovu jsem ji poslal. A vše fungovalo. Ukázalo se, že během převodu došlo ke ztrátě práv, a to jak uvnitř místního obrazu, tak uvnitř obrazu ležícího v registru. Jak jsem již řekl, z mnoha důvodů byl umístěn na stejném autě. A ve výsledku v jednom adresáři /var/lib/docker.
A předvídání otázky, zda se pokusili vrátit pohled dockeru do starého adresáře - ne, nezkoušeli to, bohužel, okolnosti to nedovolily. Ano, a opravdu jsem na to chtěl přijít.
Po napsání tohoto článku se mi řešení problému zdá zřejmé, ale v době analýzy se nezdálo. Upřímně, hledal jsem na Googlu a nenašel jsem podobné situace.
Výsledek: Problém jsem vyřešil, stále nechápu důvod =(
Pokud někdo ví, tuší, měl představu o možných příčinách tohoto problému, budu velmi rád, když se ozvete v komentářích!
Zdroj: www.habr.com