在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
相关产品推荐
相关产品推荐

