簡體   English   中英

Permission denied error invoking Docker on Mac host from inside Docker Ubuntu 容器作為非根用戶

[英]Permission denied error invoking Docker on Mac host from inside Docker Ubuntu container as non-root user

I'm trying to invoke docker on my OSX host running Docker for Mac 17.06.0-ce-mac17 from inside a running jenkins docker container ( jenkins:latest ), per the procedure described at http://jpetazzo.github.io/ 2015/09/03/不要使用 docker-in-docker-for-ci/

我將 /var/run/docker.sock 安裝到容器中,我在其中粘貼了一個 ubuntu docker 二進制文件,並且它能夠執行 - 但是當我運行例如“docker ps”時,我從容器內部以用戶“jenkins”身份運行

嘗試連接到位於 unix 的 Docker 守護進程套接字時獲得權限被拒絕:獲取http://%2Fvar%2Frun%2Fdocker.sock/v1.30/containers/json?all= 1 :撥打 unix /var/run/docker.sock: 連接:權限被拒絕。

如果我以 root (docker exec -u 0) 身份連接到容器,它仍然可以工作。

我需要 jenkins 用戶才能運行它。 我嘗試添加一個 docker 組並在 ubuntu 容器內向其添加 jenkins 但這沒有幫助,因為它與外部無關,Mac 的 Docker 無法像在 linux 上運行它一樣工作,您可以在其中進行半簡單操作uid/gid 匹配。 我想分發這個容器,以便回答 go 和破解我的 Docker 的一部分,用於 Mac 安裝不會真正幫助我。 如果可以的話,我寧願不以 root 身份運行整個 jenkins 設置。 (我還嘗試以特權方式運行容器,但沒有幫助。)

根據Permission Denied while trying to connect to Docker Daemon while running Jenkins pipeline in Macbook 中的建議,我手動將容器內的 /var/run/docker.sock 文件更改為 881438880936288,現在 jenkins 可以運行 docker。但我遇到了麻煩想出一個可分發容器的解決方案——我不能在 Dockerfile 中執行該操作,因為該文件尚不存在,並且填充到入口點也無濟於事,因為它以 jenkins 運行。

我需要做什么才能構建和運行一個圖像,該圖像將在我的 Mac 上作為容器內部的非根用戶運行外部 docker 容器?

另一種對我有用的方法 - 將uid參數設置為擁有/var/run/docker.sock的uid(在我的情況下為501)。 不確定Dockerfile的語法,但對於docker-compose.yml,它是這樣的:

version: 3
services:
  jenkins:
    build:
      context: ./JENKINS
      dockerfile: Dockerfile
      args:
        uid: 501
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ...

請注意,這是基於使用Dockerfile構建jenkins圖像,因此遺漏了許多細節。 這里的關鍵是uid: 501下的args

我得到了這個工作,至少是自動化的,但目前只用於Mac的docker。 Docker for Mac具有唯一的文件權限模型 chowning /var/run/docker.sock給jenkins用戶手動工作,它會在容器重啟甚至映像重新生成時保持不變,但不會重啟docker守護進程。 另外,您無法在Dockerfile中執行chown,因為docker.sock尚不存在,並且您無法在入口點執行此操作,因為它以jenkins的形式運行。

所以我所做的是將jenkins添加到“staff”組,因為在我的Mac上,/ var / run / disker.sock被符號鏈接到/Users//Library/Containers/com.docker.docker/Data/s60是uid和gid的工作人員。 這使jenkins用戶可以在主機上運行docker命令。

Dockerfile:

FROM jenkins:latest

USER root

RUN \
    apt-get update && \
    apt-get install -y build-essential && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY docker /usr/bin/docker

# To allow us to access /var/run/docker.sock on the Mac
RUN gpasswd -a jenkins staff

USER jenkins

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

docker-compose.yml文件:

version: "3"
services:
  jenkins:
    build: ./cd_jenkins
    image: cd_jenkins:latest
    ports:
      - "8080:8080"
      - "5000:5000"
    volumes:
      - ./jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock

然而,這對於其他系統來說是不可移植的(並且取決於那個停靠“mac staff”的docker“工作人員”,我想這是不可保證的)。 我喜歡建議的改進,使這個解決方案適用於主機系統。 在jenkins docker容器內的執行docker host命令等問題中建議的其他選項包括:

  • 安裝sudo並讓jenkins sudo並使用sudo運行所有docker命令:添加安全問題
  • “將jenkins添加到docker組” - 僅限UNIX,可能依賴於從主機到容器的gid匹配嗎?
  • Setuid包含的docker可執行文件可能有效,但與sudo具有相同的安全性提升問題。

請遵循: https//forums.docker.com/t/mounting-using-var-run-docker-sock-in-a-container-not-running-as-root/34390

基本上,您需要做的就是更改容器內的/var/run/docker.sock權限並使用sudo運行docker。

我創建了一個可以用來幫助的Dockerfile:

FROM jenkinsci/blueocean:latest

USER root
# change docker sock permissions after moutn
RUN if [ -e /var/run/docker.sock ]; then chown jenkins:jenkins /var/run/docker.sock; fi

感謝@mxyzplk 的帖子。

它對我有用:“手動向 MacOS 用戶添加 /var/run/docker.sock 可以工作,並且它會在容器重新啟動甚至圖像重新生成時持續存在,但不會在 docker 守護進程重新啟動之后。”

我的命令記錄

暫無
暫無

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

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