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

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

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

我基本上有一个名为script.sh的文件,我想在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。

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

冬季的

在“码头线”之前:

winpty docker exec -it some_container bash

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

对于使用Pyinvoke的用户,请参阅以下文档,如果链接失效,我将在这里联合这些文档:

99%的情况下,将pty=True添加到您的跑步通话中会使事情按照您的预期进行。继续阅读原因(以及为什么pty=True不是默认值)。

命令行程序经常根据控制终端是否存在而改变行为;一个常见的例子是彩色输出的使用或废弃。当输出的接收者是终端上的人时,您可能需要使用颜色、调整线路长度以匹配终端宽度等。

相反,当您的输出被发送到另一个程序(shell管道、CI服务器、文件等)时,颜色转义码和其他特定于终端的行为可能会导致无用的垃圾。

Invoke的用例涵盖了以上两种情况——有时您只希望直接显示数据,有时您只想将其捕获为字符串;通常你都想要。因此,没有“正确”的默认行为:使用伪终端——无论哪种方式都会给大量用例带来不便。

对于不关心的用例,没有伪终端的直接调用更快、更干净,因此它是默认的。

对于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