【问题标题】:Jenkins: Can't connect to Docker daemon詹金斯:无法连接到 Docker 守护进程
【发布时间】:2016-11-01 11:57:59
【问题描述】:

我在 CentOS 机器上运行 Jenkins 和 Docker。我有一个 Jenkins 工作,它提取一个 Github 存储库并构建一个 Docker 映像。当我尝试运行作业时出现错误:

+ docker build -t myProject .
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
Build step 'Execute shell' marked build as failure
Finished: FAILURE

即使我已通过sudo usermod -aG docker jenkins 将 jenkins 添加到我的 docker 用户组并重新启动我的机器,也会出现此问题。我该如何解决这个问题?

顺便说一句,如果尝试将命令更改为sudo docker build -t myProject .,我只会收到错误sudo: sorry, you must have a tty to run sudo

【问题讨论】:

  • Centos 机器上返回的“sudo service docker status”是什么?
  • 它是活跃的:sudo service docker status Redirecting to /bin/systemctl status docker.service ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2016-06-29 14:10:13 UTC; 5h 40min ago Docs: https://docs.docker.com Main PID: 24858 (docker) Memory: 30.1M
  • 好吧,据我所知:Jenkins 没有在 docker 中运行?
  • 不,我只是有一个 Jenkins 作业,它有一个 shell 脚本构建步骤,它调用 docker build -t myProject . 命令。 Docker 已安装并在机器上运行。

标签: jenkins docker centos


【解决方案1】:

我使用的是 jenkins-blueocean

我的问题是我想使用 docker.sock 并使用与托管系统相同的守护程序,而不是从容器设置的 docker 守护程序部署

为此,请确保您将 DOCKER_HOST 环境正确设置为您在卷中指定的 docker.socket

--env DOCKER_HOST=unix:///var/run/docker.sock \

并通过指定其 docker.sock 将 docker 守护进程指定为与托管您要推迟的容器的那个相同

--volume /var/run/docker.sock:/var/run/docker.sock \

确保您没有指定任何 TLS 参数,否则它可能会尝试使用 HTTPS 进行通信。

删除这样的东西:

--env DOCKER_TLS_VERIFY=1 \

Docker 文件:

FROM jenkins/jenkins:2.263.4-lts-jdk11
USER root
RUN apt-get update && apt-get install -y apt-transport-https \
       ca-certificates curl gnupg2 \
       software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/debian \
       $(lsb_release -cs) stable"
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins blueocean:1.24.4

运行命令:

docker run \
  --name jenkins-blueocean \
  --rm \
  --detach \
  --network jenkins \
  --env DOCKER_HOST=unix:///var/run/docker.sock \
  --env DOCKER_CERT_PATH=/certs/client \
  --publish 8080:8080 \
  --publish 50000:50000 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  myjenkins-blueocean:1.1

【讨论】:

    【解决方案2】:

    安装 Jenkins 和 Docker 之后。 将 jenkins 用户添加到 dockergroup(就像你做的那样)

    sudo gpasswd -a jenkins docker
    

    编辑以下文件

    vi /usr/lib/systemd/system/docker.service
    

    并编辑此规则以公开 API:

    ExecStart=/usr/bin/docker daemon -H unix:// -H tcp://localhost:2375
    

    不要使用 ExecStart 创建新行,只需在现有行的末尾添加命令即可。

    现在是时候重新加载并重新启动 Docker 守护进程了

    systemctl daemon-reload
    systemctl restart docker
    

    然后重启jenkins,你应该可以在jenkins作业中以jenkins用户的身份执行docker命令了

    sudo service jenkins restart
    

    【讨论】:

    • 谢谢,这行得通。只是好奇,将 TCP 地址添加到 ExecStart 行对 Docker 以及它与 Jenkins 的通信方式有何影响?
    • 所以Jenkins不能直接调用Docker,即使它安装在同一台机器上?
    【解决方案3】:

    对我来说解决办法是……

    重新加载并重启 Docker 守护进程

    systemctl daemon-reload
    systemctl restart docker
    

    然后到

    通过管理 Jenkins -> 管理节点 -> 断开代理断开 docker Jenkins 代理。

    然后重新连接代理,该代理会将用户保留在 docker 组中。

    【讨论】:

      【解决方案4】:

      您不能使用myProject 作为标签名称。 图片名称和标签必须全部小写。

      invalid argument "myProject" for "-t, --tag" flag: invalid reference format: repository name must be lowercase
      See 'docker build --help'.
      

      如果你使用 docker-compose,你会看到一个误导性的错误

      Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
      
      If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
      

      https://github.com/docker/compose/issues/2816

      【讨论】:

        【解决方案5】:

        我和 Jenkins 有同样的问题。

        我确实通过在 docker-compose.yml 上添加 /var/run/docker.sock:/var/run/docker.sock 来修复它:

          jenkins:
          container_name: jenkins
          build: "jenkins/"
          ports:
            - "8080:8080"
          environment:
            - JAVA_OPTS:-Djava.awt.headless=true
          volumes:
            - /var/jenkins_home
            - /var/run/docker.sock:/var/run/docker.sock
        

        【讨论】:

        • 这对我有用。谢谢。我正在使用 Kubernetes pod temaplce,所以需要添加:hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
        • @xbmono 你能分享你的模板吗,因为我这样做对我不起作用
        • 我找不到该代码,因为我稍后更改了它。所以目前我在 jenkins 共享库中有这个模板:podTemplate(label: config.podLabel, namespace: 'default', name: 'jenkins-build', yaml: yamlConfigString, cloud: 'kubernetes', volumes: [ emptyDirVolume(mountPath: '/var/lib/docker', memory: false) ], imagePullSecrets: config.imagePullSecret, idleMinutes: config.podIdleTimeInMin ) { body() } 并且主体只是标准的 kubernetes pod
        • 你好,可以分享一下构建jenkins的dockerFile文件吗?
        【解决方案6】:

        @lvthillo,你的回答很好,但还不够。您还需要创建 docker 组。请参阅 Docker 的安装后步骤 以非 root 用户身份管理 Docker https://docs.docker.com/engine/installation/linux/linux-postinstall/#manage-docker-as-a-non-root-user

        将运行 jenkins 的用户添加到 docker 组。

        例如如果你在 jenkins 用户下运行 Jenkins 服务器:

        第 1 步:创建 Docker 组

        sudo groupadd docker
        

        第 2 步:将您的用户添加到 docker 组:

        sudo usermod -aG docker jenkins
        

        第 3 步:退出并以 jenkins 身份重新登录,然后进行测试:

        docker ps
        CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
        

        docker 组在启动时会被 docker 守护进程特殊处理。该组中的任何用户现在都可以在没有 sudo 的情况下调用 docker。小心使用它。

        https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface

        【讨论】:

          【解决方案7】:

          另一种选择是将您的 Jenkins docker 主机指向“unix:///var/run/docker.sock”

          这不是运行实际的 docker 主机并打开它。

          【讨论】:

            猜你喜欢
            • 2018-12-05
            • 1970-01-01
            • 2014-03-19
            • 1970-01-01
            • 2017-06-14
            • 1970-01-01
            • 2021-10-20
            • 2016-04-04
            • 2020-06-03
            相关资源
            最近更新 更多