容器中的所有進程都將以 root 使用者身分執行,除非您以特殊方式指定。 這看起來很方便,因為這個用戶沒有任何限制。 這就是為什麼從安全角度來看以 root 身分工作是錯誤的。 如果沒有一個頭腦清醒的人在具有 root 權限的本機電腦上工作,那麼許多人會在容器中以 root 身分運行進程。
總是存在允許惡意軟體從容器中逃逸並進入主機的錯誤。 假設最壞的情況,我們必須確保容器內的進程由主機上沒有任何權限的使用者執行。
創建用戶
在容器中建立使用者與在 Linux 發行版中建立使用者沒有什麼不同。 但是,對於不同的基礎映像,命令可能會有所不同。
對於基於 debian 的發行版,您需要將以下內容新增至 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) 和容器外具有存取該檔案的適當權限的使用者必須符合。 在這種情況下,用戶名並不重要。
通常在 Linux 電腦上,使用者的 UID 和 GID 等於 1000。這些識別碼被指派給電腦的第一個使用者。
找出您的識別碼很容易:
id
您將收到有關您的用戶的全面資訊。
將範例中的 2000 替換為您的標識符,一切都會好起來的。
為使用者指派 UID 和 GID
如果使用者是先前建立的,但您需要更改標識符,可以這樣做:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
如果使用alpine基礎鏡像,則需要安裝shadow套件:
RUN apk add —no-cache shadow
建構鏡像時在容器內傳遞使用者ID
如果您的 ID 與專案中所有工作人員的 ID 匹配,則只需在 Dockerfile 中指定此 ID 即可。 然而,使用者 ID 通常不符。
如何實現您想要的目標尚不清楚。 對我來說,這是掌握 Docker 過程中最困難的事情。 許多 Docker 使用者沒有意識到鏡像的生命週期有不同的階段。 首先,使用 Dockerfile 組裝映像。 從映像運行容器時,不再使用 Dockerfile。
使用者建立必須在建立鏡像時進行。 這同樣適用於確定啟動進程的使用者。 這意味著我們必須以某種方式在容器內傳遞 UID (GID)。
指令用於在 Dockerfile 中使用外部變數
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
您可以透過 docker-compose 傳遞參數,如下所示:
泊塢窗,撰寫
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS 要掌握 Docker 的所有複雜之處,僅僅閱讀文件或文章是不夠的。 你需要大量練習,你需要對 Docker 有一定的感覺。
來源: www.habr.com