簡體   English   中英

從容器內部訪問docker.sock

[英]Access docker.sock from inside a container

我正在運行一個jenkins docker容器,我需要從中構建並運行docker。 使用-v /var/run/docker.sock:/var/run/docker.sock啟動容器。 問題是,當jenkins(來自容器內部)試圖使用它時,我被拒絕訪問。

這是我到目前為止沒有運氣的嘗試:

  • 在主機中創建jenkins用戶並將其添加到docker組。
  • 使用-G jenkins參數啟動-G jenkins守護程序,以便套接字由jenkins組而不是docker組擁有。 Jenkins正在與一個jenkins用戶一起執行,該用戶屬於容器內的jenkins組。

唯一有效的是我完全不喜歡的“黑客”:我修改了容器內jenkins組的id以匹配docker.sock的組ID。

如何以更優雅的方式解決這個問題的任何建議將不勝感激。

這聽起來像是一個基本的Unix權限問題。 要訪問文件(或套接字),您需要(a)為root或(b)具有允許您根據文件模式進行訪問的數字UID或GID。

如果您在容器內運行某些東西並且希望它能夠訪問主機上的某些內容,那么您將不得不以root用戶身份在容器內運行,或者您必須完成uid / gid同步主機和容器之間。

處理后一個問題的一種方法是在啟動容器時傳入目標GID,然后在啟動CMD之前設置ENTRYPOINT腳本以建立適當的用戶/組。 就像是:

if [ "$DOCKER_GID" ]; then
    groupadd -g $DOCKER_GID hostdocker
    usermod -a -G hostdocker jenkins
fi

exec "$@"

我有類似的問題,最后只給了jenkins用戶無密碼的sudo權限。 這意味着我必須使用sudo為所有docker命令添加前綴,但它可以在主機之間移植並且可以移植。

你可以創建一個特殊的圖像與jenkins用戶烘焙了docker GID。這可能被稱為壞,因為它不可移植:

FROM jenkins

USER root

RUN groupadd -g 999 hostdocker && usermod -G hostdocker -a jenkins
RUN wget https://get.docker.io/builds/Linux/x86_64/docker-1.7.1 -O /usr/local/bin/docker && chmod +x /usr/local/bin/docker

USER jenkins

ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]

暫無
暫無

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

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