只要是人作的事,随着重复执行次数的增长,不免引入失误,因此如今强调IaC(基础架构即代码)。笔者目前的工做与之息息相关,目标是构建一条 CI/CD流水线,将项目编译、测试、打包、发布自动化,选型时根据公司现状,决定用GitLab CI 实现。html
本文主要是记录了经过GitLab CI 构建项目的容器镜像时遇到的一个小问题:使用dind(docker in docker)时,须要配置registry-mirror。git
一、GitLab Runner
GitLab Runner 是配合GitLab CI使用的,是一个执行构建脚本的东西,而GitLab CI就是这些Runner 的管理中心,全部 Runner 都要在GitLab-CI里面登记注册,而且代表本身是为哪一个GitLab 项目服务的。当项目发生变化时,GitLab CI就会通知相应的 Runner 执行构建脚本。docker
GitLab Runner 的安装能够有多种方式,好比二进制 、Docker,因为构建过程每每是较为消耗资源的,因此笔者选择了Docker方式,而且安装在k8s集群中,方便管理以及动态扩容。session
二、dind(docker in docker)
因为Runner被Docker化运行在真实的物理机上,当须要在Docker化的Runner里构建项目镜像时就涉及到"Docker run Docker"的问题,官方给出了几种解决方案,你们能够根据实际状况作出选择。笔者这篇文章记录了试验“docker in docker”方案时遇到的问题。架构
docker in docker有风险,需了解清楚再决定是否使用。tcp
一、GitLab Runner
配置文件:/etc/gitlab-runner/config.toml ,主要是“privileged = true”配置项,开启特权模式,从而可使用dind。固然开启需谨慎,笔者只是试验用,并未真正用在正式环境。gitlab
concurrent = 10 check_interval = 0 [session_server] session_timeout = 1800 [[runners]] name = "share-runner-k8s" url = "http://$ip/" token = "$token" cache_dir = "/cache" [runners.kubernetes] bearer_token_overwrite_allowed = false privileged = true #重要!!!开启特权模式,才能够正常使用dind。 service_account = "gitlab-runner"
二、.gitlab-ci.yml测试
build_docker_image: stage: build_image variables: DOCKER_HOST: tcp://localhost:2375 image: docker:18.06.3-git #指定v19.03以前的版本,以便避开TLS配置(试验使用,正式环境请使用高版本开启TLS)。 services: - name: docker:18.06.3-dind command: ["--registry-mirror=http://$ip:$port/"] #经过command能够配置额外参数。 script: - build_docker_image only: - branches tags: - share-runner-k8s