Mõni päev tagasi otsustati ühel serveril viia docker storage (kataloog, kus docker salvestab kõik konteineri failid ja pildid) eraldi partitsioonile, mis
oli suurema mahtuvusega. Ülesanne näis triviaalne ja ei lubanud halba...
Alustame:
1. Peatame ja tapame kõik meie rakenduse konteinerid:
docker-compose downkui konteinerite arv on suur ja need on erinevates compose failides, võib kasutada järgmist:
docker rm -f $(docker ps -q)2. Peatame docker deemon:
systemctl stop docker3. Liigume katalooge soovitud asukohta:
cp -r /var/lib/docker /docker/data/storage4. Anname docker deemonile teada, et see vaataks uude kausta. Siin on mitu varianti: kas määrata deemonile uus tee -g flagi kaudu, või kasutada systemd konforme, mida me ka kasutasime. Või sümboolsed lingid. Ei hakka seda liiga palju lahti kirjutama, internetis käsiraamatuid docker juure uude kohta viimise kohta.
5. Käivitame docker deemonit ja jälgime, et see vaataks õiges suunas:
systemctl status dockerÜhes väljundi real peaksime nägema:
├─19493 /usr/bin/dockerd --data-root=/docker/data/storageVeendume, et deemon sai valiku jaotuse, nüüd kontrollime, kas ta kasutas seda (tänud )!
docker info | awk '/Root Dir/ {print $NF}' 6. Käivitame meie rakenduse:
Vaatame lihtsat näidet.7. Kontrollime
Ja nüüd algab kõige huvitavam osa, DB, MQ, kõik on hästi! Andmebaas on terve, kõik töötab... välja arvatud nginx. Meil on oma nginx kogum, millel on kerberos ja eskorttütred. Ja konteineri logide vaatamine näitas, et ta ei saa kirjutada /var/tmp — Permission denied. Katisin sõrmi ja proovin olukorda analüüsida... Kuidas nii? Docker image ei muutunud. Lihtsalt liikusime kausta. Alati on töötanud ja nüüd... Eksperimendi nimel läksin käsitsi konteinerisse ja muutsin õigusi antud katalooge, need olid root, root 755, muutsin need root, root 777. Ja kõik hakkas tööle... Peas kajas mõte — mingi jama see ju on... Mõtlesin, et ehk ei pidanud ma midagi silmas...
Otsustasin, et me kaotasime failide õigused kaustade liigutamise ajal. Peatasime rakenduse, docker deemoni, eemaldasime uue kausta ja sooritasime /var/lib/docker kausta kopeerimise, kasutades rsync -a.
Mõtlesin, et nüüd on kindlasti kõik hästi, käivitame dockeri, rakenduse.
Nii... probleem jäi alles... Mul hakkas silm tõmblema. Ma kiirustasin oma virtuaalmasina konsooli, kus jooksutan erinevaid teste. Mul oli see nginx'i pilt ja ma ronisin konteinerisse, ning seal kataloogis /var/tmp olid õigused root, root 777. Seega olid õigused samad, mida pidin käsitsi seadma. Kuid pildid on ju identsed!
Iga pool kasutati FS xfs.
Võrdlesin käsu kaudu
docker inspect my-nginx:12345Kõik hashid on identsed, kõik on ühesugused. Nii serveris kui ka minu virtuaalmasinas. Kustutasin kohalikku nginx'i pilti ja tõmbasin selle uuesti registry'lt, mis mitmel põhjusel asub samal masinal. Ja probleem on sama... Nüüd tõmbles mul teine silm.
Ma ei mäleta, millised mõtted olid mu peas, välja arvatud karjed 'AAAAAA' ja muud. Väljas on kell neli hommikul, haarasin Docker'i lähtekoodid, et mõista pildi kihtide hashimise põhimõtet. Avatud kolmas energiajoogipurk. Lõpuks jõudsin kohale, et hashimine arvestab ainult faili ja selle sisu, kuid EI OLE ÕIGUSI! Nii et mingil salapärasel moel on meie õigused rikutud, kuigi selinux on välja lülitatud, acl ei kasutata, sticky bit ei ole.
Kustutasin kohaliku pildi, eemaldas sama pildi docker registrist ja pushisin uuesti. Ja kõik hakkas tööle. Tundub, et õigus on rikutud nii kohalikus pildis kui ka registris asuvas pildis. Nagu ma juba ütlesin, asus see mitmel põhjusel samas masinas. Ja seetõttu ühes kataloogis /var/lib/docker.
Ootasin küsimust, kas ollakse proovinud Docker'i silm tagasi vanasse kataloogi suunata — ei, me ei proovinud, kahjuks ei lubanud asjaolud. Ja tore oli aru saada.
Selle artikli kirjutamise järel tundub mulle selle probleemi lahendus ilmne, kuid selle analüüsi hetkel ei tundunud see nii. Ausalt otsisin ja ei leidnud sarnaseid olukordi.
Kokkuvõte: probleem lahendatud, põhjust ma ei mõistnud =(
Kui keegi teab või kahtlustab võimalikke põhjuseid, miks see probleem tekkis — oleksin väga tänulik kommentaarides!
Allikas: habr.com
