簡體   English   中英

從現有的 Dockerfile 派生 + 將 USER 設置為非 root

[英]Deriving FROM existing Dockerfile + setting USER to non-root

我正在嘗試找到一個通用的最佳實踐來:

  1. 采用任意(父)Dockerfile,例如,以 root 身份運行其容器化服務的官方 Docker 映像之一,
  2. 從中派生一個自定義(子)Dockerfile(通過FROM... ),
  3. 調整child使其運行與parent相同的服務,但作為非 root 用戶。

我已經搜索和嘗試了好幾天,但一直未能找到令人滿意的解決方案。

我想提出一種方法,例如類似於以下內容,只是為了調整用戶,原始服務運行為:

FROM mariadb:10.3

RUN chgrp -R 0 /var/lib/mysql && \
    chmod g=u /var/lib/mysql

USER 1234

但是,我一次又一次遇到的問題是,每當Dockerfile 將某些路徑聲明為VOLUME (在上面的示例中實際上是VOLUME /var/lib/mysql )時,這實際上使Dockerfile 無法調整文件權限對於該特定路徑。 在這種情況下chgrpchmod無效,因此由於文件訪問權限問題,生成的 docker 容器將無法成功啟動。

我知道VOLUME指令是按設計方式工作的,以及為什么會這樣,但對我來說,它似乎完全阻止了給定問題的簡單解決方案:采用 Dockerfile 並以簡單、干凈和簡約的方式對其進行調整以非 root 而不是 root 身份運行。

背景是:我正在嘗試在 Openshift 集群上運行任意 Docker 圖像。 默認情況下,Openshift 會阻止以 root 身份運行容器,我想保持這種方式,因為它看起來很理智,並且朝着正確的方向邁出了一步,安全方面。

這意味着像gosu這樣的解決方案,期望容器以 root 身份啟動以便在運行時放棄特權,在這里還不夠好。 我想要一種方法,它根本不需要容器以 root 身份啟動,而只需要以指定的USER甚至隨機 UID 身份啟動。

到目前為止,我發現的不滿意的方法是:

  • 復制Dockerfile 並以必要的方式調整(有效復制代碼)
  • sed / awk在構建期間通過所有服務的配置文件將原始VOLUME路徑替換為備用路徑,因此chgrpchmod可以工作(使原始VOLUME路徑成為孤立的)。

我真的不喜歡這些方法,因為它們需要真正深入了解Dockerfile 的邏輯和基礎架構以及服務本身的運行方式。

所以必須有更好的方法來做到這一點,對吧? 我錯過了什么? 非常感謝您的幫助。

卷掛載點的權限根本不重要,掛載覆蓋了任何底層權限。 此外,您可以在 Kubernetes 級別設置這種東西,而不用擔心 Dockerfile。 這通常是一個 PodSecurityPolicy,但您也可以在 Pod 本身的 SecurityContext 中設置它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM