4.3 runner里的docker-in-docker

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.3 runner里的docker-in-docker相关的知识,希望对你有一定的参考价值。

参考技术A

在使用gitlab的CI/CD流程进行自动化配置的时候,很容易碰到的一个需求就是,在容器内部打包一个容器镜像。这话听起来很绕,但是做过的人都知道。这个时候需要容器里有一个docker的后台进程,而在容器里配置一个docker进程它的成本是很高的,你需要修改启动的初始进程,那么就需要改镜像文件,这些改动过程中会遇到很多不可预料的问题。因此,业界也提出了一些基础方案,目前用的最多的两种是:

上面两种方法其实大同小异,但是在实际操作的时候还需要配置 unprivileged=true ,即给容器不受限制的权限,此时容器内甚至可以直接操作宿主机上的环境(也称为容器泄露)。在内网里用一下还可以,但是在一些安全要求非常高的公网上或者公司内,这种方案基本上就是直接被否决的。

下面我们来看看在gitlab的CI/CD里,它是怎么满足这类需求的。

这种方式是在主机上安装runner时候可以使用,直接使用主机上安装好的docker命令,由 gitlab-runner 用户来执行对应的命令,因此需要给它配置特殊的权限。具体的操作流程是:

如果有权限,那么会输出docker的信息

Docker in Docker(dind)表示:

在上面提到的Docker容器镜像里,安装了所有dockr工具,能够在 特权模式下 在镜像的环境里运行CI/CD任务。同时你需要指定这个镜像的具体版本,例如 docker:19.03.12 ,如果你使用 docker:stable 这样的标签来使用镜像,那么镜像的版本是不确定的,特别是当新版本发布的时候。

dind的限制:

启用dind的TLS,可以让容器之间的通信更安全。启用方式是:

上面的命令指定了执行器是docker类型,镜像版本,特权容器权限和挂载卷。挂载卷挂载的是物理机上docker的证书文件。上面的命令会创建一个config.toml 文件,内容如下:

这种方式是直接使用服务容器里配置好的docker服务。

要在k8s里使用启用了TLS的dind,步骤如下:

上面不光指定了卷挂载,还指定了容器镜像名称和特权模式。

上面就是三种使用方式,还有一些细节性的配置。后面再继续更新了。

以上是关于4.3 runner里的docker-in-docker的主要内容,如果未能解决你的问题,请参考以下文章

Flutter ios 真机调试

如何修复 Flutter build_runner 错误:无法预编译 build_runner:build_runner:

Gitlab-runner 安装和配置

Runner.app/Runner.app/...无限循环Xcode构建失败

无法预编译 build_runner:build_runner:

文件 `Runner.app/Frameworks/Runner.xcworkspace` 没有此位置的当前文件类型