„Docker Mount“ klaidų taisymas: „GitLab Runner“ tik skaitomos failų sistemos problemos

„Docker Mount“ klaidų taisymas: „GitLab Runner“ tik skaitomos failų sistemos problemos
„Docker Mount“ klaidų taisymas: „GitLab Runner“ tik skaitomos failų sistemos problemos

Kodėl Docker negali rašyti į mano kalno kelią? „GitLab Runner“ leidimų trikčių šalinimas

„GitLab Runner“ paleidimas programoje „Docker“ dažnai vyksta sklandžiai, kol susiduriate su stulbinančia klaida su montavimo leidimais. 🐳 Neseniai susidūriau su „tik skaitomos failų sistemos“ problema, kuri užblokavo „Docker“ prieigą prie prijungimo kelio, nepaisant daugybės pastangų ją išspręsti. Ši klaida pasirodė, kai bandžiau prijungti katalogą „/srv/gitlab-runner/config“ į „Docker“ konteinerį, skirtą „GitLab Runner“.

Iš pradžių maniau, kad tai gali būti katalogo leidimų problema, todėl bandžiau pakoreguoti nuosavybės teisę ir leidimus. Tačiau net ir pabandžius šiuos pakeitimus klaida išliko, o tai rodė kažką sistemingesnio. Sąranka atrodė teisinga, tačiau Docker ir toliau atmetė bet kokį bandymą sukurti ar pasiekti kelią.

Tada ištyriau, ar dėl montavimo parinkčių katalogas buvo tik skaitomas. Mano nuostabai, „/srv“ iš tikrųjų buvo prijungtas su „ro“ (tik skaitymo) atributais, galbūt dėl ​​mano sistemos pagrindinių Debian arba Docker konfigūracijų.

Šiame straipsnyje išskaidysiu kiekvieną trikčių šalinimo veiksmą ir paaiškinsiu, kodėl „Docker“ tam tikrus katalogus gali laikyti tik skaitomais. Nagrinėdamas konkrečius sprendimus, tikiuosi padėti jums išspręsti panašias montavimo leidimo problemas ir užtikrinti, kad jūsų „GitLab Runner“ konteineris veiktų sklandžiai! 🚀

komandą Naudojimo pavyzdys
mount | grep "/srv" Pateikiamas visų prijungtų failų sistemų sąrašas, filtruojamas pagal katalogą „/srv“. Ši komanda padeda patikrinti, ar katalogas yra prijungtas kaip tik skaitymo (ro) ar skaitymo ir rašymo (rw), o tai labai svarbu diagnozuojant leidimų problemas.
sudo mount -o remount,rw /srv Bandoma iš naujo prijungti `/srv' katalogą su skaitymo ir rašymo leidimais. Ši komanda yra būdinga scenarijams, kai katalogas buvo netyčia prijungtas kaip tik skaitomas ir turi būti įrašomas, kad veiktų Docker tomo susiejimas.
sudo chown -R 1000:1000 /srv/gitlab-runner Rekursyviai pakeičia katalogo „/srv/gitlab-runner“ nuosavybės teisę į konkretų vartotoją (UID 1000). Ši komanda ypač naudinga tais atvejais, kai „Docker“ reikalauja konkrečių vartotojo teisių, kad galėtų pasiekti surištus tomus.
docker.from_env() Inicijuoja Docker klientą, kuris prisijungia prie pagrindiniame kompiuteryje sukonfigūruotos Docker aplinkos. Tai būtina programiškai tvarkant „Docker“ konteinerius, pvz., paleidžiant, sustabdant arba tikrinant „Python“ scenarijų konteinerius.
client.containers.run() Paleidžia „Docker“ konteinerį naudodamas „Docker SDK“, skirtą „Python“. Šis metodas yra labai naudingas, kai reikia tiksliai valdyti sudėtinio rodinio konfigūraciją, pvz., programiškai apibrėžti apimties susiejimą ir privilegijuotą prieigą.
unittest.TestCase „Python“ unittest sistemos dalis, ši bazinė klasė leidžia sukurti organizuotus ir pakartotinai naudojamus bandymo atvejus, kurie yra būtini kiekvienos funkcijos elgsenai patvirtinti, ypač kelių aplinkų scenarijuose.
assertNotIn("ro", mount_check) Vieneto testo tvirtinimas, naudojamas patikrinti, ar tik skaitomo (ro) atributo nėra komandos „mount“ išvestyje, užtikrinant, kad katalogą galima rašyti. Tai tikslinis failų sistemos leidimų patikrinimas.
restart_policy={"Name": "always"} Sukonfigūruoja „Docker“ konteinerį, kad jis būtų automatiškai paleistas iš naujo, jei netikėtai sustotų. Šis nustatymas svarbus ilgai veikiančioms paslaugoms, tokioms kaip „GitLab Runner“, kad būtų užtikrintas jos veikimas po perkrovimo ar klaidų.
container.status Nuskaito dabartinę „Docker“ sudėtinio rodinio būseną (pvz., „veikia“, „išjungta“). Ši komanda būtina norint programiškai patikrinti, ar konteineris sėkmingai paleistas ir veikia.
ls -ld /srv/gitlab-runner Pateikiama informacija apie katalogą, įskaitant „/srv/gitlab-runner“ leidimus ir nuosavybės teises. Ši komanda padeda patikrinti, ar katalogas turi teisingus leidimus ir nuosavybės nustatymus, reikalingus „Docker“ sėkmingai jį prijungti.

Sprendimų supratimas: Docker Mount leidimai ir pakartotinis montavimas

Norėdami kreiptis į Docker laikiklis su „GitLab Runner“ sąrankos problema, sukūriau tris skirtingus sprendimus naudodamas apvalkalo scenarijus, „Docker Compose“ ir „Python“. Pirmasis sprendimas naudoja pagrindines apvalkalo komandas, kad tiesiogiai valdytų failų sistemos leidimus. Patikrinus, ar „/srv“ katalogas yra tik skaitomas su „mount |“. grep "/srv"` komandą, scenarijus nustato, ar katalogo leidimai sukelia Docker prieigos problemą. Jei taip, scenarijus bando iš naujo prijungti „/srv“ kaip skaitymo ir rašymo funkciją su „sudo mount -o remount,rw /srv“. Šis metodas yra greitas sprendimas skubiems pakartotinio montavimo poreikiams, ypač kai „Docker“ negali sukurti katalogų dėl failų sistemos apribojimų. Pavyzdžiui, sistemose, kuriose katalogai netyčia pagal numatytuosius nustatymus yra tik skaityti, šis greitas koregavimas gali veiksmingai išspręsti leidimų problemas. 🛠️

Apvalkalo scenarijus taip pat keičia „/srv/gitlab-runner“ nuosavybės teisę, naudodamas „sudo chown -R 1000:1000 /srv/gitlab-runner“, suteikdamas „Docker“ reikalingą prieigą prie katalogo. Ši komanda yra gyvybiškai svarbi, nes be tinkamos nuosavybės Docker dažnai stengiasi tinkamai prijungti katalogus. Tada komanda „ls -ld /srv/gitlab-runner“ patikrina katalogo leidimus ir leidžia mums patvirtinti, kad „Docker“ gali skaityti ir rašyti toje vietoje. Šis paprastas, tiesioginis metodas yra naudingas, kai reikia nedelsiant koreguoti, o „Docker“ turi pasiekti katalogus, esančius už įprastų kelių, pvz., „/srv“. Tačiau šis metodas gali būti netinkamas gamybos aplinkoje, kur pirmenybė teikiama modulinėms ir daugkartinio naudojimo konfigūracijoms.

Antrasis sprendimas grindžiamas moduliavimu naudojant „Docker Compose“.. Apibrėždami apimtis ir leidimus faile „docker-compose.yml“, sukuriame pakartotinai naudojamą konfigūraciją. Šis kūrimo failas susieja „/srv/gitlab-runner/config“ su „/etc/gitlab-runner“ sudėtinio rodinio viduje ir suteikia sudėtiniam rodiniui privilegijuotą prieigą su „privilegijuota: true“. Pavyzdžiui, aplinkoje, kurioje „GitLab Runner“ paslaugoms reikia nuoseklių paleisties konfigūracijų, „Docker Compose“ leidžia visą sąranką valdyti kaip paslaugą. Išsaugojus „docker-compose.yml“ failą, „docker-compose up -d“ atveria sudėtinį rodinį. Kompozicijos metodas pagerina ilgalaikę priežiūrą, ypač diegiant įvairiuose įrenginiuose arba dalijantis konfigūracijas su komandos nariais.

Trečiasis sprendimas naudoja Python ir Docker SDK, kuris suteikia daugiau lankstumo ir leidžia atlikti išsamų programinį valdymą. Šis metodas pirmiausia patikrina, ar „/srv“ yra tik skaitomas, tada, jei reikia, iš naujo sujungia. Naudodamas „client.containers.run“, scenarijus paleidžia „GitLab Runner“ talpyklą su tam tikrais apimties atvaizdais ir pakartotinio paleidimo politika, užtikrindamas nuolatinį veikimą. Šis sprendimas ypač efektyvus sudėtingose ​​sistemose, kuriose pirmenybė teikiama programinei sąrankai, o ne rankiniam koregavimui. Automatizuodami šias „Docker“ konfigūracijas įgyjame ir klaidų tvarkymo, ir „Docker“ elgsenos kontrolę kelių vartotojų aplinkoje. Be to, šis metodas gali būti integruotas į didesnius automatikos vamzdynus, todėl jis yra neįkainojamas gamybos aplinkoje. 🚀

1 sprendimas: „Docker“ garsumo leidimų reguliavimas naudojant „Shell“ komandas

„Shell“ scenarijus, skirtas failų sistemai ir „Docker“ leidimų valdymui

# Step 1: Check if the /srv directory is mounted as read-only
mount | grep "/srv"
# If /srv is mounted as read-only, attempt remounting it as read-write
sudo mount -o remount,rw /srv

# Step 2: Change ownership of the target directory to avoid permission conflicts
sudo chown -R 1000:1000 /srv/gitlab-runner

# Step 3: Verify permissions (directory should now be writable by Docker)
ls -ld /srv/gitlab-runner

# Step 4: Run the Docker command again to see if the error persists
sudo docker run -d --privileged --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

2 sprendimas: sukonfigūruokite „Docker“ su „Docker Compose“, kad pagerintumėte moduliškumą

„Docker Compose“ konfigūracijos failas, skirtas valdyti apimties leidimus ir sudėtinio rodinio diegimą

# Create a docker-compose.yml file to configure the GitLab Runner container
version: '3.8'

services:
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    container_name: gitlab-runner
    privileged: true
    restart: always
    volumes:
      - /srv/gitlab-runner/config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock

# Step 1: Run Docker Compose to start the GitLab Runner container
sudo docker-compose up -d

# Step 2: Verify if container is running with appropriate permissions
sudo docker-compose ps

3 sprendimas: permontavimas ir leidimų tvarkymas naudojant Python ir Docker SDK

„Python“ scenarijus, naudojant „Docker“ SDK, skirtas išplėstiniam pakartotinio prijungimo tvarkymui ir talpyklos diegimui

import os
import docker
from subprocess import call

# Step 1: Check if /srv is mounted as read-only and attempt remount if necessary
mount_check = call(["mount", "|", "grep", "/srv"])
if 'ro' in mount_check:
    call(["sudo", "mount", "-o", "remount,rw", "/srv"])

# Step 2: Change ownership of the directory to allow Docker access
os.system("sudo chown -R 1000:1000 /srv/gitlab-runner")

# Step 3: Set up Docker client and run GitLab Runner container
client = docker.from_env()
container = client.containers.run("gitlab/gitlab-runner:latest",
    name="gitlab-runner",
    detach=True,
    privileged=True,
    restart_policy={"Name": "always"},
    volumes={'/srv/gitlab-runner/config': {'bind': '/etc/gitlab-runner', 'mode': 'rw'},
             '/var/run/docker.sock': {'bind': '/var/run/docker.sock', 'mode': 'rw'}}
)

print("Container started with ID:", container.id)

# Step 4: Validate the status of the container
print(client.containers.get("gitlab-runner").status)

Vienetų testai, skirti patvirtinti įvairius sprendimus

Python unittest sistema, skirta pakartotinio montavimo ir „Docker“ konteinerio leidimams išbandyti

import unittest
import os
from subprocess import call
import docker

class TestDockerGitLabRunner(unittest.TestCase):
    def test_mount_check(self):
        mount_check = call(["mount", "|", "grep", "/srv"])
        self.assertNotIn("ro", mount_check, "Directory is read-only")

    def test_directory_permissions(self):
        self.assertEqual(os.stat('/srv/gitlab-runner').st_uid, 1000, "Ownership mismatch")

    def test_container_start(self):
        client = docker.from_env()
        container = client.containers.get("gitlab-runner")
        self.assertEqual(container.status, "running", "Container failed to start")

if __name__ == "__main__":
    unittest.main()

„Docker“ tik skaitomos failų sistemos problemų supratimas

Vienas mažiau žinomas darbo su „Docker“ aspektas yra tas pagrindas failų sistemos konfigūracijos ant pagrindinio kompiuterio gali turėti įtakos konteinerio elgsenai, ypač montuojant tūrius. Kai kuriose sistemose, pvz., tam tikrose „Debian“ ar „Ubuntu Core“ versijose, pagal numatytuosius nustatymus arba dėl sistemos naujinimų tam tikri katalogai gali būti nustatyti tik skaityti, todėl „Docker“ montavimo galimybės gali sugesti. Taip dažnai nutinka, kai bandote prijungti kelius, pvz., „/srv“, skirtą „GitLab Runner“, tik norėdami susidurti su „tik skaitymo“ klaidomis. Norint to išvengti, naudinga suprasti pagrindines tik skaitomų failų sistemų priežastis, ypač saugiose arba nekeičiamose sąrankose, kurios gali labai paveikti konteinerių tvirtinimą.

Kad išspręstų šias problemas, vartotojai dažnai bando įprastus pataisymus, pvz., pakeisti leidimus naudojant „chown“ arba pakartotinai prijungti katalogus su „mount -o remount,rw /srv“. Tačiau šie metodai gali neveikti, jei pačioje šakninėje failų sistemoje yra apribojimų arba jei „Docker“ saugojimo tvarkyklė (pvz., perdanga2) nesuderinamas su konkrečiomis prieglobos konfigūracijomis. Tokiais atvejais naudojant specialias „Docker Compose“ konfigūracijas arba net iš naujo sukonfigūruojant „Docker“ šakninį katalogą („Docker Root Dir“) kartais galima išspręsti, nukreipiant prijungimus į lankstesnius katalogus. Be to, naudojant konteinerių orkestravimo įrankius, tokius kaip „Kubernetes“, galima pasiūlyti daugiau konfigūruojamų nuolatinio saugojimo parinkčių.

Kūrėjai, dažnai dirbantys „Docker“ naudodami ribojančias failų sistemas, suprasdami šias konfigūracijas sutaupo daug laiko trikčių šalinimui. Kai kurie metodai taip pat apima sistemos failų (pvz., „/etc/fstab“) redagavimą, leidžiantį nuolatinės skaitymo ir rašymo konfigūraciją paleidus iš naujo. Ištyrę šiuos metodus, „Docker“ naudotojai gali geriau valdyti konteinerines darbo eigas ribotose failų sistemose, užtikrindami sklandesnį diegimą ir mažiau su leidimais susijusių galvos skausmų! 🔧

Dažnai užduodami klausimai apie „Docker Volume Mount“ klaidas

  1. Kodėl „Docker“ išmeta tik skaitomos failų sistemos klaidą, kai naudoja tomus?
  2. Ši klaida paprastai įvyksta, kai prieglobos katalogas, kurį bandote prijungti, yra nustatytas tik skaityti. Norėdami tai patikrinti, naudokite komandą mount | grep "/srv" kad patvirtintumėte, ar jis prijungtas kaip tik skaitomas.
  3. Ar galiu išspręsti šią klaidą pakeisdamas leidimus su chown?
  4. Kartais. Keičiant nuosavybės teisę su sudo chown -R 1000:1000 /srv/gitlab-runner gali padėti, jei tai paprasta leidimų problema. Bet jei katalogas yra prijungtas kaip tik skaitomas failų sistemos lygiu, reikia atlikti tolesnę konfigūraciją.
  5. Ką reiškia permontavimas kaip skaitymas ir rašymas?
  6. Permontavimas su sudo mount -o remount,rw /srv leidžia įrašyti katalogą. Tai naudinga, jei katalogas buvo netyčia prijungtas kaip tik skaitomas, tačiau jis gali neišlikti perkraunant.
  7. Kodėl „Docker Compose“ rekomenduojama tvarkyti leidimus?
  8. „Docker Compose“ leidžia konfigūruoti tomus ir leidimus pakartotinai naudojamu formatu. Galite nurodyti nustatymus, pvz., privilegijuotą prieigą, kuri naudinga tokioms paslaugoms kaip „GitLab Runner“, kurioms reikia didesnių leidimų.
  9. Ar yra nuolatinių sprendimų, kaip išvengti tik skaitymo klaidų?
  10. Taip. Redagavimas /etc/fstab Kad katalogus būtų galima nuolat įrašyti įkrovos metu, yra įprastas būdas, nors tam reikia administratoriaus prieigos ir kruopštaus konfigūravimo.
  11. Ar konkrečios „Docker“ versijos gali turėti įtakos montavimo leidimams?
  12. Taip, ypač jei naudojate saugojimo tvarkykles, tokias kaip overlay2. „Docker“ versijos ir saugojimo tvarkyklių suderinamumo problemos gali turėti įtakos montavimo elgsenai.
  13. Kas yra Docker Root Dir ir kaip tai padeda?
  14. „Docker Root Dir“, parodyta docker info, čia „Docker“ saugo konteinerio duomenis. Pakeitus jį į rašomąjį kelią kartais galima išvengti montavimo klaidų.
  15. Ar yra būdas programiškai patikrinti, ar katalogas yra įrašomas?
  16. Taip, Python arba bash scenarijus galima naudoti norint patikrinti, ar katalogas yra įrašomas, todėl galite automatizuoti leidimų tikrinimą prieš paleisdami Docker komandas.
  17. Ar visiems „Docker“ konteineriams montuoti reikalinga privilegijuota prieiga?
  18. Ne, bet tokioms paslaugoms kaip „GitLab Runner“ gali prireikti atlikti tam tikras operacijas. Pridedama --privileged komandoje Docker suteikia konteineriui visą prieigą prie pagrindinio kompiuterio.
  19. Ar galiu išbandyti šiuos sprendimus vietoje prieš įdiegiant juos gamybinėje versijoje?
  20. Taip! „Docker“ leidžia lengvai išbandyti šias konfigūracijas. Galite nustatyti bandomuosius konteinerius su pakeistais leidimais arba naudoti vietinius Docker Compose failus, kad imituotumėte gamybos aplinkas.

„Docker Mount“ leidimo klaidų sprendimas

„Docker“ prijungimo klaidos, ypač tik skaitomose failų sistemose, gali būti varginančios, tačiau jas galima valdyti taikant tinkamą metodą. Suprasdami pagrindines priežastis, pvz., sistemos konfigūracijas arba „Docker“ saugyklos tvarkykles, galite veiksmingai išspręsti šias problemas. Leidimų nustatymas, prijungimo parinkčių tikrinimas ir Docker Compose naudojimas yra pagrindinės strategijos.

Kad išvengtumėte šios problemos ateityje, pabandykite nustatyti automatines patikras arba naudoti specialius prijungimo kelius, sukonfigūruotus „Docker“. Tai užtikrina sklandesnę sąveiką su Docker ribotose sistemose ir sumažina diegimo problemas. Proaktyviai pašalinus šiuos leidimus, „GitLab Runner“ ir panašios paslaugos gali veikti be pertrūkių. 🚀

Literatūra ir tolesnis skaitymas
  1. Išsamus „Docker“ apimties leidimų tyrimas ir trikčių šalinimas, naudojant praktinius sprendimus, kaip tvarkyti tik skaitymo klaidas konteinerių kataloguose. Norėdami sužinoti daugiau, apsilankykite Docker dokumentacija .
  2. Oficiali „GitLab Runner Docker“ vaizdo dokumentacija, kurioje išsamiai aprašoma „GitLab Runner“ konfigūracija ir naudojimas konteinerinėse aplinkose. Žr „GitLab Runner“ sistemoje „Docker“. .
  3. Išsamus vadovas apie „Linux“ failų sistemos leidimus ir montavimo parinktis, suteikiantis įžvalgų apie tik skaitymo problemas ir pakartotinio prijungimo komandas. Galimas adresu LinuxConfig .
  4. „Ubuntu Core“ sistemos architektūros ir konkrečių „Snap“ paketų apribojimų apžvalga, paaiškinanti galimus tik skaitymo sistemos tvirtinimus. Patikrinkite visą straipsnį apie Ubuntu pagrindinė dokumentacija .