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

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

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

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


当前回答

为了让docker分配TTY(-t选项),当docker运行被调用时,您已经需要在TTY中。Jenkins不在TTY中执行其任务。

话虽如此,您在Jenkins中运行的脚本可能也希望在本地运行。在这种情况下,分配TTY非常方便,这样在本地运行时就可以发送类似ctrl+c的信号。

要解决此问题,请使脚本可以选择使用-t选项,如下所示:

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...

其他回答

同样的情况在这里,我运行以下命令throw.sh脚本(bash)和python.py然而,我得到了同样的错误“输入设备不是TTY”。

在我的例子中,我试图通过身份验证从“production”env的运行容器中获取转储,并传递一些参数,然后获取mssql数据库容器的.bak文件的输出。

从命令中删除-it。如果你想保持它的交互性,那么就保持-i。

您可以检查我的.sh文件和一个获取转储的长命令。

使用docker compose exec-T通过Jenkins为我解决了这个问题

docker compose exec-T containerName php script.php

只使用-i标志而不是-it标志。这可以帮助您了解容器内的情况。

docker exec -i $USER bash <<EOF
 apt install nano -y 
EOF

您可能会看到警告,但它显示了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

而不是使用-it使用--tty

所以你的docker运行应该是这样的:

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