Historia e problemit të migrimit të ruajtjes së dokerit (root docker)

Jo më shumë se disa ditë më parë, u vendos në një nga serverët që të zhvendoset ruajtja e dockerit (drejtoria ku docker ruan të gjithë skedarët e kontejnerëve dhe imazheve) në një seksion të veçantë, i cili
kishte kapacitet më të madh. Detyra dukej e parëndësishme dhe nuk parashikonte telashe...

Le të fillojmë:

1. Ndaloni dhe vrisni të gjithë kontejnerët e aplikacionit tonë:

docker-compose down

nëse ka shumë kontejnerë dhe ato janë në përbërje të ndryshme, mund ta bëni këtë:

docker rm -f $(docker ps -q)

2. Ndaloni demonin e dokerit:

systemctl stop docker

3. Zhvendosni direktorinë në vendndodhjen e dëshiruar:

cp -r /var/lib/docker /docker/data/storage

4. Ne i themi daemon-it docker të shikojë në drejtorinë e re. Ka disa opsione: ose përdorni flamurin -g për të treguar demonin në një shteg të ri, ose konfigurimet e sistemit, që kemi përdorur. Ose një lidhje simbolike. Nuk do të hyj në shumë detaje për këtë, është në internet. plot manuale për zhvendosjen e docker root në një vend të ri.

5. Nisni daemon docker dhe sigurohuni që të duket në vendin e duhur:

systemctl status docker

Në një nga linjat e daljes duhet të shohim:

├─19493 /usr/bin/dockerd --data-root=/docker/data/storage

Ne u siguruam që opsioni t'i kalonte daemonit, tani le të kontrollojmë nëse e zbatoi atë (faleminderit inkvizitor68sl)!

docker info | awk '/Root Dir/ {print $NF}' 

6. Le të fillojmë aplikimin tonë:

docker-compose up -d

7. Kontrollo

Dhe këtu fillon argëtimi, DBMS, MQ, gjithçka është në rregull! Baza e të dhënave është e paprekur, gjithçka funksionon... përveç nginx. Ne kemi ndërtimin tonë nginx me Kerberos dhe kurtizanet. Dhe shikimi i regjistrave të kontejnerit tregoi se nuk mund të shkruajë në /var/tmp - Leja u refuzua. I gatuaj tëmthët me gishta dhe përpiqem të analizoj situatën... Si është e mundur kjo? Imazhi i Docker nuk ndryshoi. Sapo e zhvendosëm drejtorinë. Gjithmonë ka funksionuar, dhe ja ku është për ju... Për hir të eksperimentit, hyra në kontejner me duar dhe ndryshova të drejtat për këtë drejtori, kishte rrënjë, rrënjë 755, dha rrënjë, rrënjë 777. Dhe gjithçka filloi ... Një mendim filloi të tingëllojë në kokën time - një lloj marrëzie ... Mendova, mirë, mbase nuk mora diçka parasysh ...

Vendosa që ne ramë në dashuri me të drejtat e aksesit në dosje gjatë transferimit. Ne ndaluam aplikacionin, daemon docker, fshimë drejtorinë e re dhe kopjuam drejtorinë /var/lib/docker duke përdorur rsync -a.

Unë mendoj se gjithçka është në rregull tani, le të ngremë aplikacionin Docker.

Aaand... problemi mbeti... Syri m'u dridh. Unë nxitova në tastierën e makinës sime virtuale, ku bëja teste të ndryshme, pata këtë imazh nginx dhe u ngjita brenda kontejnerit, dhe këtu të drejtat për direktorinë /var/tmp janë root, root 777. Kjo është, njësoj siç duhej të vendosja manualisht. Por imazhet janë identike!

Sistemi i skedarëve xfs u përdor kudo.

Kam krahasuar duke përdorur komandën

docker inspect my-nginx:12345

Të gjitha hash-et janë identike, të gjitha një me një. Si në server ashtu edhe në makinën time virtuale. Fshiva imazhin lokal të nginx dhe e tërhoqa përsëri nga regjistri, i cili për një sërë arsyesh është në të njëjtën makinë. Dhe problemi është i njëjti... Tani syri im i dytë po dridhet.

Nuk më kujtohet më se çfarë mendimesh kishte në kokën time, përveç thirrjes "AAAAAAAAA" dhe gjëra të tjera. Ishte ora 4 e mëngjesit dhe kodi burimor Docker u përdor për të kuptuar parimin e hashimit të shtresave të imazhit. U hap kutia e tretë e pijeve energjike. Dhe në fund më kuptoi se hashimi merr parasysh vetëm skedarin, përmbajtjen e tij, por JO TË DREJTAT E QASJES! Kjo do të thotë, në një mënyrë misterioze të drejtat tona janë humbur, selinux është i çaktivizuar, acl nuk përdoret dhe nuk ka asnjë copëz ngjitëse.

Fshiva imazhin lokal, fshiva gjithashtu imazhin nga regjistri i dokerit dhe e shtyva përsëri. Dhe gjithçka funksionoi. Rezulton se gjatë transferimit humbën të drejtat, si brenda imazhit lokal ashtu edhe brenda imazhit të shtrirë në regjistër. Siç thashë tashmë, për një sërë arsyesh ajo ishte vendosur në të njëjtën makinë. Dhe si rezultat, në një direktori /var/lib/docker.

Dhe duke parashikuar pyetjen nëse ata u përpoqën të kthenin shikimin e dokerit në drejtorinë e vjetër - jo, ata nuk u përpoqën, mjerisht, rrethanat nuk e lejuan atë. Po, dhe me të vërtetë doja ta kuptoja.

Pas shkrimit të këtij artikulli, zgjidhja e problemit më duket e qartë, por në kohën e analizës nuk dukej kështu. Sinqerisht, kërkova në Google dhe nuk gjeta situata të ngjashme.

Rezultati: E zgjidha problemin, ende nuk e kuptoj arsyen =(

Nëse dikush e di, supozon, kishte një vizion për shkaqet e mundshme të këtij problemi, do të jem jashtëzakonisht i lumtur të dëgjoj nga ju në komente!

Burimi: www.habr.com

Shto një koment