Jenkins执行Docker命令遇input device is not a TTY错误求助
解决Jenkins Pipeline中Docker命令"input device is not a TTY"错误
错误根源
Jenkins流水线运行在非交互式环境,docker run或docker exec的-it参数里,-t会要求分配伪终端(TTY),但Jenkins无法提供,因此必须移除-t参数。
修正后的Jenkinsfile
pipeline { agent { label 'pulse_ec2' } stages { stage('Clean workspace') { steps { cleanWs() } } stage('Clone adas_bt_wifi_docker_setup repo') { steps { script{ git url: 'repourl', branch: 'master', credentialsId: 'key' sh 'gzip -d *.tar.gz' sh 'docker load -i *.tar' sh 'docker images' // 1. 启动容器:仅用-d后台运行,移除-it参数 sh 'docker run -d $(docker images | awk \'{print $3}\' | awk \'NR==2\')' // 2. 正确获取最新启动的容器ID:用docker ps内置参数更可靠 def containerId = sh( script: "docker ps --latest --quiet", returnStdout: true ).trim() // 3. 执行容器内命令:移除-t,仅保留-i(或直接省略,若无需输入) // 方式1:直接执行单条命令 sh "docker exec $containerId ls -lt" // 方式2:执行多条命令(用here-doc) sh """ docker exec -i $containerId bash << 'EOF' ls -lt # 可添加其他需要执行的命令,比如pwd、whoami等 EOF """ } } } } }
关键修改说明
- 启动容器时移除
-it:后台运行容器无需交互式终端,-d参数足够,避免触发TTY错误。 - 容器ID获取优化:使用
docker ps --latest --quiet直接获取最新启动容器的ID,比管道拼接head/tail/awk更简洁且不易出错。 docker exec调整:移除-t参数,仅保留-i(如果需要向容器内传递输入);若只是执行非交互式命令,可直接省略-i。- 避免直接进入bash:Jenkins是非交互式环境,直接执行目标命令或用here-doc批量执行命令,比进入bash更高效且符合流水线运行逻辑。
内容的提问来源于stack exchange,提问作者mansa
相关产品推荐
相关产品推荐

