只要是人作的事,隨着重複執行次數的增長,不免引入失誤,因此如今強調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