我正在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

其他回答

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

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

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

如果使用windows,请尝试使用cmd,对我来说它是有效的。检查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”时,一切都很好。

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

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

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

您可能会看到警告,但它显示了docker内部终端上的输出。