在 GitLab CI/CD 中使用内置的容器镜像库
配置 Docker-in-Docker
Docker-in-Docker (dind) means:
- 你应该注册一个
Docker executor或Kubernetes 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_PASSWORD 和 CI_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_HOST 和 DOCKER_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 service 的 insecure-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 中使用内置的容器镜像库的更多相关文章
- 实践分享!GitLab CI/CD 快速入门
用过 GitLab 的同学肯定也对 GitLab CI/CD 不陌生,GitLab CI/CD 是一个内置在 GitLab 中的工具,它可以帮助我们在每次代码推送时运行一系列脚本来构建.测试和验证代码 ...
- GitLab CI/CD的官译【原】
CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...
- 手把手详解持续集成之GitLab CI/CD
一.环境准备 首先需要有一台 GitLab 服务器,然后需要有个项目:这里示例项目以 Spring Boot 项目为例,然后最好有一台专门用来 Build 的机器,实际生产中如果 Build 任务不频 ...
- .NetCore 配合 Gitlab CI&CD 实践 - 开篇
引言 这是一个系列的文章,讲述的是一个中小型开发团队如何从零开始使用搭建基建 GitLab 代码托管平台,以及使用 GitLab Runner 实现 CI/CD 的故事.本系列通过部署一个完整的 .n ...
- .NetCore 配合 Gitlab CI&CD 实践 - 单体项目
前言 上一篇博文 .NetCore 配合 Gitlab CI&CD 实践 - 开篇,主要简单的介绍了一下 GitLab CI 的持续集成以及持续部署,这篇将通过 GitLab CI 发布一个 ...
- GitLab CI/CD 自动化部署入门
前言:因为找了B站内推,测试开发,正好知道内部使用GitLab做自动化测试,所以简单学了一下,有错误的地方请指正. 入门 初始化 cp: 无法获取'/root/node-v12.9.0-linux-x ...
- 使用 Gitlab CI/CD 实现自动化发布站点到 IIS
说明 这里先介绍下两个东西 CI/CD.GitLab Runner,当然在此之前你需要对 git 有所了解,关于 git 这里不做说明,可以自行百度. 首先介绍 CI/CD :随着我们开发方式的转变, ...
- 前端初探 Gitlab CI/CD
前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就是其中一项,那么什么是 C ...
- .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker
之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...
- Gitlab CI/CD
Gitlab CI/CD 前言 纵观人类历史的发展以及三次工业革命,你会发现利用机器来替代部分人力劳动,将重复的工作自动化从而解放生产力都是发展的必然趋势,在软件工程领域也不例外,其中 CI/CD 就 ...
随机推荐
- Threejs的三维坐标系
在三维空间中,所有的物体和相机都需要基于一个统一的坐标系来进行定位和操作.理解坐标系的基本概念,对于创建稳定.准确的三维效果至关重要. 基础 Three.js 采用的是右手坐标系,这意味着如果你将右手 ...
- 一文聊清楚Redis主从复制原理
本地缓存带来的挑战 分布式缓存相比于本地缓存,在实现层面需要关注的点有哪些不同.梳理如下: 维度 本地缓存 集中式缓存 缓存量 受限于单机内存大小,存储数据有限 需要提供给分布式系统里面所有节点共同使 ...
- 优化简历的开源工具「GitHub 热点速览」
有读者留言问我是不是"跑路"了,上周没发「GitHub 热点速览」是因为在忙于编写<HelloGitHub 月刊>.这不,我带着诚意满满的开源项目又回来啦!首先要分享一 ...
- Qt No Target Architecture
在QT中引入processthreadsapi.h,如果出现 "No Target Architecture",需要在processthreadsapi.h前引入windows.h ...
- C#调用Python脚本的方式(一),以PaddleOCR-GUI为例
前言 每种语言都有每种语言的优势,Python由于其强大的生态,很多任务通过调用包就可以实现,那么学会从C#项目中调用Python脚本完成任务就很重要.C#调用Python代码有多种方式,如果Pyth ...
- 对象存储COS-数据处理能力升级!“组合拳”助力存储新时代!
近日腾讯云对象存储(COS)完成了"存储"到"存储+"的升级! 互联网让信息传播的更快,人们仿佛对信息更加渴望,我们身边的产品越来越多,获取信息的类型也丰富多样 ...
- [Blazor] 一文理清 Blazor Identity 鉴权验证
一文理清 Blazor Identity 鉴权验证 摘要 在现代Web应用程序中,身份认证与授权是确保应用安全性和用户数据保护的关键环节.Blazor作为基于C#和.NET的前端框架,提供了丰富的身份 ...
- sublime text 4 安装(含激活码)
一.下载步骤 官网地址:Sublime Text - the sophisticated text editor for code, markup and prose windows下载链接:Than ...
- 【Mybatis-Plus进阶学习(八)】SQL注入器
使用SQL注入器就可以自定义例如selectById的默认方法. 实现步骤Step1:创建定义方法的类:Step2:创建注入器:Step3:在Mapper中加入自定义方法. 自定义注入器的简单使用 第 ...
- Qt数据库应用22-文件编码格式识别
一.前言 在做数据导入导出的过程中,如果应用场景多了,相信各位都会遇到一个问题就是文件编码的问题,有些文件是ANSI编码,有些是utf8编码,有些又是utf8带bom编码,不同的文件编码如果都用同一种 ...