【问题标题】:Permission Denied while trying to connect to Docker Daemon while running Jenkins pipeline in Macbook在 Macbook 中运行 Jenkins 管道时尝试连接到 Docker Daemon 时权限被拒绝
【发布时间】:2017-07-07 19:03:49
【问题描述】:

我正在尝试在我的 macbook 中运行 Jenkins 管道作业。我也有在本地运行的 docker 实例。最初,我在运行 Jenkins 作业时收到“docker command not found”错误。我通过添加符号链接修复了错误“ln -f -s /Applications/Docker.app/Contents/Resources/bin/* /usr/local/bin

我还应用了这两个更改,以便 jenkins 用户可以访问 docker 目录

  1. chmod -R 777 /Users/myUserName/Library/Containers/com.docker.docker/
  2. chmod -R 777 /Users/myUserName/Library/Containers/com.docker.helper/

我遇到以下错误

在尝试连接到 Docker 守护程序时获得权限被拒绝 unix:///var/run/docker.sock 处的套接字:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.27/containers/openjdk:8/json: 拨打 unix /var/run/docker.sock:连接:权限被拒绝 [管道] sh [测试] 运行shell脚本 + 搬运工拉 openjdk:8 警告:无法从守护进程获取默认注册表端点(在尝试连接到 Docker 守护进程套接字时获得权限被拒绝 在 unix:///var/run/docker.sock:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.27/info:拨unix /var/run/docker.sock:连接:权限被拒绝)。使用系统 默认:https://index.docker.io/v1/ 尝试在 unix:///var/run/docker.sock 连接到 Docker 守护程序套接字时获得权限被拒绝:发布 http://%2Fvar%2Frun%2Fdocker.sock/v1.27/images/create?fromImage=openjdk&tag=8: 拨打 unix /var/run/docker.sock:连接:权限被拒绝 [管道] } [管道] // 节点 [管道] 管道结束 错误:脚本返回退出代码 1 完成:失败

【问题讨论】:

  • 当心这个。说如果你在不真正知道自己在做什么的情况下执行 chmod,你可能会制造一个安全漏洞,这并没有什么坏处。 777 意味着任何人都拥有对资源的完全读写权限。在大多数情况下,这可能不是必需的。一般来说,寻找一种方法来调整用户的权限(组成员资格)而不是扩大资源可用性通常更有意义。

标签: macos docker jenkins jenkins-pipeline


【解决方案1】:

这是一个 docker 权限问题。将 jenkins 用户添加到 docker 组,如下所示:

usermod -aG docker ${USER}

【讨论】:

  • 感谢您的建议,但我在 mac 中没有 usermod 命令
  • Docker 的Post-installation steps for Linux 建议使用此 usermod 步骤,因此在 Linux 情况下可能仍然适用。
【解决方案2】:

有任何方法可以解决这个问题,我上周遇到过,我解决了,但是使用docker-compose,此设置可复制到docker,您可以创建一个指向docker.sock 位置的共享卷您的主机/var/run/docker.sock 到您的容器/var/run/docker.sockdocker.sock 的位置。像这样的:

version: '2'
services:
  jenkins:
    build:
      context: ./jenkins
    ports:
      - "8080:8080"
    expose:
      - "8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose

  nginx:
    build:
      context: ./nginx
    container_name: "prueba"
    links:
      - jenkins
    ports:
      - "80:80"
    depends_on:
      - jenkins

Innocent Anigbo 所提到的,要正常工作,您必须向socketsudo chown $USER:$USER /var/run/docker.sockdocker 组授予用户权限。

【讨论】:

  • 好的,我对我的系统应用了以下更改: 1. 创建一个 docker 组-“sudo dscl .-create /groups/docker”。 2.将jenkins用户分配给docker group-“sudo dseditgroup -o edit -a jenkins -t user docker”。 3. 将套接字分配给 docker-“sudo chown jenkins:jenkins /var/run/docker.sock”。但仍然看到同样的问题。
  • 现在,设置共享卷,使用 docker run 命令添加它-v /var/run/docker.sock:/var/run
【解决方案3】:

解决方案:-

这是我解决问题的方法,打开终端并输入此命令

sudo chmod 666 /var/run/docker.sock

【讨论】:

  • 这在 Jenkins docker 容器中运行良好(我的情况),否则它不安全,因为现在每个人都可以访问 docker。
【解决方案4】:

有点老套的解决方法:

  • DockerUser是安装Docker的用户
  • DockerUser 和 Jenkins 用户都在 staff 组中(使用 groups USERNAME 验证)

作为DockerUser:

$ chmod g+rx /Users/DockerUser/Library
$ chmod g+rx /Users/DockerUser/Library/Containers
$ chmod g+rx /Users/DockerUser/Library/Containers/com.docker.docker
$ chmod g+rw /Users/DockerUser/Library/Containers/com.docker.docker/Data/docker.sock

⚠️ 安全隐患

机器上的任何用户帐户(不仅仅是 Jenkins 用户)都已写入 访问所有 docker 容器/卷/任何东西并启动 他们喜欢的任何东西。

然后作为您的其他 (Jenkins) 用户,您应该能够执行以下操作来启动容器:

$ docker run --rm ubuntu uname -a
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
6a5697faee43: Pull complete
ba13d3bc422b: Pull complete
a254829d9e55: Pull complete
Digest: sha256:fff16eea1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
Status: Downloaded newer image for ubuntu:latest

Linux dc3d34c548e5 5.4.39-linuxkit #1 SMP Fri May 8 23:03:06 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

【讨论】:

    【解决方案5】:

    你需要将jenkins构建代理用户添加到docker组,然后重启jenkins才能生效:

    usermod -aG docker ${USER}
    systemctl restart jenkins
    

    【讨论】:

      【解决方案6】:

      你可以试试这个并为我工作:

      docker run --rm -p 8080:8080 -p 4040:4040 -v /var/run/docker.sock:/var/run/docker.sock -v $PWD/jenkins_home:/var/jenkins_home logimethods/jenkins
      

      【讨论】:

      • 很高兴它对你有用。但是,如果这个答案解释了该命令行中不同参数的目的是什么,以及每个参数如何影响结果,那么这个答案会对其他人有所帮助。
      • 这绝对不是正确的解决方案。我非常怀疑仅此一项就解决了您的问题。
      猜你喜欢
      • 2020-04-18
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2021-11-16
      • 2019-06-28
      相关资源
      最近更新 更多