我花了一整天到这个地步,还在挣扎,错误说“Failed to connect to localhost port 9000 after”。
我有一个 Nodejs 应用程序,它使用 Postgres 作为数据库。我能够将它们连接在一起。而且,该应用程序在附加模式下运行得非常好。当我在 de-attach 模式下运行它并卷曲它时,我得到了错误。我什至睡了很长时间以确保它有足够的时间启动 docker 但仍然无法连接到端口
主线是我如何运行 docker,并将 Postgres 作为服务获取。我检查了服务的健康状况。我不确定这是防火墙还是网络问题,即这里的接口。
- docker run -d -e POSTGRES_HOST=$POSTGRES_PORT_5432_TCP_ADDR -p 9000:9000 $DOCKER_TEST_IMAGE_API
image: docker:19.03.12
stages:
- build
- test
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_DRIVER: overlay2
DOCKER_TEST_IMAGE_API: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
DOCKER_RELEASE_IMAGE_API: $CI_REGISTRY_IMAGE
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
api-component-api:
stage: build
services:
- docker:19.03.12-dind
variables:
PORT: '9000'
script:
- docker build --pull -t $DOCKER_TEST_IMAGE_API api/.
- docker push $
enter code here
api-component-api:
stage: build
services:
- docker:19.03.12-dind
variables:
PORT: '9000'
script:
- docker build --pull -t $DOCKER_TEST_IMAGE_API api/.
- docker push $DOCKER_TEST_IMAGE_API
api-component-tests:
stage: test
services:
- name: 'postgres:11.9'
alias: postgres
- name: 'docker:19.03.12-dind'
alias: docker
variables:
# POSTGRES Service
POSTGRES_USER: 'postgres'
POSTGRES_PASSWORD: 'password'
POSTGRES_DB: 'postgres'
POSTGRES_HOST: 'postgres'
POSTGRES_HOST_AUTH_METHOD: trust
script:
- env | grep POSTGRES_PORT_5432_TCP_ADDR
- docker run -d -e POSTGRES_HOST=$POSTGRES_PORT_5432_TCP_ADDR -p 9000:9000 $DOCKER_TEST_IMAGE_API
- sleep 60
- docker ps -a
- docker network ls
- curl -X GET "http://localhost:9000/rooms/1000ef5c-1657-46b2-bb36-c74080e00c01"
- cd end-to-end-tests
- yarn install
- yarn test
Digest: sha256:f8d84da7264faf570184929a441e448d680ccbfd297bcd0aef0d7f455c360614
Status: Downloaded newer image for registry.gitlab.com/.../simple-room-booking:main
f24ef88e36e16beb7f32acb03f7cda5775742b6639232a9692e4ef494fe22e93
$ sleep 60
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f24ef88e36e1 registry.gitlab.com/.../simple-room-booking:main "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:9000->9000/tcp lucid_yalow
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c7d6ee26e52e bridge bridge local
6760c4e13b56 host host local
3bb3bbf3cd42 none null local
$ curl -X GET "http://localhost:9000/rooms/1000ef5c-1657-46b2-bb36-c74080e00c01"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (7) Failed to connect to localhost port 9000 after 6 ms: Connection refused
Cleaning up project directory and file based variables
00:01
ERROR: Job failed: exit code 7
我对 GitLab 没有太多经验。
我确实花了两天时间。问题出在码头工人之间的网络上。
来源:https://docs.gitlab.com/ee/ci/services/#using-services-with-docker-run-docker-in-docker-side-by-side
variables:
FF_NETWORK_PER_BUILD: "true" # activate container-to-container networking
这经过一些重构后有效,但主要部分是这个功能标志。
api-component-tests:
stage: test
services:
- name: 'postgres:11.9'
alias: postgres
- name: 'docker:19.03.12-dind'
alias: docker
- name: $DOCKER_TEST_IMAGE_API
alias: api
variables:
# POSTGRES Service
POSTGRES_USER: 'postgres'
POSTGRES_PASSWORD: 'password'
POSTGRES_DB: 'postgres'
POSTGRES_HOST: 'postgres'
POSTGRES_HOST_AUTH_METHOD: trust # activate container-to-container networking
# API Service
POSTGRES_DSN: 'postgresql://postgres/postgres?sslmode=disable&user=postgres&password=password'
FF_NETWORK_PER_BUILD: "true"
script:
- apk --update add postgresql-client
- apk add nodejs yarn curl
- sleep 10
- curl -X GET "http://api:9000/rooms/1000ef5c-1657-46b2-bb36-c74080e00c01"
- cd end-to-end-tests
- export apiBaseUrl='http://api:9000'
- yarn install
- yarn test
所以一个问题是应用程序 Docker 映像连接到 PostgreSQL,这可以通过
FF_NETWORK_PER_BUILD
(如另一个答案所述)或通过运行 PostgreSQL 而不是作为 GitLab CI 服务来解决,而只需在您的 docker
服务中运行它并使用任何方式将 PostgreSQL 容器暴露给应用程序容器(Docker 网络或链接容器)。
但另一个问题是您正在尝试连接到
localhost:9000
。您应该连接到docker:9000
。你跑:
docker run -d -e POSTGRES_HOST=$POSTGRES_PORT_5432_TCP_ADDR -p 9000:9000 $DOCKER_TEST_IMAGE_API
这会在 Docker 服务的
docker
容器上公开 9000 端口,而不是在您的本地主机上。所以完整的解决方案可能是这样的(未经测试):
docker run -d --name postgres postgres:11.9
docker run -d -e POSTGRES_HOST=postgres --link postgres:postgres -p 9000:9000 $DOCKER_TEST_IMAGE_API
sleep 60
curl -X GET "http://docker:9000/rooms/1000ef5c-1657-46b2-bb36-c74080e00c01"
Gitlab piepline + docker : (7) Failed to connect to localhost port 9000: Connection refuse
我有同样的问题。请看最后一个答案。它对我来说非常好。