我正在尝试为此管道设置一个 docker 代理,但在管道内运行其中一个命令时出现此错误:
+ poetry shell
Spawning shell within /root/.cache/pypoetry/virtualenvs/python-project-template-nESIvdvh-py3.11
(25, 'Not a tty')
据我所知,这是因为 jenkins 默认使用 -t 参数执行 docker run 。我知道删除 -t 标志可以解决这个问题,但我找不到办法。我到处寻找禁用此功能的方法(加上一些其他默认标志),但我还没有找到解决方法。
这就是我当前的 Jenkinsfile 的样子
pipeline {
agent { docker {
image 'matiasch/python3.11-poetry1.7'
args '-u root --privileged'
} }
stages {
stage('Install Dependencies') {
steps {
timeout(time: 5, unit: 'MINUTES') {
sh 'poetry install'
sh 'poetry shell'
}
}
}
}
}
这是 jenkins 执行的 docker run 命令,如您所见,在我在 Jenkinsfile 中添加的标志之前,我还没有指定一些默认标志, -t 就是其中之一。
docker run -t -d -u 1001:1001 -u root --privileged -w /home/jenkins/workspace/Python_Project_Template_main -v ...
我尝试从声明式管道切换到脚本化管道,使用不同的 docker 映像,试图找到一些“否定”-t 的命令,在 jenkins/plugin 配置中查找默认标志,但我找不到将解决其核心问题,即禁用默认标志。
我认为是因为在 docker run 命令中添加了 -t 标志,这导致了 Poetry shell 命令出现问题。由于删除 -t 标志似乎是解决方案,但您在找到方法时遇到困难,让我们尝试一个解决方法。
直接在 Jenkins 管道脚本中使用 docker 工具,而不是依赖声明性语法。这使您可以更好地控制正在执行的 Docker 命令。
首先声明agent none,表示我们不会使用任何默认代理。然后,在 Run Docker 阶段的步骤块中,我们使用
docker.image('image_name').inside
语法在指定的 Docker 容器内运行命令。这应该绕过 Jenkins 自动添加 -t 标志。
试试这个:
pipeline {
agent none
stages {
stage('Run Docker') {
agent {
docker {
image 'matiasch/python3.11-poetry1.7'
args '-u root --privileged'
}
}
steps {
script {
// Run poetry commands within the Docker container
docker.image('matiasch/python3.11-poetry1.7').inside {
sh 'poetry install'
sh 'poetry shell'
}
}
}
}
}
}