Docker дахь хэрэглэгч

Андрей Копылов, манай CTO Docker-д дуртай, идэвхтэй ашигладаг, сурталчилдаг. Шинэ нийтлэлдээ тэрээр Docker дээр хэрэглэгчдийг хэрхэн үүсгэх талаар тайлбарлав. Тэдэнтэй зөв ажиллах, хэрэглэгчид яагаад үндсэн эрхийг үлдээж болохгүй, Dockerfile дахь таарахгүй үзүүлэлтүүдийн асуудлыг хэрхэн шийдвэрлэх талаар.

Хэрэв та үүнийг тусгай аргаар зааж өгөхгүй бол контейнер доторх бүх процессууд үндсэн хэрэглэгчээр ажиллах болно. Энэ хэрэглэгч ямар ч хязгаарлалтгүй тул энэ нь маш тохиромжтой юм шиг санагдаж байна. Ийм учраас root байдлаар ажиллах нь аюулгүй байдлын үүднээс буруу юм. Хэрэв тэдний хэн ч локал компьютер дээр root эрхээр ажилладаг бол олонх нь контейнер дотор root дор ажилладаг.

Хортой програм нь савнаас гарч, үндсэн компьютерт нэвтрэх боломжийг олгодог алдаанууд үргэлж байдаг. Хамгийн муугаар бодоход бид контейнер доторх процессуудыг хост машин дээр ямар ч эрхгүй хэрэглэгч ажиллуулж байгаа эсэхийг баталгаажуулах ёстой.

Хэрэглэгч үүсгэх

Контейнер дотор хэрэглэгч үүсгэх нь Линукс түгээлт дээр үүсгэхээс ялгаагүй. Гэсэн хэдий ч, өөр өөр үндсэн зургийн хувьд тушаалууд өөр байж болно.

Дебиан дээр суурилсан түгээлтийн хувьд та Dockerfile-д дараахь зүйлийг нэмэх хэрэгтэй.

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

Уулын хувьд:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

Хэрэглэгчээс ажиллаж буй процессууд

Дараагийн бүх процессыг UID 2000-тай хэрэглэгчээр ажиллуулахын тулд дараахыг ажиллуулна уу:

USER 2000

Дараагийн бүх процессыг зангилааны хэрэглэгчээр ажиллуулахын тулд дараахыг ажиллуулна уу:

USER node

Дэлгэрэнгүйг эндээс уншина уу баримт бичиг.

Суурилуулах хэмжээ

Контейнер дотор эзлэхүүнийг холбохдоо хэрэглэгчийг файл унших, бичих боломжийг олгоно. Үүнийг хийхийн тулд контейнер доторх хэрэглэгчийн UID (GID) болон файлд хандах зохих зөвшөөрөлтэй контейнерийн гаднах хэрэглэгчийн таарч байх ёстой. Энэ тохиолдолд хэрэглэгчийн нэр хамаагүй.

Ихэнхдээ Линукс компьютер дээр хэрэглэгчийн UID болон GID нь 1000-тай тэнцүү байдаг. Эдгээр таниулбаруудыг компьютерийн анхны хэрэглэгчдэд оноодог.

Таны танигчийг олоход хялбар байдаг:

id

Та хэрэглэгчийнхээ талаар дэлгэрэнгүй мэдээлэл авах болно.
Жишээнүүдээс 2000-ыг танигчаар солиод бүх зүйл сайхан болно.

Хэрэглэгчид UID болон GID оноож байна

Хэрэв хэрэглэгч өмнө нь үүсгэгдсэн боловч танигчийг өөрчлөх шаардлагатай бол та үүнийг дараах байдлаар хийж болно.

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Хэрэв та уулын үндсэн зургийг ашиглаж байгаа бол сүүдрийн багцыг суулгах хэрэгтэй:

RUN apk add —no-cache shadow

Зургийг бүтээхдээ хэрэглэгчийн ID-г контейнер дотор дамжуулах

Хэрэв таны ID болон төсөл дээр ажиллаж буй бүх хүмүүсийн ID таарч байвал Dockerfile дотор энэ ID-г зааж өгнө үү. Гэсэн хэдий ч ихэнхдээ хэрэглэгчийн ID таарахгүй байна.

Хүссэн зүйлдээ хэрхэн хүрэх нь тодорхойгүй байна. Миний хувьд энэ нь Docker-ийг эзэмших явцад хамгийн хэцүү зүйл байсан. Олон докер хэрэглэгчид зургийн амьдралд янз бүрийн үе шат байдгийг ойлгодоггүй. Эхлээд зургийг Dockerfile ашиглан угсарна. Зурган дээрээс контейнер ажиллуулах үед Dockerfile ашиглахаа больсон.

Зургийг бүтээх үед хэрэглэгч бий болох ёстой. Процессыг эхлүүлсэн хэрэглэгчийг тодорхойлоход мөн адил хамаарна. Энэ нь бид чингэлэг доторх UID (GID)-г ямар нэгэн байдлаар дамжуулах ёстой гэсэн үг юм.

Dockerfile доторх гадаад хувьсагчдыг ашиглахын тулд удирдамжийг ашигладаг ENV и ARG. Заавруудын нарийвчилсан харьцуулалт энд.

Докер файл

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

Та аргументуудыг docker-compose-ээр дараах байдлаар дамжуулж болно:

docker-бичих

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

Жич Докерын бүх нарийн ширийнийг эзэмшихийн тулд баримт бичиг эсвэл нийтлэлийг уншихад хангалттай биш юм. Та маш их дадлага хийх хэрэгтэй, чи Docker-ийн талаар мэдрэх хэрэгтэй.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх