GitLab CI + docker dind + registry-mirror

只要是人作的事,隨着重複執行次數的增長,不免引入失誤,因此如今強調IaC(基礎架構即代碼)。筆者目前的工做與之息息相關,目標是構建一條 CI/CD流水線,將項目編譯、測試、打包、發佈自動化,選型時根據公司現狀,決定用GitLab CI 實現。html

本文主要是記錄了經過GitLab CI 構建項目的容器鏡像時遇到的一個小問題:使用dind(docker in docker)時,須要配置registry-mirror。git

1、選用的組件

一、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

2、注意點
3、配置

一、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
相關文章
相關標籤/搜索