GITLAB-CI-加入由docker-compose创建的网络

时间:2019-06-27 06:10:26

标签: docker docker-compose gitlab dockerfile gitlab-ci

我正在创建一个gitlab-ci以在我的应用程序上运行e2e测试, 因此,鉴于我有这个docker-compose.yml:

services:
  chrome:
    image: zenika/alpine-chrome:latest
    command: [
      chromium-browser,
      "--headless",
      "--no-sandbox",
      "--disable-gpu",
      "--ignore-certificate-errors",
      "--reduce-security-for-testing",
      "--remote-debugging-address=0.0.0.0",
      "--remote-debugging-port=9222",
      "https://google.com/",
    ]
    ports:
      - "9222:9222"
    networks:
      - test-e2e

networks:
  test-e2e:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

当我运行docker-compose up时,一切正常 在我的本地计算机上,我可以访问localhost:9222并访问chrome调试器。


但是,当我在gitlab-ci上运行相同的作业时,出现ECONNREFUSED错误

F---F

Failures:

1) Scenario: List of Profiles # src/features/profile.feature:3
   ✖ Before # dist/node/development/webpack:/hooks/puppeteer.hooks.ts:17
       Failed to fetch browser webSocket url from http://localhost:9222/json/version: connect ECONNREFUSED 127.0.0.1:9222
       Error: connect ECONNREFUSED 127.0.0.1:9222
           at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14)

因此很明显,我无法加入docker-compose网络并无法通过工作访问localhost:9222

我的gitlab-ci.yml非常简单,看起来像这样:

E2E tests:
  stage: test end-to-end
  image:
    name: docker/compose:1.24.1
    entrypoint: ["/bin/sh", "-c"]
  services:
    - docker:dind
  before_script:
    - apk --update add nodejs yarn
    - docker-compose -f test-e2e.yaml up -d
  script:
    - yarn test:cucumber
  after_script:
    - docker-compose -f test-e2e.yaml down

yarn test:cucumber基本上是运行黄瓜和木偶试图访问localhost:9222以获得chrome的元数据。


如何加入gitlab-ci作业中docker-compose创建的网络?

  • 我无权编辑跑步者配置

3 个答案:

答案 0 :(得分:8)

TL; DR 在CI上,您可以使用chrome(或更常见的是docker:9222)而不是<name-of-the-dind-service-on-ci>:<exposed-port>

来访问您的localhost:9222容器

说明

根据您的gitlab-ci.yml,您将启动2个容器:

在Docker中运行容器时,该容器实际上是由Docker守护程序启动的,并将运行并公开运行该守护程序的主机上的端口。

  • 在您的计算机上,Docker守护进程正在本地运行,并将在本地网络上公开容器端口,从而使您可以通过chrome来访问localhost容器
  • 在CI上,您正在从docker/compose:1.24.1容器中运行命令,但是Docker守护进程正在另一个容器(不同的主机)中运行:docker:dind容器。 chrome容器将docker:dind 容器内创建,并且其端口从同一容器暴露。您只需要访问docker:dind容器即可公开chrome端口。

通过使用localhost容器中的docker/compose:1.24.1,您将无法访问chrome,因为其端口不在docker/compose:1.24.1容器中,而是从{{1 }} 容器。您需要指定其主机(docker:dind)和公开端口(docker

答案 1 :(得分:0)

我认为好主意是开始

docker-compose up

内部CI脚本。

之后,您将可以访问。如果再次运行CI,它将启动相同的容器。

答案 2 :(得分:0)

如果您使用的是gitlab共享运行程序,则出于安全原因,可能不允许创建网络。

尝试使用自己的私人跑步者。设置它们真的很容易:https://docs.gitlab.com/runner/install/

另一个选择是services