配置 Docker-in-Docker

Docker-in-Docker (dind) means:

  • 你应该注册一个 Docker executorKubernetes executor
  • 执行器(executor)使用 docker 镜像运行你的 CI/CD jobs

参考 Docker-in-Docker with TLS disabled in the Docker executor

身份认证

docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

CI_REGISTRY_USER CI_REGISTRY_PASSWORDCI_REGISTRY 都是 CI/CD 变量

参考:Authenticate with the Container Registry

Gitlab Runner 配置

[root@localhost test]# cat /etc/gitlab-runner/config.toml
[[runners]]
....
[runners.docker]
tls_verify = false
privileged = true
image = "docker:20.10.16"
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
extra_hosts = ["registry.gitlab.example.com:your-gitlab-instance-host"]

构建并推送镜像到镜像库

[root@localhost opt]# cat .gitlab-ci.yml
stages:
- build build-image:
stage: build
image: docker:20.10.16
services:
- name: docker:20.10.16-dind
command: ["--insecure-registry", "registry.gitlab.example.com"]
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
before_script:
- docker info
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t $IMAGE_TAG .
- docker push $IMAGE_TAG

使用镜像库的镜像

[root@localhost opt]# cat .gitlab-ci.yml
stages:
- test # before_script: docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY format:
stage: test
image: registry.gitlab.example.com/group/project:tag
variables:
CGO_ENABLED: 1
script:
- go fmt $(go list ./... | grep -v /vendor/)
- go vet $(go list ./... | grep -v /vendor/)
- go test -race $(go list ./... | grep -v /vendor/)

Troubleshooting

docker: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

原因是 Docker daemon 启动失败,请检查 docker executor 是否配置正确,是否配置 CI/CD 变量 DOCKER_HOSTDOCKER_TLS_CERTDIR

参考 Docker-in-Docker with TLS disabled in the Docker executor

Error response from daemon: Get "https://registry.gitlab.example.com/v2/": dial tcp: lookup registry.gitlab.example.com on 192.168.40.190:53: no such host

原因是在 job 执行中使用了 docker-in-docker(dind)方式运行一个 Docker daemon,这个 docker daemon 没有使用宿主机的 /etc/hosts 文件,而是使用了默认的 DNS 服务器来解析所需的域名。因此,当尝试登陆registry.gitlab.example.com 时,DNS 无法解析这个名字,导致了错误

解决方法:为 Docker runner 添加额外的 hosts 映射

[[runners]]
....
[runners.docker]
....
extra_hosts = ["registry.gitlab.example.com:your-gitlab-instance-host"]
Error response from daemon: Get "https://registry.gitlab.example.com/v2/": x509: certificate is not valid for any names, but wanted to match registry.gitlab.example.com

原因是 Docker daemon 无法验证镜像仓库自签的 SSL 证书

解决方法:把这个镜像仓库添加到 dind serviceinsecure-registries 列表中

通过挂载配置文件的方式
[root@localhost opt]# cat /opt/daemon.json
{
"insecure-registries": ["registry.gitlab.example.com"]
} [root@localhost opt]# cat /etc/gitlab-runner/config.toml
[[runners]]
....
[runners.docker]
....
volumes = ["/opt/daemon.json:/etc/docker/daemon.json:ro"]
通过 GitLab Runner 配置的方式
[[runners]]
...
executor = "docker"
[runners.docker]
...
privileged = true
[[runners.docker.services]]
name = "docker:20.10.16-dind"
command = ["--insecure-registry", "registry.gitlab.example.com"]
通过 CLI flag 的方式
[root@localhost opt]# cat .gitlab-ci.yml
build-image:
stage: build
image: docker:20.10.16
services:
- name: docker:20.10.16-dind
command: ["--insecure-registry", "registry.gitlab.example.com"]

补充:在 CLI 中使用容器镜像库

# 登录
docker login registry.gitlab.example.com # 构建镜像
docker build -t registry.gitlab.example.com/group/project . # 推送镜像
docker push registry.gitlab.example.com/group/project

参考文档

Build and push container images to the Container Registry

Use Docker to build Docker images

在 GitLab CI/CD 中使用内置的容器镜像库的更多相关文章

  1. 实践分享!GitLab CI/CD 快速入门

    用过 GitLab 的同学肯定也对 GitLab CI/CD 不陌生,GitLab CI/CD 是一个内置在 GitLab 中的工具,它可以帮助我们在每次代码推送时运行一系列脚本来构建.测试和验证代码 ...

  2. GitLab CI/CD的官译【原】

    CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...

  3. 手把手详解持续集成之GitLab CI/CD

    一.环境准备 首先需要有一台 GitLab 服务器,然后需要有个项目:这里示例项目以 Spring Boot 项目为例,然后最好有一台专门用来 Build 的机器,实际生产中如果 Build 任务不频 ...

  4. .NetCore 配合 Gitlab CI&CD 实践 - 开篇

    引言 这是一个系列的文章,讲述的是一个中小型开发团队如何从零开始使用搭建基建 GitLab 代码托管平台,以及使用 GitLab Runner 实现 CI/CD 的故事.本系列通过部署一个完整的 .n ...

  5. .NetCore 配合 Gitlab CI&CD 实践 - 单体项目

    前言 上一篇博文 .NetCore 配合 Gitlab CI&CD 实践 - 开篇,主要简单的介绍了一下 GitLab CI 的持续集成以及持续部署,这篇将通过 GitLab CI 发布一个 ...

  6. GitLab CI/CD 自动化部署入门

    前言:因为找了B站内推,测试开发,正好知道内部使用GitLab做自动化测试,所以简单学了一下,有错误的地方请指正. 入门 初始化 cp: 无法获取'/root/node-v12.9.0-linux-x ...

  7. 使用 Gitlab CI/CD 实现自动化发布站点到 IIS

    说明 这里先介绍下两个东西 CI/CD.GitLab Runner,当然在此之前你需要对 git 有所了解,关于 git 这里不做说明,可以自行百度. 首先介绍 CI/CD :随着我们开发方式的转变, ...

  8. 前端初探 Gitlab CI/CD

    前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就是其中一项,那么什么是 C ...

  9. .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker

    之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...

  10. Gitlab CI/CD

    Gitlab CI/CD 前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就 ...

随机推荐

  1. seldom-platform颠覆传统的自动化测试平台

    1. 传统的自动化测试平台 近些年,中等以上规模的公司测试团队都在建设自己的自动化测试平台.主要要以 HTTP接口测试 和 性能测试 为主:一些平台还支持 Web UI测试和App UI测试等,试图通 ...

  2. Java设计模式——职责链模式:解锁高效灵活的请求处理之道

    嘿,各位 Java 编程大神和爱好者们!今天咱们要一同深入探索一种超厉害的设计模式--职责链模式.它就像一条神奇的"处理链",能让请求在多个对象之间有条不紊地传递,直到找到最合适的 ...

  3. springgateway 路由转发

    有些情况下,我们希望不直接访问后端地址,这个时候可以通过springgateway网关进行处理.下面只是一个简单的例子. 至于URL,变化,我们可以通过编写程序逻辑来实现. 实现步骤: 1.新建项目 ...

  4. cmu15545笔记-WAL和数据库恢复

    目录 总览 缓存策略(Buffer Pool Policies) Shadow Paging(No-Steal + Force) SQLite Rollback Mode(Steal + Force) ...

  5. 人工智能大语言模型起源篇,低秩微调(LoRA)

    上一篇: <规模法则(Scaling Law)与参数效率的提高> 序言:您在找工作时会不会经常听到LoRA微调,这项技术的来源就是这里了. (12)Hu.Shen.Wallis.Allen ...

  6. Node开发规范v1.0

    一.空格与格式 (一)缩进 采用2个空格缩进,而不是tab缩进. 空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来更紧凑.明快. 变量声明 永远用var声明变量,不 ...

  7. ng-alain: Title Service

    文档地址:https://ng-alain.com/theme/title/zh 源码地址: https://github.com/ng-alain/delon/blob/master/package ...

  8. 爬虫自动化脚本+AI赋能

    简介 估计大家对网页爬取和数据抓取已经有所了解,市面上也有许多现成的软件可供使用.例如,前几天群里有位朋友利用爬虫技术抓取了AV网站,并搭建了一个磁力链接站点. 本文将介绍如何模拟手动操作,将一些繁琐 ...

  9. git clone 需要密码

    在使用Git管理代码项目的过程中,经常需要使用到git clone命令来克隆远程仓库到本地.有时候会碰到克隆远程仓库需要输入密码才能进行的情况.本文将会介绍如何解决这个问题. git clone 需要 ...

  10. Qt音视频开发19-vlc内核各种事件通知

    一.前言 对于使用第三方的sdk库做开发,除了基本的操作函数接口外,还希望通过事件机制拿到消息通知,比如当前播放进度.音量值变化.静音变化.文件长度.播放结束等,有了这些才是完整的播放功能,在vlc中 ...