【问题标题】:jenkins run docker command get permission deniedjenkins 运行 docker 命令获取权限被拒绝
【发布时间】:2021-11-02 07:14:38
【问题描述】:

我是詹金斯的新手。目前我有一个由 docker 启动的 jenkins 服务器,带有这个 docker-compose 文件:

version: '3.7'
services:
  jenkins:
    image: jenkins/jenkins:lts
    privileged: true
    user: root
    ports:
      - 50000:50000
    container_name: jenkins
    volumes:
      - ~/jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/local/bin/docker:/usr/local/bin/docker

然后我创建了一个简单的管道来测试 jenkins 中的 docker。这是管道脚本:

node {
    stage "Create build output"
   
    sh "docker info"

}

错误是下面的消息:

Started by user myuser
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pip
[Pipeline] {
[Pipeline] stage (Create build output)
Using the ‘stage’ step without a block argument is deprecated
Entering stage Create build output
Proceeding
[Pipeline] sh
+ docker info
/var/jenkins_home/workspace/test-pip@tmp/durable-eb4fd6e4/script.sh: 1: docker: Permission denied
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 127
Finished: FAILURE

在检查了一些其他主题之后,我已经完成了所有这些命令:

chmod 777 /var/run/docker.sock
sudo usermod -a -G docker $USER

但没有任何效果。我还为 jenkins 安装了 docker 插件。 通过以下命令进入 jenkins 容器后:

docker exec -it 9729efd670b7 /bin/bash

我执行 docker 命令:

docker info

但是找不到控制台打印命令:

bash: docker: command not found

有谁知道我应该配置什么让 jenkins 运行 docker?谢谢。

【问题讨论】:

  • 你能像这样运行这个命令吗sudo docker info
  • @DashrathMundkar 我试过了,但错误变为:bash: sudo: command not found
  • 我的操作系统是CentOS Linux release 8.4.2105 btw
  • jenkins 'execute script' build step Error: /bin/docker: Permission denied 类似地描述了与 SELinux 相关的问题。这个问题对你有帮助吗?
  • (在自定义映像的 Dockerfile 中使用包管理器安装 docker 二进制文件通常比尝试绑定挂载主机的二进制文件更好。这可能缺少共享库依赖项或用于完全错误的操作系统。不过,这些问题通常不会导致“权限被拒绝”错误。)

标签: docker jenkins docker-compose jenkins-plugins docker-in-docker


【解决方案1】:

有一些不同的可能性可以将 jenkins 运行到 docker 中,请参阅link 中的详细信息。
基本上,有三种解决方案:

  1. 扩展 jenkins 镜像以安装 docker
  2. 将 docker 主机挂载到 docker 容器
  3. 运行另一个包含 docker-in-docker 的镜像

在您的情况下,您可以使用第二种解决方案,但由于每种解决方案都有优点和不便之处,您可以尝试另一种。
尝试更改您的挂载路径以匹配应为 /usr/bin/docker 的容器路径。

【讨论】:

  • 非常感谢。在我将/user/local/bin/docker 更改为/user/bin/docker 后,现在它可以工作了。
【解决方案2】:

参见 this 演示项目,其中 jenkins 在 docker 容器中运行,其中包含 docker 客户端。

要在 Jenkins 容器中运行 docker 客户端,请遵循以下流程:

  • 构建自定义 Jenkins Dockefile
  • 在自定义 Jenkins Dockerfile 中复制 docker 客户端(例如,来自 dind 图像)
  • 使用绑定挂载将主机 docker 套接字公开给 Jenkins 容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多