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

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

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

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


当前回答

在詹金斯,我使用docker compose exec-T

eg:-

docker-compose exec -T app php artisan migrate

其他回答

从cli中删除-it以使其非交互式,并删除TTY。如果您不需要,例如在Jenkins或cron脚本中运行命令,那么应该这样做。

或者,如果输入管道连接到docker命令,而不是来自TTY,则可以将其更改为-i。如果你有类似xyz|docker的东西。。。或码头工人<在命令行中输入,执行此操作。

或者,如果您希望TTY支持,但输入设备上没有TTY,则可以将其更改为-t。对于检查TTY以启用日志中输出的颜色格式的应用程序,或者当您稍后使用适当的终端连接到容器时,请执行此操作。

或者,如果您需要一个交互式终端,而不是在Linux或MacOS上的终端上运行,请使用不同的命令行界面。据报告,PowerShell在Windows上包含此支持。


什么是TTY?这是一个终端界面,支持转义序列、移动光标等,这源于以前连接到大型机的哑终端。今天,它由Linux命令终端和ssh接口提供。有关详细信息,请参阅维基百科文章。

要了解使用和不使用TTY运行容器的区别,请运行没有TTY的容器:docker run--rm-i ubuntu bash。从容器内部,安装带有apt-get-update的vim;apt-get安装vim。注意缺少提示。当对文件运行vim时,尝试在文件内移动光标。

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

如果您在windows上使用gitbash,只需将

冬季的

在“码头线”之前:

winpty docker exec -it some_container bash

对于那些在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