簡體   English   中英

以非 root 用戶身份運行 docker 或以 root 用戶身份在 tomcat 上運行 jenkins

[英]Running docker as non-root user OR running jenkins on tomcat as root user

我正在嘗試使用 docker-maven 插件構建一個 docker 鏡像,並計划使用 jenkins 執行 mvn 命令。 我將 jenkins.war 部署在 tomcat 實例上,而不是作為非根用戶運行的獨立應用程序。 問題是 docker 需要以 root 用戶身份運行,因此 maven 命令需要以 root 用戶身份運行,因此 jenkins/tomcat 需要以 root 用戶身份運行,這不是一個好的做法(盡管我的非 root 用戶是也 sudoer 所以我想不會很重要)。

所以最重要的是,我看到了兩個解決方案:以非 root 用戶身份運行 docker(並且需要有關如何執行此操作的幫助)或者需要以 root 用戶身份運行 jenkins(並且不確定如何實現,因為我更改了環境變量 /config 和仍然沒有切換到根)。

關於選擇哪種解決方案以及如何實施的任何建議?

問題是docker需要以root用戶運行,所以maven命令需要以root用戶運行,

不,docker run 可以使用-u ( --user ) 參數來完成,以便在容器內使用非 root 用戶。

以非 root 用戶身份運行 docker

您的用戶(在主機上)需要成為docker group 的一部分 然后您可以使用該用戶運行 docker 服務。

正如所評論的,這不是很安全。
看:

最后一個鏈接以以下發現結束:

  • 如果有一個已知的 uid 容器內的進程正在執行,它可以像限制對主機系統的訪問一樣簡單,以便來自容器的 uid 具有有限的訪問權限。
  • 更好的解決方案是使用--user啟動具有已知 uid 的容器(您也可以使用用戶名,但請記住,這只是從主機的用戶名系統提供 uid 的一種更友好的方式),然后限制對 uid 的訪問在您決定容器將作為.
  • 由於 uid 和用戶名(以及 gids 和組名)如何從容器映射到主機,指定容器化進程運行的用戶可以使進程看起來由容器內部和外部的不同用戶擁有。

關於最后一點,您現在有用戶命名空間 (userns) 重新映射(從 docker 1.10 開始,但我建議使用 17.06,因為問題 33844 )。

我也堅持如何設置 docker 構建服務器。

這是我現在看到的基本事實……

  • Docker 命令需要 root 權限

    • 這是因為如果可以運行任意 docker 命令,則您在主機上擁有與 root 相同的權力。 (您可以構建一個在內部以 root 身份運行的容器,將文件系統掛載到主機上的任何位置,從而允許任何 root 操作。)
  • “docker”組是一個彌天大謊恕我直言。 它實際上與使成員成為根用戶相同。

  • 我能看到為非 root 用戶使用任何類型的安全包裝 docker 的唯一方法是構建自定義 bash 腳本以啟動非常具體的 docker 命令,然后仔細審核這些命令的安全隱患,然后將這些腳本添加到 sudoers文件(向非 root 用戶授予無密碼 sudo)。

在我們將 docker 集成到開發管道中的世界中(例如,將 docker 命令放入 Maven 構建或允許開發人員對 docker 構建服務器的構建定義進行任意更改),我知道您如何維護任何安全性。

從上周的大量搜索和研究中調試這個問題。

我發現運行一個 maven docker 容器,因為非 root 將傳遞用戶標志,例如 -u 1000

但要使其正常工作,用戶需要位於映像的 /passwd 目錄中才能解決此問題,您可以將主機 (Jenkins) /etc/passwd 目錄添加到 docker 映像並使用非 root 用戶。

從 docker run 容器上的系統命令參數添加以下內容以將正確的卷掛載到 mvn 映像,以允許主機非 root 用戶映射到 maven 容器內。

-v /share:/share -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro -v "$HOME/.m2":/var/maven/.m2:z -w /usr/src/mymaven -e MAVEN_CONFIG=/var/maven/.m2 -e MAVEN_OPTS="-Duser.home=/var/maven"

我知道這可能不是最有用的答案,但它應該可以以非 root 身份運行 mvn 容器,專門運行 otj-embedded-pg 進行集成測試,這些測試在本地通過良好但在 Jenkins 服務器上失敗。

請參閱此鏈接OTJ_EMBEDDED_RUN_IN_CI_SERVER

由於該線程上的大多數海報建議創建一個新圖像,因此沒有必要這樣做,您可以使用上面列出的命令運行最新的 maven docker 圖像,它可以正常工作

希望這可以幫助可能陷入此問題的人並節省他們幾個小時的工作時間。

暫無
暫無

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

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