在 gitlab ci 中查找 docker-compose 中运行的容器的 url/ip

Con*_*tch 3 networking containers gitlab docker docker-compose

我有一个在 docker-compose 中运行的应用程序(用于验收测试)。验收测试在本地进行,但需要在 docker-compose 中运行的 Web 服务容器的主机(或 IP)才能向其发送请求。这在本地工作正常,但当容器在 gitlab ci 服务器中运行时,我找不到容器的 IP。我尝试了以下几个解决方案(所有这些解决方案在本地运行时都有效,但在 gitlab ci 中都不起作用)来查找在 gitlab ci 服务器中的 docker-compose 中运行的容器的 url:

  1. 使用“docker”作为主机。这适用于在 docker 中运行的应用程序,但不适用于 docker-compose
  2. 使用 docker-inspect 查找容器的 ip ( dockerspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 阅读理解)
  3. 使用 docker-compose.yml 中的网络为容器分配静态 IP(最新尝试)。

gitlab ci 文件可以在这里找到: https://gitlab.com/connorbutch/reading-compressive/-/blob/9-list-all-assessments/.gitlab-ci.yml

    image: connorbutch/gradle-and-java-11:alpha

variables:
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  DOCKER_HOST: "tcp://docker:2375"
  DOCKER_DRIVER: "overlay2"

before_script:
  - export GRADLE_USER_HOME=`pwd`/.gradle

services:
  - docker:stable-dind

stages:
  - build
  - docker_build
  - acceptance_test

unit_test:
  stage: build
  script: ./gradlew check
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: pull
    paths:
      - build
      - .gradle

build:
  stage: build
  script:
    - ./gradlew clean quarkusBuild
    - ./gradlew clean build -Dquarkus.package.type=native -Dquarkus.native.container-build=true
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: push
    paths:
      - build
      - .gradle
  artifacts:
    paths:
      - reading-comprehension-server-quarkus-impl/build/

docker_build:
  stage: docker_build
  script:
    - cd reading-comprehension-server-quarkus-impl
    - docker build -f infrastructure/Dockerfile -t registry.gitlab.com/connorbutch/reading-comprehension:$CI_COMMIT_SHORT_SHA  .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker push registry.gitlab.com/connorbutch/reading-comprehension:$CI_COMMIT_SHORT_SHA

acceptance_test:
  stage: acceptance_test
  only:
    - merge_requests
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - cd reading-comprehension-server-quarkus-impl/infrastructure
    - export IMAGE_TAG=$CI_COMMIT_SHORT_SHA
    - docker-compose up -d & ../../wait-for-it-2.sh
    - cd ../..
    - ./gradlew -DBASE_URL='192.168.0.8' acceptanceTest
  artifacts:
    paths:
      - reading-comprehension/reading-comprehension-server-quarkus-impl/build/
Run Code Online (Sandbox Code Playgroud)

docker-compose 文件可以在这里找到: https://gitlab.com/connorbutch/reading-compressive/-/blob/9-list-all-assessments/reading-compressive-server-quarkus-impl/infrastruct/docker- compose.yml

在此处查找失败作业之一的输出: https://gitlab.com/connorbutch/reading-compressive/-/jobs/734771859

#This file is NOT ever intended for use in production.  Docker-compose is a great tool for running
#database with our application for acceptance testing.
version: '3.3'

networks:
  network:
    ipam:
      driver: default
      config:
        - subnet: 192.168.0.0/24

services:
  db:
    image: mysql:5.7.10
    container_name: "db"
    restart: always
    environment:
       MYSQL_DATABASE: "rc"
       MYSQL_USER: "user"
       MYSQL_PASSWORD: "password"
       MYSQL_ROOT_PASSWORD: "password"
       MYSQL_ROOT_HOST: "%"
    networks:
      network:
        ipv4_address: 192.168.0.4
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - db:/var/lib/mysql
  reading-comprehension-ws:
    image: "registry.gitlab.com/connorbutch/reading-comprehension:${IMAGE_TAG}"
    container_name: "reading-comprehension"
    restart: on-failure
    environment:
      WAIT_HOSTS: "db:3306"
      DB_USER: "user"
      DB_PASSWORD: "password"
      DB_JDBC_URL: "jdbc:mysql://192.168.0.4:3306/rc"
    networks:
      network:
        ipv4_address: 192.168.0.8
    ports:
      - 8080:8080
    expose:
      - 8080
volumes:
  db:
Run Code Online (Sandbox Code Playgroud)

有谁知道如何访问 gitlab ci 服务器上 docker-compose 中运行的容器的 IP?欢迎任何建议。

谢谢,

康纳

Fac*_*cty 5

这有点棘手,就在几天前我也遇到了类似的问题,但是使用了从 CI 到客户端的 VPN :)

编辑:本地 gitlab 实例的解决方案

为 gitlab 运行者创建自定义网络:

docker network create --subnet=172.16.0.0/28 \
 --opt com.docker.network.bridge.name=gitlab-runners \
 --opt com.docker.network.bridge.enable_icc=true \
 --opt com.docker.network.bridge.enable_ip_masquerade=true \
 --opt com.docker.network.bridge.host_binding_ipv4=0.0.0.0 \
 --opt com.docker.network.driver.mtu=9001 gitlab-runners
Run Code Online (Sandbox Code Playgroud)

将新网络附加到 gitlab-runners

# /etc/gitlab-runner/config.toml
[[runners]]
....
   [runners.docker]
   ....
   network_mode = "gitlab-runners"
Run Code Online (Sandbox Code Playgroud)

重新启动跑步者。

最后是 gitlab-ci.yml

start-vpn:
    stage: prepare-deploy
    image: docker:stable
    cache: {}
    variables:
        GIT_STRATEGY: none
    script:
        - >
            docker run -it -d --rm
            --name vpn-branch-$CI_COMMIT_REF_NAME
            --privileged
            --net gitlab-runners
            -e VPNADDR=$VPN_SERVER
            -e VPNUSER=$VPN_USER
            -e VPNPASS=$VPN_PASSWORD
            auchandirect/forticlient || true && sleep 2
        - > 
            docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 
            vpn-branch-$CI_COMMIT_REF_NAME > vpn_container_ip
    artifacts:
        paths:
        - vpn_container_ip
Run Code Online (Sandbox Code Playgroud)

在下一步中,您可以使用以下内容:

before_script:
        - ip route add 10.230.163.0/24 via $(cat vpn_container_ip) # prod/dev
        - ip route add 10.230.164.0/24 via $(cat vpn_container_ip) # test
Run Code Online (Sandbox Code Playgroud)

编辑:gitlab.com 的解决方案

基于gitlab 问题答案, DinD 中的端口映射与 nonDinD gitlab-runner 有点不同,对于公开的端口,您应该使用主机名“docker”。

例子:

services:
  - docker:stable-dind

variables:
  DOCKER_HOST: "tcp://docker:2375"

stages:
  - test

test env:
  image: tmaier/docker-compose:latest
  stage: test
  script:
    # containous/whoami with exposed port 80:80
    - docker-compose up -d
    - apk --no-cache add curl
    - curl docker:80              # <------- 
    - docker-compose down
Run Code Online (Sandbox Code Playgroud)