1

我正在基于这样的代理运行 Jenkins 工作:

pipeline {
  agent {
    docker {
      image 'cypress/base:10'
        args '-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose -u root'
    }
  }
…

注意: dockerdocker-compose安装到我的代理容器中,以便能够在管道阶段内运行 docker 容器(“Docker 之外的 Docker”设置)

在管道中,我开始docker-compose设置包含 2 个容器 - 服务器和 webapp

…
sh 'docker-compose up --build --detach'
…

之后,我想向 发送一个 GET 请求localhost:8080,这是应该从那里提供网络应用程序的地方。但我明白了

Error: connect ECONNREFUSED localhost:8080

相同的 docker-compose 设置适用于我的开发人员。机器。端口转发设置正确(docker-compose配置文件中启用了8080:8080端口转发)

我认为这与我在 Jenkins 中所做的“Docker 之外的 Docker”设置有些相关,也许端口 8080 实际上似乎正在侦听我的管道代理的主机,不确定……</p>

我会很高兴在这个问题上获得新的想法,我完全没有想到这个。

只是为了提供更多上下文:我想通过 docker-compose 运行 web-app + API 服务器,然后运行 ​​Cypress(在 docker-compose 设置之外)通过 UI 进行 E2E 测试

4

1 回答 1

0

在 Jenkins docker out of docker setup 中,从技术上讲,Jenkins 也是另一个与其他容器“共享”相同空间的容器。这意味着,它可以与它“创建”的容器进行通信。

就我而言,我所做的是在我的 docker-compose.yml 文件上创建一个自定义桥接网络

version: "3.8"

services:
  app:
    build:
      context: .
    ports:
      - 8081:8080
    depends_on:
      - redisdb
    networks:
      - frontend
      - backend

  redisdb:
    image: redis
    ports:
      - 127.0.0.1:6380:6379
    networks:
      - backend

networks:
  frontend: {}
  backend: {}

然后,一旦创建,docker-compose 就会使用以下格式创建这些网络:

  • {FOLDER_NAME}_frontend(例如:pipeline_frontend)
  • {FOLDER_NAME}_backend

这些网络通常是桥接网络。

我的 Jenkins 容器最初驻留在默认网络“网桥”中。由于我的 jenkins 在桥接网络中并且这些容器在桥接类型网络中,因此我可以稍后在管道中通过运行时连接我的 jenkins。

docker network connect pipeline_frontend jenkins

现在从詹金斯,我可以通过它的服务名称直接与容器通信。例如,在我的 Jenkins 中,我可以 curl 到 http://app:8080

注意:此答案仅适用于 Jenkins 容器与它创建的容器一样单独驻留在主机中的情况。我没有在 Jenkins 有外部节点的设置上对此进行测试。

于 2020-11-19T20:14:29.920 回答