docker - Jenkins docker 容器只是挂起并且从不执​​行步骤

标签 docker jenkins

我尝试在 Jenkins 中运行 Python 镜像,以使用 pytest 执行一系列单元测试,但我在使用 Docker 时遇到了一些奇怪的行为。

我的 Jenkinsfile 管道是

  agent {
      docker { image 'python:3.6-jessie' }
    }

    stages {
      stage('Run tests') {
        steps {
            withCredentials([
                string(credentialsId: 'a-secret', variable: 'A_SECRET')
            {

              sh label: "Install dependencies", script: 'pip install -r requirements.txt'
              sh label: 'Execute tests', script: "pytest mytests.py"
            }
     }
  }
}

但是,当我运行管道时,Docker 似乎正在执行一条非常长的指令(-e 环境变量比我定义为凭据的多得多?),然后是 cat.

然后构建就会挂起并且永远不会完成:

         Jenkins does not seem to be running inside a container
            $ docker run -t -d -u 996:994 
    -w /var/lib/jenkins/workspace/myproject 
    -v /var/lib/jenkins/workspace/myproject:/var/lib/jenkins/workspace/myproject:rw,z
    -v /var/lib/jenkins/workspace/myproject@tmp:/var/lib/jenkins/workspace/myproject@tmp:rw,z 
-e ******** -e ******** python:3.6-jessie cat

当我通过 SSH 连接到我的实例并运行 docker ps 时,我看到

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
240d00459d92        python:3.6-jessie   "cat"               About a minute ago   Up About a minute                       kind_wright

为什么 Jenkins 运行 cat?为什么 Jenkins 说我没有在容器内运行,而它显然已经为我创建了一个容器?最重要的是,为什么我的 pip install -r requests 和其他步骤没有执行?

最佳答案

我终于明白了这一点。如果您的 Jenkins 配置中有空的全局环境变量,那么您似乎会得到格式错误的 docker run命令,因为 Jenkins 将使用空字符串环境变量编写命令,如 docker run -e some_env_var=some_value -e = ...

这将导致容器简单地挂起。

发生这种情况的一个明显迹象是您会收到错误消息:

invalid argument "=" for "-e, --env" flag: invalid environment variable: =

这最初很难诊断,因为 Jenkins(正确地)用 *** 隐藏了您的实际凭据,因此空环境字符串不会显示为空。

您需要检查 Jenkins 全局配置并确保没有意外定义任何空环境变量:

enter image description here

如果存在,您需要删除它们并重新运行。

关于docker - Jenkins docker 容器只是挂起并且从不执​​行步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54585747/

相关文章:

Azure物联网边缘模块: Error while Build and Push IoT Edge Solution

mysql - Docker Compose 连接 ECONNREFUSED 172.18.0.4 :3306

android - Android测试在 Jenkins 失败

postgresql - Jenkins docker 许可

linux - 如何授予jenkins用户访问linux上特定目录的权限

docker - fe_sendauth:创建数据库时未提供密码

node.js - 来自卷的数据作为 kubernetes secret

docker - 小艇重启后数据丢失(postgres 容器)

bash - 如何使凭据可用于 jenkins 中的 shell 脚本

jenkins - 我可以对 Gerrit 补丁进行声纳扫描吗?