无法在docker runner中解析具有依赖服务的gitlab ci作业的服务主机名

czq61nw1  于 2023-03-29  发布在  Docker
关注(0)|答案(1)|浏览(142)

设置

  • gitlab 15.8-ee
  • Windows Server 2019 Datacenter(安装了Windows功能容器)
  • 安装了executor docker-windows的gitlab runner

问题

所有不依赖于服务的构建脚本都可以正常运行。
现在我想使用mysql作为我的集成测试的服务。我已经构建了一个可以使用的自定义mysql容器。
过去我在linux上使用了相同的docker设置。所以这是肯定应该工作的东西。
问题是我的容器不能解析或ping主机名db。我已经连接到我的构建容器和mysql容器来确定ip地址,并验证它们可以互相ping。

build-container-ip: 172.25.177.32
mysql-container-ip: 172.25.187.223

我希望构建容器可以解析主机名为db的mysql容器,但事实并非如此。
我不确定这是gitlab docker runner的问题还是windows上的docker的问题。我很有信心构建脚本本身是好的。我如何跟踪或解决问题?我的构建容器需要知道服务的ip。

示例脚本和输出

stages:
  - build

build:
  image: registry.company.tld/company/build-images/devenv:latest
  stage: build
  tags:
    - windows
    - docker
  services:
    - name: registry.company.tld/company/build-images/mysql-win:latest
      alias: db
  variables:
    MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
  script: 
    - mysqlping -h db

相关输出

C:\mysql\bin\mysqladmin.exe: connect to server at 'db' failed
error: 'Unknown MySQL server host 'db' (2)'
Check that mysqld is running on db and that the port is 3306.
You can check this by doing 'telnet db 3306'

使用docker inspect可以看出什么

  • 生成容器具有命名的主机名
"Config": {
            "Hostname": "runner-gkokct4y-project-10-concurrent-0",
            "Domainname": "",
  • 服务容器具有随机主机名
"Config": {
            "Hostname": "ee98c58eed41",
            "Domainname": "",
  • 我可以从构建容器ping随机主机名
ruarlubt

ruarlubt1#

我自己想出来的,解决办法在连接服务一节
要使此解决方案起作用,必须使用为每个作业创建新网络的网络模式。
TLDR:您必须在运行器级别(在config.toml中)设置特性标志FF_NETWORK_PER_BUILD

[[runners]]
  (...)
  executor = "docker"
  environment = ["FF_NETWORK_PER_BUILD = 1"]

Or:

[[runners]]
  (...)
  executor = "docker"
  [runners.feature_flags]
    FF_NETWORK_PER_BUILD = true

gitlab-ci.yml文件中

stages:
  - build

build:
  image: registry.company.tld/company/build-images/devenv:latest
  stage: build
  tags:
    - windows
    - docker
  services:
    - name: registry.company.tld/company/build-images/mysql-win:latest
      alias: db
  variables:
    FF_NETWORK_PER_BUILD: 1
    MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
  script: 
    - mysqlping -h db

我在gitlab-ci.yml文件中设置了它,它立刻就像预期的那样工作了。过去我只在kubernetes的gitlab-runner上使用过这个设置。由于docs的功能标志明确提到了docker executor
允许使用docker executor为每个构建创建Docker网络
我猜这是kubernetes runner的默认行为。
因此,与我最初的假设相反,这个问题与windows上的docker有关,它可能在linux docker上也不起作用,所以我将改写标题以反映这一点。

相关问题