我正在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容器中运行。
当前回答
使用“gitbash”时,
1) 我执行以下命令:
docker exec -it 726fe4999627 /bin/bash
我有错误:
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
2) 然后,我执行命令:
winpty docker exec -it 726fe4999627 /bin/bash
我还有一个错误:
OCI runtime exec failed: exec failed: container_linux.go:344: starting container process caused "exec: \"D:/Git/usr/bin/
bash.exe\": stat D:/Git/usr/bin/bash.exe: no such file or directory": unknown
3) 第三,我执行:
winpty docker exec -it 726fe4999627 bash
它奏效了。
当我使用“powershell”时,一切都很好。
其他回答
而不是使用-it使用--tty
所以你的docker运行应该是这样的:
docker run -v $PWD:/foobar --tty cloudfoundry/cflinuxfs2 /foobar/script.sh
只使用-i标志而不是-it标志。这可以帮助您了解容器内的情况。
docker exec -i $USER bash <<EOF
apt install nano -y
EOF
您可能会看到警告,但它显示了docker内部终端上的输出。
如果使用windows,请尝试使用cmd,对我来说它是有效的。检查docker是否已启动。
为了让docker分配TTY(-t选项),当docker运行被调用时,您已经需要在TTY中。Jenkins不在TTY中执行其任务。
话虽如此,您在Jenkins中运行的脚本可能也希望在本地运行。在这种情况下,分配TTY非常方便,这样在本地运行时就可以发送类似ctrl+c的信号。
要解决此问题,请使脚本可以选择使用-t选项,如下所示:
test -t 1 && USE_TTY="-t"
docker run ${USE_TTY} ...
在詹金斯,我使用docker compose exec-T
eg:-
docker-compose exec -T app php artisan migrate