Uzanto en Docker

Andrej Kopylov, nia CTO, amas, aktive uzas kaj antaŭenigas Docker. En nova artikolo, li klarigas kiel krei uzantojn en Docker. Ĝusta laboro kun ili, kial uzantoj ne restu kun radikaj rajtoj kaj kiel solvi la problemon de miskongruaj indikiloj en la Dockerfile.

Ĉiuj procezoj en la ujo funkcios kiel la radika uzanto, krom se vi specifas ĝin en speciala maniero. Ĉi tio ŝajnas tre oportuna, ĉar ĉi tiu uzanto ne havas limigojn. Tial labori kiel radiko estas malĝusta de sekureca vidpunkto. Se neniu en sia prudento laboras sur la loka komputilo kun radikrajtoj, tiam multaj ruliĝas procezoj sub radiko en ujoj.

Ĉiam estas cimoj, kiuj permesos al malware eskapi el la ujo kaj atingi la gastigan komputilon. Supozante la plej malbonan, ni devas certigi, ke procezoj ene de la ujo estas kuritaj de uzanto, kiu ne havas iujn ajn rajtojn sur la gastiga maŝino.

Kreante uzanton

Krei uzanton en ujo ne diferencas de krei ĝin en Linuksaj distribuoj. Tamen, la komandoj povas varii por malsamaj bazaj bildoj.

Por debian-bazitaj distribuoj, vi devas aldoni la jenon al la Dockerfile:

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

Por alpa:

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

Kurante procezojn de la uzanto

Por ruli ĉiujn postajn procezojn kiel uzanto kun UID 2000, rulu:

USER 2000

Por ruli ĉiujn postajn procezojn kiel la noda uzanto, rulu:

USER node

Legu pli en dokumentado.

Muntaj volumoj

Dum muntado de volumoj ene de ujo, donu al la uzanto la kapablon legi kaj/aŭ skribi dosierojn. Por fari tion, la UID (GID) de la uzanto en la ujo kaj la uzanto ekster la ujo, kiu havas la taŭgajn permesojn por aliri la dosieron, devas kongrui. En ĉi tiu kazo, uzantnomoj ne gravas.

Ofte en Linuksa komputilo, UID kaj GID de uzanto estas egalaj al 1000. Ĉi tiuj identigiloj estas asignitaj al la unua uzanto de la komputilo.

Eltrovi viajn identigilojn estas facile:

id

Vi ricevos ampleksajn informojn pri via uzanto.
Anstataŭigu 2000 el la ekzemploj per via identigilo kaj ĉio estos en ordo.

Asignante UID kaj GID al uzanto

Se la uzanto estis kreita antaŭe, sed vi devas ŝanĝi la identigilojn, vi povas fari ĝin tiel:

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

Se vi uzas la alpan bazan bildon, vi devas instali la ombran pakon:

RUN apk add —no-cache shadow

Transdono de la uzantidentigilo ene de la ujo dum konstruado de la bildo

Se via identigilo kaj la identigiloj de ĉiuj homoj, kiuj laboras en la projekto, kongruas, tiam simple specifu ĉi tiun identigilon en la Dockerfile. Tamen, ofte la uzantidentigiloj ne kongruas.

Kiel atingi tion, kion vi volas, ne estas tuj klara. Por mi, ĉi tio estis la plej malfacila afero en la procezo de majstrado de Docker. Multaj docker-uzantoj ne rimarkas, ke ekzistas malsamaj etapoj en la vivo de bildo. Unue, la bildo estas kunvenita uzante Dockerfile. Dum rulado de ujo de bildo, la Dockerfile ne plu estas uzata.

Uzantkreado devas okazi kiam la bildo estas konstruita. La sama validas por determini la uzanton sub kiu procezoj estas lanĉitaj. Ĉi tio signifas, ke ni devas iel pasi la UID (GID) ene de la ujo.

Direktivoj estas uzataj por uzi eksterajn variablojn en la Dockerfile ENV и ARG. Detala komparo de direktivoj tie.

dockerfile

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

Vi povas pasi argumentojn per docker-compose jene:

docker-compose

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

PS Por regi ĉiujn komplikaĵojn de Docker, ne sufiĉas legi la dokumentaron aŭ artikolojn. Vi devas multe ekzerci, vi devas ekkompreni Docker.

fonto: www.habr.com

Aldoni komenton