Wszystkie procesy w kontenerze będą uruchamiane jako użytkownik root, chyba że określisz to w specjalny sposób. Wydaje się to bardzo wygodne, ponieważ ten użytkownik nie ma żadnych ograniczeń. Właśnie dlatego praca jako root jest zła z punktu widzenia bezpieczeństwa. Jeśli nikt przy zdrowych zmysłach nie pracuje na komputerze lokalnym z uprawnieniami roota, wówczas wiele procesów uruchamia się w kontenerach z uprawnieniami roota.
Zawsze znajdą się błędy, które umożliwią złośliwemu oprogramowaniu wydostanie się z kontenera i przedostanie się na komputer hosta. Zakładając najgorsze, musimy zadbać o to, aby procesy wewnątrz kontenera były uruchamiane przez użytkownika, który nie ma żadnych uprawnień na komputerze-hoście.
Tworzenie użytkownika
Tworzenie użytkownika w kontenerze nie różni się niczym od tworzenia go w dystrybucjach Linuksa. Jednakże polecenia mogą się różnić w przypadku różnych obrazów podstawowych.
W przypadku dystrybucji opartych na Debianie musisz dodać następujące elementy do pliku Dockerfile:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Dla alpejskiego:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Uruchamianie procesów od użytkownika
Aby uruchomić wszystkie kolejne procesy jako użytkownik z UID 2000, uruchom:
USER 2000
Aby uruchomić wszystkie kolejne procesy jako użytkownik węzła, uruchom:
USER node
Czytaj więcej w
Mocowanie objętości
Montując woluminy w kontenerze, zapewnij użytkownikowi możliwość odczytu i/lub zapisu plików. Aby to zrobić, UID (GID) użytkownika w kontenerze i użytkownika poza kontenerem, który ma odpowiednie uprawnienia dostępu do pliku, muszą być zgodne. W tym przypadku nazwy użytkowników nie mają znaczenia.
Często na komputerze z systemem Linux identyfikatory UID i GID użytkownika są równe 1000. Identyfikatory te są przypisane do pierwszego użytkownika komputera.
Znalezienie swoich identyfikatorów jest łatwe:
id
Otrzymasz kompleksowe informacje o swoim użytkowniku.
Zamień 2000 z przykładów na swój identyfikator i wszystko będzie dobrze.
Przypisanie UID i GID użytkownikowi
Jeśli użytkownik został utworzony wcześniej, ale potrzebujesz zmienić identyfikatory, możesz to zrobić w następujący sposób:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Jeśli używasz podstawowego obrazu Alpine, musisz zainstalować pakiet cieni:
RUN apk add —no-cache shadow
Przekazywanie identyfikatora użytkownika wewnątrz kontenera podczas budowania obrazu
Jeśli Twój identyfikator i identyfikatory wszystkich osób pracujących nad projektem są zgodne, po prostu określ ten identyfikator w pliku Dockerfile. Często jednak identyfikatory użytkowników nie są zgodne.
Jak osiągnąć to, czego chcesz, nie jest od razu jasne. Dla mnie to była najtrudniejsza rzecz w procesie masteringu Dockera. Wielu użytkowników dokera nie zdaje sobie sprawy, że istnieją różne etapy życia obrazu. Najpierw obraz jest składany przy użyciu pliku Dockerfile. Podczas uruchamiania kontenera z obrazu plik Dockerfile nie jest już używany.
Tworzenie użytkownika musi nastąpić podczas tworzenia obrazu. To samo dotyczy określenia użytkownika, w ramach którego uruchamiane są procesy. Oznacza to, że musimy w jakiś sposób przekazać UID (GID) do wnętrza kontenera.
Dyrektywy służą do używania zmiennych zewnętrznych w pliku Dockerfile
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Możesz przekazywać argumenty za pomocą docker-compose w następujący sposób:
dokować-komponować
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS Aby opanować wszystkie zawiłości Dockera, nie wystarczy przeczytać dokumentację czy artykuły. Musisz dużo ćwiczyć, musisz wyczuć Dockera.
Źródło: www.habr.com