我正在Jenkinsfile中运行以下命令。然而,我收到错误“输入设备不是TTY”。
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
有没有一种方法可以在不进行交互模式的情况下从Jenkinsfile运行脚本?
我基本上有一个名为script.sh的文件,我想在Docker容器中运行。
我正在Jenkinsfile中运行以下命令。然而,我收到错误“输入设备不是TTY”。
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
有没有一种方法可以在不进行交互模式的情况下从Jenkinsfile运行脚本?
我基本上有一个名为script.sh的文件,我想在Docker容器中运行。
当前回答
我知道这并不是直接回答眼前的问题,而是针对使用WSL运行Docker for windows和cmder或conemu的人。
诀窍不在于使用安装在windows上的Docker,而在于安装ubuntu/linux Docker。值得指出的是,您不能在WSL中运行Docker本身,但可以从linux Docker客户端连接到Docker for windows。
在Linux上安装Docker
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
连接到端口2375上的Docker for windows,需要从Docker for windows中的设置启用该端口。
docker-H localhost:2375运行-it-v/mnt/c/code:/var/app-w“/var/app”centos:7
或者设置docker_host变量,这样可以省略-H开关
导出DOCKER_HOST=tcp://localhost:2375
现在您应该能够与tty终端会话交互连接。
其他回答
我知道这并不是直接回答眼前的问题,而是针对使用WSL运行Docker for windows和cmder或conemu的人。
诀窍不在于使用安装在windows上的Docker,而在于安装ubuntu/linux Docker。值得指出的是,您不能在WSL中运行Docker本身,但可以从linux Docker客户端连接到Docker for windows。
在Linux上安装Docker
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
连接到端口2375上的Docker for windows,需要从Docker for windows中的设置启用该端口。
docker-H localhost:2375运行-it-v/mnt/c/code:/var/app-w“/var/app”centos:7
或者设置docker_host变量,这样可以省略-H开关
导出DOCKER_HOST=tcp://localhost:2375
现在您应该能够与tty终端会话交互连接。
对于使用Pyinvoke的用户,请参阅以下文档,如果链接失效,我将在这里联合这些文档:
99%的情况下,将pty=True添加到您的跑步通话中会使事情按照您的预期进行。继续阅读原因(以及为什么pty=True不是默认值)。
命令行程序经常根据控制终端是否存在而改变行为;一个常见的例子是彩色输出的使用或废弃。当输出的接收者是终端上的人时,您可能需要使用颜色、调整线路长度以匹配终端宽度等。
相反,当您的输出被发送到另一个程序(shell管道、CI服务器、文件等)时,颜色转义码和其他特定于终端的行为可能会导致无用的垃圾。
Invoke的用例涵盖了以上两种情况——有时您只希望直接显示数据,有时您只想将其捕获为字符串;通常你都想要。因此,没有“正确”的默认行为:使用伪终端——无论哪种方式都会给大量用例带来不便。
对于不关心的用例,没有伪终端的直接调用更快、更干净,因此它是默认的。
同样的情况在这里,我运行以下命令throw.sh脚本(bash)和python.py然而,我得到了同样的错误“输入设备不是TTY”。
在我的例子中,我试图通过身份验证从“production”env的运行容器中获取转储,并传递一些参数,然后获取mssql数据库容器的.bak文件的输出。
从命令中删除-it。如果你想保持它的交互性,那么就保持-i。
您可以检查我的.sh文件和一个获取转储的长命令。
对于那些在Windows上遇到这个错误和gitbash的人来说,只需使用PowerShell,它就可以完美地工作了。
如果您在windows上使用gitbash,只需将
冬季的
在“码头线”之前:
winpty docker exec -it some_container bash