当前位置: 首页 > 知识库问答 >
问题:

无法通过Jenkins声明性管道以代理身份在Docker映像中pip安装

张翰海
2023-03-14

我还有一个问题,就是通过Jenkins声明性管道运行Docker的权限。我想通过Docker容器中的Jenkins作业构建并发布Python包:

pipeline {

  agent {
    docker {
      image 'python:3.7'
      label 'docker && linux'
    }
  }

  environment {
    PACKAGE_VERSION = readFile 'VERSION'
  }

  stages {

    stage('Package') {
      steps {
        sh 'python -V'
        sh 'python -m pip install -r requirements.txt --user --no-cache'
        sh 'python setup.py sdist'
      }
    }

    stage('Deploy') {
      steps {
        ...
      }
    }

  }

  post {
    always {
      cleanWs()
    }
  }

}

但是,我不允许pip安装由于PermissionError

python-mpip安装-r要求。txt——用户——没有缓存要求已经满足:setuptools位于/usr/local/lib/python3中。7/站点包(来自-r requirements.txt(第1行))(40.0.0)收集pytest(来自-r requirements.txt(第2行))
下载https://files.pythonhosted.org/packages/9e/a1/8166a56ce9d89fdd9efcae5601e71758029d90e5644e0b7b6eda07e67c35/pytest-3.7.0-py2.py3-none-any.whl(202kB)收集数据

由于环境错误,无法安装软件包:[Errno 13]权限被拒绝:/。本地检查权限。

如何修复这些权限?

共有3个答案

赫连坚
2023-03-14

withEnv([“HOME=${env.WORKSPACE}]”){}是键。此外,它还可以像这样使用:

node {
    def customImage = docker.build(...)
    customImage.inside {
        withEnv(["HOME=${env.WORKSPACE}"]) {
            sh '...'
        }
    }
}
吴谦
2023-03-14

在Jenkins系统上设置Docker代理后,我运行了一个非常类似的管道,所以我认为我的设置是错误的。使用您的帖子中的注释,我制定了以下解决方案:

首先,您需要是容器中的root用户,因此将代理声明更改为类似于以下内容:

agent {
    docker {
        image "python:3.7"
        args '--user 0:0'
    }
}

现在我可以使用pip安装了!但是,该作业的后续运行将尝试运行git clean,并失败,因为容器中的构建文件是由root创建的。为了解决这个问题,我在容器中运行了clean命令作为我的最后一步:

steps {
    sh 'git clean -fdx'
}

更新:

我发现了一个问题,一个失败的构建无法清理,并在它之后杀死了所有的构建。为了解决这个问题,我将clean操作作为始终运行的构建后任务:

post {
    cleanup {
        cleanWs()
    }
}
仰雅昶
2023-03-14

我找到了我自己认为更漂亮的解决方案:

stage("Python Test") {
  agent { 
    docker {
      label "docker && linux" 
      image "python:3.7"
    }
  }
  steps {
    withEnv(["HOME=${env.WORKSPACE}"]) {
      sh "pip install -r requirements.txt --user"
      # python stuff
    }
  }
  post {
    cleanup {
      cleanWs()
    }
  }
}

此解决方案完全围绕问题本身,在用户级别安装软件包。这里的问题是主目录最初也不可写,因此会覆盖主目录。

 类似资料:
  • 问题内容: 我 又 通过詹金斯声明管道运行的泊坞权限问题。我想通过Docker容器中的Jenkins作业构建和发布Python包: 但是,由于以下原因,我不被允许: + python -m pip install -r requirements.txt –user –no- cache要求已经满足:/usr/local/lib/python3.7/site-packages中的setuptools

  • 问题内容: 我已经尝试过将docker和jenkins一起使用,两者都安装在我的机器上(w10),并且我使用jankins运行docker镜像。但是,当我按照jenkins文档中的示例(来自doc的示例)时,它不起作用。不涉及时,不同的管道脚本可以工作,我还尝试从jenkins config接口添加。 管道脚本 错误堆栈 我在SO上发现了类似的问题\(相同但没有明确的解决方案) 问题答案: 您的工

  • 我查看了以下文档:https://docs.sonarqube.org/display/scan/analysy+with+sonarqube+scanner+for+jenkins 然而,我不能让它工作。首先,文档似乎需要更新,因为示例中的语法是错误的。在最新版本的声明性管道中,在-tag中是必需的。此外,-关键字只有在-标记中才会解析。 null

  • 问题内容: 我正在使用声明性Jenkins管道来运行我的一些构建管道,并且想知道是否可以定义多个代理标签。 我有许多构建代理与我的Jenkins挂钩,并且希望此特定管道能够由具有不同标签的各种代理(但不能由ALL代理)构建。 更具体地说,假设我有2个代理,标签为“小”,4个为标签“中”,有6个为标签“大”。现在,我有一个非常节省资源的管道,我希望仅在“小型”或“中型”代理上执行,而不在大型代理上执

  • 问题内容: 我正在尝试将旧样式的基于项目的工作流转换为基于Jenkins的管道。在浏览文档时,我发现有两种不同的语法分别命名为和。例如最近(2016年底)发布的Jenkins网络语法。尽管有一个新的语法版本,Jenkins仍然也支持脚本语法。 现在,我不确定这两种类型的哪种情况最合适。语法将很快被弃用吗?詹金斯管道的未来会是这样吗? 任何可以分享有关这两种语法类型的想法的人。 问题答案: 最初创建

  • 我有一个Jenkins声明性管道,我一直在Jenkins master上运行,它工作得很好。但是,现在我已经开始尝试在从属节点上执行此操作,管道中调用的groovy脚本无法访问工作区中的文件。 我的文件看起来像这样。。。 我可以在从机上看到它正在创建工作区,从git执行签出,并正确执行脚本。但是,如果脚本中的某些内容尝试与工作区中的文件交互,则会失败。 如果我有像这样简单的东西... ...它说找