【问题标题】:Unable to connect to docker on gitlab CI无法连接到 gitlab CI 上的 docker
【发布时间】:2020-06-09 06:55:03
【问题描述】:

我正在尝试使用 docker 容器内的测试在 gitlab CI 上进行 e2e 测试。

我有以下用于执行测试的 docker-compose:

version: '3.5'
services:
  api:
    build:
      dockerfile: Dockerfile.dev
      context: ./
    depends_on:
      - db
    ports:
      - '${NODE_PORT}:${NODE_PORT}'
    env_file:
      - ./.env-ci
    volumes:
      - ./src:/usr/src/app/src

  db:
    image: postgres:11
    container_name: 
      - prp_db
    build:
      dockerfile: Dockerfile.dev
      context: ./database
    container_name: pgsql
    env_file:
      - ./.env-ci
    volumes:
      - ./database/schema/base.sql:/docker-entrypoint-initdb.d/0.schema.sql
      - ./database/schema/tables.sql:/docker-entrypoint-initdb.d/1.tables.sql
      - ./database/fixtures/basics.sql:/docker-entrypoint-initdb.d/2.basics.sql
      - ./database/fixtures/relations.sql:/docker-entrypoint-initdb.d/3.relations.sql
    ports:
      - '5432:5432'
    networks:
      - postgres
    restart: unless-stopped

networks:
  postgres:
    driver: bridge

还有下面的gitlab-ci文件

image: docker/compose:latest

services:
  - docker:dind

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ''

before_script:
  - docker version
  - docker-compose version
variables:
  NODE_PORT: '3000'
  DB_HOST: 'host.docker.internal'
  DB_PORT: '5432'
  DB_USERNAME: 'postgres'
  DB_PASSWORD: 'postgres'
  DB_DATABASE: 'prpp'
  NODE_HOST: 'host.docker.internal'
  POSTGRES_DB: prpp
  POSTGRES_PASSWORD: 'postgres'

stages:
  - test

test:
  stage: test
  script:
    - docker-compose -p app -f docker-compose.ci.yml build
    - docker-compose -p app -f docker-compose.ci.yml up --exit-code-from api
  # test:
#   stage: test
#   cache: {}

我有几个使用 supertest 库的 e2e 测试。所以我启动了单元测试,然后是集成测试:

docker-compose -f docker-compose.ci.yml up --exit-code-from api 

这很好用,但是当我在 gitlab 上看到构建时。看来nodejs服务器无法连接到数据库:

console.error
 api_1  |     { Error: getaddrinfo ENOTFOUND host.docker.internal host.docker.internal:5432
 api_1  |         at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:58:26)
 api_1  |       errno: 'ENOTFOUND',
 api_1  |       code: 'ENOTFOUND',
 api_1  |       syscall: 'getaddrinfo',
 api_1  |       hostname: 'host.docker.internal',
 api_1  |       host: 'host.docker.internal',
 api_1  |       port: 5432 }
 api_1  | 
 api_1  |       26 |       });
 api_1  |       27 |     } catch (err) {
 api_1  |     > 28 |       console.error(err);

这很奇怪,因为我的 .env-ci 文件具有相同的环境变量:

DB_HOST=host.docker.internal
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=prpp
DB_DATABASE=prpp
NODE_HOST=0.0.0.0
NODE_PORT=3000

提前致谢

【问题讨论】:

    标签: node.js postgresql docker gitlab gitlab-ci


    【解决方案1】:

    几周后我发现问题出在哪里,它来自主机变量。您需要使用使 DNS 从 docker 工作。这是我的新环境文件:

    DB_PORT=5432
    DB_USERNAME=postgres
    DB_PASSWORD=postgres
    POSTGRES_PASSWORD=postgres
    POSTGRES_DB=prpp
    DB_DATABASE=prpp
    NODE_HOST=api
    NODE_PORT=3000
    DB_HOST=db
    

    还有 docker-compose ci:

    version: '3.7'
    services:
      api:
        container_name: api
        build:
          dockerfile: Dockerfile.test
          context: ./
        depends_on:
          - db
        ports:
          - '3000:3000'
        env_file:
          - ./.env-ci
        networks:
          - main
        volumes:
          - ./src:/usr/src/app/src
    
      db:
        image: postgres:11
        container_name: 
          - prp_db
        build:
          dockerfile: Dockerfile.dev
          context: ./database
        container_name: pgsql
        env_file:
          - ./.env-ci
        volumes:
          - ./database/schema/base.sql:/docker-entrypoint-initdb.d/0.schema.sql
          - ./database/schema/tables.sql:/docker-entrypoint-initdb.d/1.tables.sql
          - ./database/fixtures/basics.sql:/docker-entrypoint-initdb.d/2.basics.sql
          - ./database/fixtures/relations.sql:/docker-entrypoint-initdb.d/3.relations.sql
        ports:
          - '5432:5432'
        networks:
          - main
        restart: unless-stopped
    
    networks:
      main:
        driver: bridge
    

    而且 gitlab-ci 保持不变:)

    愉快的编码

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 2021-11-08
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 2022-10-25
      • 2020-08-10
      • 2020-12-07
      • 2017-08-09
      相关资源
      最近更新 更多