我正在Jenkinsfile中运行以下命令。然而,我收到错误“输入设备不是TTY”。

docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh

有没有一种方法可以在不进行交互模式的情况下从Jenkinsfile运行脚本?

我基本上有一个名为script.sh的文件,我想在Docker容器中运行。


当前回答

对于那些在Windows上遇到这个错误和gitbash的人来说,只需使用PowerShell,它就可以完美地工作了。

其他回答

下面显示的Jenkins管道步骤失败,错误相同。

       steps {
            echo 'Building ...' 
            sh 'sh ./Tools/build.sh'
        }

在我的“build.sh”脚本文件“docker-run”命令中,Jenkins作业执行该命令时输出此错误。然而,当脚本在shell终端中运行时,它工作正常。发生错误的原因是将-t选项传递给docker run命令,据我所知,该命令尝试分配终端,如果没有终端可供分配,则失败。

在我的例子中,我已经将脚本更改为只有在可以检测到终端时才传递-t选项。以下是更改后的代码:

DOCKER_RUN_OPTIONS="-i --rm"

# Only allocate tty if we detect one
if [ -t 0 ] && [ -t 1 ]; then
    DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -t"
fi

docker run $DOCKER_RUN_OPTIONS --name my-container-name  my-image-tag

对于那些在Windows上遇到这个错误和gitbash的人来说,只需使用PowerShell,它就可以完美地工作了。

如果使用windows,请尝试使用cmd,对我来说它是有效的。检查docker是否已启动。

对于docker运行DON NOT USE-it标志

(如BMitch所述)

这并不完全是你所要求的,但对其他人也很有用:

对于docker compose exec,使用-T标志!

-T键将帮助使用docker的人编写exec!(它禁用伪tty分配)

例如:

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup

or

docker-compose exec -T mysql mysql -uuser_name -ppassword database_name < dir/to/db_backup.sql

只要不指定要装载的卷(例如.:/mountpoint或${pwd}:/mountpoint

我找到的最佳解决方法是在Visual Code Studio中使用git bash插件,并使用终端启动和停止容器或docker compose。