我还有一个问题,该问题涉及通过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 install
,我无法PermissionError
:
+ python -m pip install -r requirements.txt --user --no-cache要求已经满足:setuptools in /usr/local/lib/python3.7/site-packages(来自-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)收集py> = 1.5.0(从pytest->-r requirements.txt中(行 2))下载 https://files.pythonhosted.org/packages/f3/bd/83369ff2dee18f22f27d16b78dd651e8939825af5f8b0b83c38729069962/py-1.5.4-py2.py3-none-any.whl (83kB)收集更多-itertools> = 4.0.0(来自pytest->-r requirements.txt(第2行))下载 https://files.pythonhosted.org/packages/79/b1/eace304ef66bd7d3d8b2f78cc374b73ca03bc53664d78151e9df3b3996cc/more_itertools-4.3.0-py3-none-any.whl (48kB)收集pluggy> = 0.7(从pytest->-r requirements.txt中(行 2))下载 https://files.pythonhosted.org/packages/f5/f1/5a93c118663896d83f7bcbfb7f657ce1d0c0d617e6b4a443a53abcc658ca/pluggy-0.7.1-py2.py3-none-any.whl 收集六个> = 1.10.0(来自pytest->-r requirements.txt(第2行))
正在下载 https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl 收集atomicwrites> = 1.0(从pytest->-r requirements.txt中(行 2))下载 https://files.pythonhosted.org/packages/0a/e8/cd6375e7a59664eeea9e1c77a766eeac0fc3083bb958c2b41ec46b95f29c/atomicwrites-1.1.5-py2.py3-none-any.whl 收集attrs> = 17.4.0(来自pytest->-r requirements.txt(第2行))
正在下载 https://files.pythonhosted.org/packages/41/59/cedf87e91ed541be7957c501a92102f9cc6363c623a7666d69d51c78ac5b/attrs-18.1.0-py2.py3-none-any.whl 安装收集的软件包:py,六个,更多itertools,pluggy, atomicwrites,attrs,pytest由于环境错误而无法安装软件包:[Errno 13]权限被拒绝:'/.local' 检查权限。
如何解决这些权限?
答案 0 :(得分:0)
在Jenkins系统上设置Docker代理后,我有一个非常相似的管道正在运行,所以我认为我的设置是错误的。使用您线程中的注释,我准备了以下解决方案:
首先,您需要以root用户身份进入容器,因此将您的代理声明更改为与此类似:
agent {
docker {
image "python:3.7"
args '--user 0:0'
}
}
现在我可以使用pip install
了!但是,此作业的后续运行将尝试运行git clean
并失败,因为容器中的内置文件是由root创建的。要解决此问题,我最后一步是在容器内运行clean命令:
steps {
sh 'git clean -fdx'
}
更新:
我发现了一个问题,即失败的构建无法清理并杀死所有构建。要解决此问题,我将清洁操作作为始终运行的post-build task:
post {
cleanup {
script {clean_up()}
}
}
答案 1 :(得分:0)
我发现我自己认为是更漂亮的解决方案:
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()
}
}
}
此替代方法可以完全解决问题本身,并在用户级别安装软件包。这里的问题是HOME目录最初也不是可写的,因此会覆盖HOME目录。
答案 2 :(得分:0)
withEnv(["HOME=${env.WORKSPACE}"]) {}
是关键。此外,它可以像这样使用:
node {
def customImage = docker.build(...)
customImage.inside {
withEnv(["HOME=${env.WORKSPACE}"]) {
sh '...'
}
}
}
答案 3 :(得分:-1)
您可以尝试以sudo的身份执行它:
stage('Package') {
steps {
sh '''
python -V
sudo python -m pip install -r requirements.txt --user --no-cache
sudo python setup.py sdist
'''
}
}
由于Jenkins无法以sudo
的身份运行命令,因此您可能会遇到问题,我建议您按照this article或this SO question