Docker 发布镜像构建
·
好的,我们来详细解析这个 GitLab CI/CD 配置,并举例说明它是如何工作的。
这是一个名为 build_docker 的 Job(任务),它是 GitLab CI/CD 流水线中的一个步骤。
配置逐行详解
-
build_docker:- 含义: 定义了一个 Job 的名称。在 GitLab CI 中,每个 Job 是流水线中的一个独立执行单元。
-
variables:- 含义: 定义 Job 级别的环境变量。这些变量只在这个
build_dockerJob 中有效。 DOCKER_REGISTRY: 10.90.0.100:500- 含义: 设置了一个变量
DOCKER_REGISTRY,其值为10.90.0.100:500。这通常是一个私有 Docker 镜像仓库的地址和端口,用于推送(push)或拉取(pull) Docker 镜像。虽然这个 Job 里没有直接使用它来docker push,但后续的脚本或这个镜像里的工具可能会引用这个变量。
- 含义: 设置了一个变量
- 含义: 定义 Job 级别的环境变量。这些变量只在这个
-
stage: docker- 含义: 指定这个 Job 属于哪个阶段(stage)。阶段是用来将 Job 分组的,例如
build,test,deploy。同一个阶段的所有 Job 会并行执行(如果配置允许),而不同阶段会按顺序执行。这里它属于docker阶段,通常意味着这个阶段的任务与 Docker 镜像的构建和打包有关。
- 含义: 指定这个 Job 属于哪个阶段(stage)。阶段是用来将 Job 分组的,例如
-
image: oceanx-ecm-installer:0.1.4- 含义: 指定运行这个 Job 的执行器(runner) 使用哪个 Docker 镜像来创建执行环境。它本身不是在构建这个镜像,而是在这个镜像提供的环境中运行
script里的命令。 - 解读: 这个 Job 会在一个名为
oceanx-ecm-installer,标签为0.1.4的 Docker 容器中运行。这个镜像很可能包含了打包 OceanX ECM 应用所需的特定工具和脚本。
- 含义: 指定运行这个 Job 的执行器(runner) 使用哪个 Docker 镜像来创建执行环境。它本身不是在构建这个镜像,而是在这个镜像提供的环境中运行
-
tags: - ecm- 含义: 指定哪些 GitLab Runner 可以执行这个 Job。Runner 在注册时会打上标签(tag)。
- 解读: 只有那些被标记为
ecm的 Runner(很可能是有特定环境或权限的机器)才会来领取并执行这个 Job。这确保了任务在正确的服务器上运行。
-
only: - tags- 含义: 定义了触发这个 Job 的规则。
only: - tags表示只有当你推送(push)一个带有标签(git tag)的提交时,这个 Job 才会被触发执行。 - 解读: 这非常适合用于发布流程。平时的普通提交(
git commit)不会触发这个耗时的 Docker 打包任务,只有当你认为代码达到发布标准并打上版本标签(如v1.0.0)时,它才会运行。
- 含义: 定义了触发这个 Job 的规则。
-
script:- 含义: 这是 Job 的核心,定义了要依次执行的一系列 shell 命令。
- tar -xf /root/public/installer/apply_in_docker.tar -C /root- 解读: 解压一个位于 Runner 容器内
/root/public/installer/目录下的apply_in_docker.tar压缩包到/root目录。这个文件可能是基础环境模板或安装脚本。
- 解读: 解压一个位于 Runner 容器内
- tar -xf /builds/oceanx-ecm/OceanXShare/build.tar -C /root/apply_in_docker/ECM/apply_in_docker/- 解读: 解压另一个压缩包
build.tar到指定目录。这个build.tar就是关键,它是由dependencies中指定的另一个 Job 产生的。
- 解读: 解压另一个压缩包
-
dependencies: - build_code_tar- 含义: 指定当前 Job 依赖 哪个 Job 的产物(artifacts)。GitLab Runner 会在执行当前 Job 之前,自动将依赖 Job 的产物下载到当前 Job 的工作目录中。
- 解读: 这里声明了依赖
build_code_tar这个 Job。这意味着build_code_tarJob 产生的build.tar文件会被自动下载到当前 Job 的工作目录(默认为/builds//<namespace>/<project-name>/)中。这就是为什么第二条tar命令可以找到/builds/oceanx-ecm/OceanXShare/build.tar这个路径的原因。
-
needs: - build_code_tar- 含义: 定义 Job 的执行顺序关系。
needs允许 Job 绕过阶段的顺序限制,只要它“需要”的 Job 完成,它就可以开始,即使它属于后面的阶段。这可以大大缩短流水线的整体执行时间(实现有向无环图 DAG)。 - 解读: 这里
needs和dependencies指向同一个 Job,是一种常见用法。它不仅表示“我需要它的产物”,也表示“我可以不用等docker阶段开始,只要build_code_tar一完成,我就可以立刻开始执行”。
- 含义: 定义 Job 的执行顺序关系。
工作流程举例说明
假设你的项目地址为 https://gitlab.example.com/oceanx-ecm/OceanXShare。
-
开发者准备发布: 开发完成,测试通过,准备发布版本
1.2.0。 -
创建 Git 标签:
git tag v1.2.0 git push origin v1.2.0 -
触发流水线: 推送
v1.2.0标签的行为,触发了 GitLab CI/CD 流水线。 -
执行
build_code_tarJob: 流水线中一个名为build_code_tar的 Job(这个 Job 的定义不在你提供的代码片段中)首先执行。它的作用很可能是编译源代码(例如用 Maven 编译 Java 代码),然后将编译好的程序包、配置文件等打包成一个名为build.tar的压缩包。GitLab Runner 会将这个build.tar文件保存为产物(artifacts)。 -
执行
build_dockerJob:- GitLab Runner 找到一个带有
ecm标签的机器。 - 在这个机器上,Runner 拉取
oceanx-ecm-installer:0.1.4镜像并启动一个容器。 - 自动下载产物: Runner 将
build_code_tarJob 产生的build.tar下载到容器内的项目目录下,路径类似于/builds/oceanx-ecm/OceanXShare/build.tar。 - 运行脚本:
- 第一条命令:
tar -xf /root/public/installer/apply_in_docker.tar -C /root。这里解压的是执行器镜像(oceanx-ecm-installer:0.1.4) 中自带的文件。它提供了一个 Docker 应用的“骨架”或基础环境。 - 第二条命令:
tar -xf /builds/oceanx-ecm/OceanXShare/build.tar -C /root/apply_in_docker/ECM/apply_in_docker/。这里将刚刚下载的最新编译好的程序包解压到上一步准备好的“骨架”目录中。这样,最新的代码就和 Docker 环境模板结合在了一起。
- 第一条命令:
- (推测)在这个
oceanx-ecm-installer镜像的入口脚本中,很可能在script命令结束后,还会自动执行一些操作,比如:进入/root/apply_in_docker目录,运行docker build命令来构建一个完整的应用镜像,然后使用variables中定义的DOCKER_REGISTRY地址将这个新镜像推送出去。你提供的配置片段中省略了这一步,但这是整个 Job 最可能的目的。
- GitLab Runner 找到一个带有
总结
这个 build_docker Job 是一个自动化 Docker 镜像构建流程的关键部分。它的作用是:
- 仅在发布时触发(打 git tag 时)。
- 在一个专用的环境(
oceanx-ecm-installer镜像)中运行。 - 获取已编译好的程序包(来自
build_code_tarJob)。 - 将程序包与** Docker 环境模板**相结合。
- (很可能)最终产出一个可供部署的、包含了你应用程序的 Docker 镜像。
这种配置实现了编译(Build)和打包(Package)的分离,使得流程更加清晰和模块化。
更多推荐


所有评论(0)