GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channel=content&utm_source=csdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。
更多关于极狐GitLab :https://gitlab.cn 或者 DevOps 的最佳实践,可以关注文末的极狐GitLab 公众号。
学习极狐GitLab 的相关资料:
- 极狐GitLab 官网:https://gitlab.cn
- 极狐GitLab 官网文档:https://docs.gitlab.cn
- 极狐GitLab 论坛:https://forum.gitlab.cn/
- 极狐GitLab 安装配置:https://gitlab.cn/install
- 极狐GitLab 资源中心:https://resources.gitlab.cn
搜索【极狐GitLab】公众号,后台输入加群,备注gitlab,即可加入官方微信技术交流群。
关联阅读
- 云原生时代,如何保证容器镜像安全?
- 极狐GitLab 镜像仓库使用技巧
docker 是一种非常常用的容器化技术,自从 2013 年正式面世以来,就迅速发展成为容器化的标准。它通过将应用运行所需的运行时环境“打包”起来,大大简化了应用程序的运行和交付,这个包可以在任何安装了 docker 的环境上运行,真正做到了 build once, run anywhere。
不少研发人员也喜欢在本地用 docker 来构建自己的研发测试环境,代码变更以后就用 docker build
构建出一个容器镜像,然后用 docker run
来运行一个容器,然后对应用进行测试。
但是真是研发过程中可能还会遇到这样的问题,环境本身就在 docker 中运行,但是又必须要在这个环境中运行 docker 命令,也就是我们常说的 docker in docker
,俗称 dind
。
一般使用如下命令就可以完成容器镜像的自动构建并推送到极狐GitLab 内置的容器镜像仓库:
# 登录容器镜像仓库
$ docker login registry.jihulab.com
# 构建容器镜像
$ docker build -t registry.jihulab.com/YOUR-GROUP/YOUR-PROJECT .
# 将容器镜像推送到极狐GitLab 内置的容器镜像仓库
$ docker push registry.jihulab.com/YOUR-GROUP/YOUR-PROJECT
在极狐GitLab 中,容器镜像的自动构建往往都是通过极狐GitLab CI 来实现的,也就是要将上面的三行命令写入极狐GitLab 的 .gitlab-ci.yml
文件:
build:stage: buildscript:- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
如果 Runner 使用的是 shell 执行器,那么只需要 Runner 所在的服务器有 docker 环境即可。但是如果使用的是 docker 执行器,那么这时候执行上面命令,就变成了 docker in docker
的场景。当然,极狐GitLab 也是支持,不过 .gitlab-ci.yml
文件中,构建内容就变成了:
build:image: docker:lateststage: buildservices:- docker:20.10.7-dindscript:- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY- docker build -t $CI_REGISTRY_IMAGE:1.0.0 .- docker push $CI_REGISTRY_IMAGE:1.0.0
注意上面使用了 docker:20.10.7-dind
的容器镜像,说明整个构建使用的是 docker in docker
环境。这个过程中可能会遇到下面的问题:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
也就是说 docker 命令执行的时候,没有办法链接到宿主机的 docker 进程。这时候需要在 Runner 的配置文件 config.toml
中增加以下内容:
[runners.docker]volumes = ["/cache","/var/run/docker.sock:/var/run/docker.sock"]
也就是将宿主机的 /var/run/docker.sock
文件挂在到容器里面,容器里面的 docker 命令实际调用的还是宿主机的 docker 进程来完成 docker 命令。
在极狐GitLab CI 界面上就会看到镜像构建成功的日志:
- 登录极狐GitLab 内置的容器镜像仓库
- 构建容器镜像
- 推送到极狐GitLab 内置的容器镜像仓库
可以在极狐GitLab 内置的容器镜像仓库查到对应的镜像:
搜索关注【极狐GitLab 公众号】,成为 DevOps 技术专家。