Gitlab CI无法在Docker正在运行的端口上建立连接

jm2pwxwz  于 2023-05-16  发布在  Docker
关注(0)|答案(3)|浏览(150)

我花了整整一天的时间才走到这一步,还在苦苦挣扎,错误说“连接到localhost端口9000后失败”。
我有一个Nodejs应用程序,它使用Postgres作为DB。我能把它们联系起来。而且,该应用程序在附加模式下运行得非常好。当我在de-attach模式下运行它,并 curl 它时,我得到错误。我甚至放了很长时间的睡眠,以确保它有足够的时间启动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没有太多的经验。

nnt7mjpx

nnt7mjpx1#

我在这上面花了两天时间。问题出在docker之间的网络。
来源: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
waxmsbnn

waxmsbnn2#

因此,一个问题是应用程序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"
cfh9epnr

cfh9epnr3#

Gitlab piepline + docker : (7) Failed to connect to localhost port 9000: Connection refuse
我也有同样的问题。请看最后一个答案。对我来说效果很好。

相关问题