首页 > 解决方案 > Jenkins docker.image().withRun() 我用什么主机名来连接

问题描述

我有一个 Jenkins 管道,我正在尝试运行一个 Postgres 容器并连接到它以进行一些 nodejs 集成测试。我的 Jenkins 文件如下所示:

stage('Test') {
    steps {
      script {
        docker.image('postgres:10.5-alpine').withRun('-e "POSTGRES_USER=fred" -e "POSTGRES_PASSWORD="foobar" -e "POSTGRES_DB=mydb" -p 5432:5432') { c->
        sh 'npm run test'  
    }
  }
}

我应该使用什么主机名连接到我的 nodejs 代码中的 postgres 数据库?我试过 localhost 但我得到一个连接被拒绝的异常:

ERROR=Error: connect ECONNREFUSED 127.0.0.1:5432
ERROR:Error: Error: connect ECONNREFUSED 127.0.0.1:5432

其他详细信息:我添加了 30 秒的睡眠时间,以便容器启动。我知道有更好的方法可以做到这一点,但现在我只想解决连接问题。

我在容器上运行 docker logs 以查看它是否已准备好接受连接,并且是。

stage('Test') {
    steps {
      script {
        docker.image('postgres:10.5-alpine').withRun('-e "POSTGRES_USER=fred" -e "POSTGRES_PASSWORD="foobar" -e "POSTGRES_DB=mydb" -p 5432:5432') { c->
        sleep 60
        sh "docker logs ${c.id}"
        sh 'npm run test'       
    }
  }
}

docker logs 命令的尾部:

2019-09-02 12:30:37.729 UTC [1] LOG:  database system is ready to accept connections

我在 docker 容器中运行 Jenkins 本身,所以我想知道这是否是一个因素?

我的目标是使用空表启动数据库,针对它运行集成测试,然后关闭数据库。我无法在容器内运行测试,因为我正在测试的代码位于容器外并触发了 jenkins 管道。这是 Jenkins 多分支管道的一部分,它由推送到功能分支触发。

标签: node.jsdockerjenkins-pipeline

解决方案


推荐阅读