Docker 中的用戶

安德烈·科佩洛夫我們的 CTO 熱愛、積極使用和推廣 Docker。 在一篇新文章中,他解釋瞭如何在 Docker 中建立使用者。 與他們正確合作,為什麼使用者不應該保留 root 權限以及如何解決 Dockerfile 中指標不匹配的問題。

容器中的所有進程都將以 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 中使用外部變數 ENV и ARG。 指令詳細比較 這裡.

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

添加評論