【发布时间】: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