【问题标题】:Jenkins dial unix /var/run/docker.sock: connect: permission denied MacOS詹金斯拨打 unix /var/run/docker.sock: connect: permission denied MacOS
【发布时间】:2019-07-03 05:56:33
【问题描述】:

我在本地运行 Jenkins,并且我的机器上也安装了 docker。

我有一个使用 Jenkins 文件的 Jenkins 工作

  1. 构建一个 Maven 项目
  2. 构建 docker 映像
  3. 部署到 docker hub。

我在 Jenkins 中安装了所有 docker 插件,但是在执行构建步骤时我得到...

Got permission denied while trying to connect to the Docker daemon 
socket at unix:///var/run/docker.sock: Post 
http://%2Fvar%2Frun%2Fdocker.sock/v1.39/build?
buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=w6ypm3t1b0qefyxh9omfvntru&shmsize=0&t=app-web&target=&ulimits=null&version=1: dial unix /var/run/docker.sock: connect: permission denied

我似乎无法更改权限

lrwxr-xr-x   1 macuser          staff              72 Jun 30 20:36 docker.sock -> /Users/john/Library/Containers/com.docker.docker/Data/docker.sock

非常感谢任何帮助

【问题讨论】:

    标签: macos docker jenkins


    【解决方案1】:

    您的主要问题是因为通过 Jenkins 使用的用户(可能名为 jenkins)没有足够的权限来运行 docker。

    所以你基本上需要让用户加入staff组。

    我前几天有answered这个问题,后半部分答案就是你要找的:How to add user to a group from Mac OS X command line?

    请对其进行测试,如果您在尝试将用户添加到 staff 组时得到的输出对您不起作用,请告诉我

    【讨论】:

    • 我尝试将 jenkins 用户添加到 docker 组,但它仍然无法正常工作。 Macs-MacBook-Pro:bin macuser$ dseditgroup -o read docker dsAttrTypeStandard:GeneratedUID - 9BCC1584-9187-4CA8-9890-9EAAB5A61B9B dsAttrTypeStandard:GroupMembership - jenkins macuser jenkins macuser jenkins dsAttrTypeStandard:GroupMembers - AAE95597-DC05-4228-8CEF-DC2A0AC1D5B4 AED68C44 -4B44-46D1-8E12-8E6CB3766B69 dsAttrTypeStandard:RecordName - docker dsAttrTypeStandard:RecordType - dsRecTypeStandard:Groups dsAttrTypeStandard:AppleMetaNodeLocation - /Local/Default
    • 也是人员组...Macs-MacBook-Pro:bin macuser$ dseditgroup -o 读取人员 dsAttrTypeStandard:SMBSID - S-1-5-32-545 dsAttrTypeStandard:GeneratedUID - ABCDEFAB-CDEF- ABCD-EFAB-CDEF00000014 dsAttrTypeStandard:AppleMetaNodeLocation - /Local/Default dsAttrTypeStandard:GroupMembers - FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000 dsAttrTypeStandard:RecordType - dsRecTypeStandard:Groups dsAttrTypeStandard:PrimaryGroupID - 20 dsAttrTypeStandard:RealName - Staff dsAttrTypeStandard:GroupMembership - root macuser _serialnumberd詹金斯
    • 谢谢,如果尝试了这个并重新启动了 docker 和 Jenkins,但仍然没有乐趣
    • docker 组不再与 macos 相关,因此您应该使用员工组,因为您可以看到员工组对套接字具有权限,因此其中的任何用户都将继承相同的权限。
    • 还要注意我添加到 cmets 的第二个链接使用的是不同的命令,我的意思是这个链接 stackoverflow.com/a/53813767/2336650
    【解决方案2】:

    使用 Docker for Mac,在容器内,您会发现 docker 套接字由 root 拥有(这是嵌入式 LinuxKit VM 的一部分)。我在我的 Jenkins 容器中使用以下入口点,并以 root 身份运行入口点,以自动重新配置容器内的 docker 组以匹配套接字文件的组 id,然后在运行 Jenkins 之前从 root 删除到 jenkins 用户应用程序本身。这具有可移植性的优点,能够在任何桌面或服务器环境上运行,无需将 docker GID 硬编码到容器中:

    #!/bin/sh
    
    # By: Brandon Mitchell <public@bmitch.net>
    # License: MIT
    # Source Repo: https://github.com/sudo-bmitch/jenkins-docker
    
    set -x
    
    # configure script to call original entrypoint
    set -- tini -- /usr/local/bin/jenkins.sh "$@"
    
    # In Prod, this may be configured with a GID already matching the container
    # allowing the container to be run directly as Jenkins. In Dev, or on unknown
    # environments, run the container as root to automatically correct docker
    # group in container to match the docker.sock GID mounted from the host.
    if [ "$(id -u)" = "0" ]; then
      # get gid of docker socket file
      SOCK_DOCKER_GID=`ls -ng /var/run/docker.sock | cut -f3 -d' '`
    
      # get group of docker inside container
      CUR_DOCKER_GID=`getent group docker | cut -f3 -d: || true`
    
      # if they don't match, adjust
      if [ ! -z "$SOCK_DOCKER_GID" -a "$SOCK_DOCKER_GID" != "$CUR_DOCKER_GID" ]; then
        groupmod -g ${SOCK_DOCKER_GID} -o docker
      fi
      if ! groups jenkins | grep -q docker; then
        usermod -aG docker jenkins
      fi
      # Add call to gosu to drop from root user to jenkins user
      # when running original entrypoint
      set -- gosu jenkins "$@"
    fi
    
    # replace the current pid 1 with original entrypoint
    exec "$@"
    

    您可以在以下位置找到完整示例,包括用于在映像中安装 docker 和 gosu 的 Dockerfile:https://github.com/sudo-bmitch/jenkins-docker

    我的基本映像中的fix-perms 脚本中也有同样的概念,可以应用于其他场景:https://github.com/sudo-bmitch/docker-base

    【讨论】:

    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 2015-05-31
    • 2017-08-13
    • 2019-12-17
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多