我正在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终端会话交互连接。

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

docker compose exec-T containerName php script.php

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

冬季的

在“码头线”之前:

winpty docker exec -it some_container bash

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

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

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

下面显示的Jenkins管道步骤失败,错误相同。

       steps {
            echo 'Building ...' 
            sh 'sh ./Tools/build.sh'
        }

在我的“build.sh”脚本文件“docker-run”命令中,Jenkins作业执行该命令时输出此错误。然而,当脚本在shell终端中运行时,它工作正常。发生错误的原因是将-t选项传递给docker run命令,据我所知,该命令尝试分配终端,如果没有终端可供分配,则失败。

在我的例子中,我已经将脚本更改为只有在可以检测到终端时才传递-t选项。以下是更改后的代码:

DOCKER_RUN_OPTIONS="-i --rm"

# Only allocate tty if we detect one
if [ -t 0 ] && [ -t 1 ]; then
    DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -t"
fi

docker run $DOCKER_RUN_OPTIONS --name my-container-name  my-image-tag