You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitLab CI的DinD环境中配置/etc/hosts主机映射的技术咨询

在GitLab CI的Docker-in-Docker(DinD)环境中添加/etc/hosts映射

我来帮你搞定在GitLab CI的DinD环境里添加主机映射的问题~咱们分两种场景来处理,对应不同的需求:

1. 修改DinD作业容器自身的/etc/hosts

如果只是需要让运行CI脚本的那个docker:dind容器能解析这个主机名,直接在脚本开头加一行echo命令就行——因为docker:dind基于Alpine Linux,修改/etc/hosts不需要sudo,直接执行:

在你的script块最前面加上这两句(第二句是验证用的,可选):

script:
  # 把主机映射追加到DinD容器的/etc/hosts里
  - echo "124.343.23.34 gitlab.example.com" >> /etc/hosts
  # 可选:检查一下是不是真的加上了
  - cat /etc/hosts
  # 下面是你原来的脚本内容
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
  - docker pull $DOCKER_DEV_IMAGE
  # ...剩下的命令

2. 让DinD里启动的子容器也用上这个映射

如果你的需求是让那些用docker run启动的子容器(比如$DOCKER_DEV_IMAGE、node:current-alpine)也能解析这个主机名,有两种简单的办法:

办法一:每个docker run命令加--add-host参数

这是最直接的方式,给每个启动子容器的命令加上--add-host gitlab.example.com:124.343.23.34,比如:

script:
  # 原来的登录、拉镜像命令不变
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
  - docker pull $DOCKER_DEV_IMAGE
  - docker pull node:current-alpine
  # 给每个docker run加上--add-host参数
  - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www $DOCKER_DEV_IMAGE composer install -n
  - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www $DOCKER_DEV_IMAGE bin/console fos:js-routing:dump --format=json --target=public/js/fos_js_routes.json
  - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www node:current-alpine yarn install
  - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www node:current-alpine yarn prod

办法二:配置DinD的Docker daemon全局生效

如果所有子容器都需要这个映射,不想每个命令都加参数,可以修改Docker daemon的配置,让它默认给所有启动的容器加上这个host映射:

script:
  # 先创建Docker daemon的配置目录和文件
  - mkdir -p /etc/docker
  - echo '{"extra_hosts": ["gitlab.example.com:124.343.23.34"]}' > /etc/docker/daemon.json
  # 重启Docker daemon让配置生效(注意:重启会短暂停服务,确保此时没在运行容器)
  - killall dockerd
  # 等一会儿,确保Docker daemon重启完成
  - while ! docker info > /dev/null 2>&1; do sleep 1; done
  # 下面是你原来的脚本内容
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
  # ...剩下的命令

给你的完整作业示例

结合第一种场景和办法一(最常用的组合),完整的cache:build作业配置如下:

cache:build:
  stage: cache
  image: docker:dind
  services:
    - redis:latest
    - docker:dind
  tags:
    - docker
  cache:
    <<: *cache_build
    policy: pull-push
  script:
    # 添加映射到DinD自身的/etc/hosts
    - echo "124.343.23.34 gitlab.example.com" >> /etc/hosts
    - cat /etc/hosts # 验证一下
    # 原有登录拉镜像命令
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker pull $DOCKER_DEV_IMAGE
    - docker pull node:current-alpine
    # 带--add-host的子容器启动命令
    - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www $DOCKER_DEV_IMAGE composer install -n
    - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www $DOCKER_DEV_IMAGE bin/console fos:js-routing:dump --format=json --target=public/js/fos_js_routes.json
    - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www node:current-alpine yarn install
    - docker run --rm --add-host gitlab.example.com:124.343.23.34 -v $(pwd):/var/www -w /var/www node:current-alpine yarn prod

最后提个小注意点:DinD环境通常需要GitLab runner开启特权模式,不然修改/etc/hosts或者Docker daemon配置可能会失败,如果你遇到权限问题,先检查一下runner的配置哦~

内容的提问来源于stack exchange,提问作者Vladislav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:02:35