概述

计划基于Docker部署GitLab 构建CI/CD 工具链,CI/CD 构建过程可能需要一系列的命令行工具来完成不同的任务,例如 JSON 数据处理、SSH 连接到远程服务器实行命令、从版本控制库拉取代码等。为了方便且可重复使用地执行这些任务,我们可以使用 Docker 构建一个自定义的工具Docker镜像,其中包含常用的命令行工具,如 jq、sshpass、git、curl 等。在本文中,我们将探讨为什么要采取这种做法,并介绍这些工具的作用。

为什么自定义构建工具容器?

通过在 GitLab CI/CD 中使用自定义构建工具容器,并预先安装常用的命令行工具,可以提高构建的一致性、可移植性和效率。

  • 一致的环境: 在 CI/CD 环境中,保持一致的执行环境非常重要。通过在容器中预安装所需的命令行工具,可以确保每次构建使用的环境都是相同的,避免由于依赖版本不同而引发的问题。
  • 可移植性: 自定义构建工具容器可以轻松地在不同的 CI/CD 环境中使用,而无需担心主机系统的配置问题。这种可移植性使得团队成员之间可以共享构建工具容器,从而提高了协作效率。
  • 减少构建时间: 预先构建包含常用工具的容器镜像可以减少每次构建的时间。由于这些工具已经被预先安装在容器中,构建过程中无需再次下载和安装,从而加快了构建速度。

常用工具介绍

  • jq: jq 是一个轻量级的命令行 JSON 处理工具,用于解析、筛选和转换 JSON 数据。它提供了丰富的查询语法和功能,使得在命令行中处理 JSON 数据变得非常方便。
  • sshpass: sshpass 是一个简单的命令行工具,用于在非交互式的情况下为 SSH 提供密码。它可以自动将密码传递给 SSH 客户端,从而实现在脚本中自动化 SSH 连接的目的。
  • git: git 是一个分布式版本控制系统,广泛用于管理代码和协作开发。它提供了一系列强大的命令行工具,用于版本控制、分支管理、代码合并等操作。
  • curl: curl 是一个功能强大的命令行工具,用于发送和接收 HTTP 请求。它支持多种协议和数据格式,并提供了丰富的选项和参数,使得在命令行中进行网络请求变得非常灵活和方便。

除了上述工具读者可以根据需要添加自己需要的工具。

构建

编辑如下内容的Dockerfile,从ubuntu:jammt-20240227的基础镜像开始构建一个新的容器镜像,然后在其中安装常用的命令行工具 jq、sshpass、git 和 curl。

FROM ubuntu:jammt-20240227
RUN apt-get update && apt-get install -y jq sshpass git curl

在同级目录下执行如下命令,构建工具镜像

docker build -t docker.mvcode.cn:8083/devtools:1.0.0 .

用VScode是否可以链接docker_容器

然后通过如下命令,将镜像推动到镜像库。推送到镜像库后我们就可以随便使用了。

docker push docker.mvcode.cn:8083/devtools:1.0.0

用VScode是否可以链接docker_容器_02

测试

在实际的构建过程中我们使用如下方式运行命令

docker run --rm  docker.mvcode.cn:8083/devtools:1.0.0 xxx
  • docker run: 这是 Docker 命令行工具中用于运行容器的命令。它告诉 Docker 在新的容器中执行指定的镜像。
  • --rm: 这是一个选项标志,告诉 Docker 在容器停止后自动删除容器。这样可以确保在容器退出后不会留下残留的容器实例,节省系统资源。
  • docker.mvcode.cn:8083/devtools:1.0.0: 这是要运行的 Docker 镜像的标识符。其中 docker.mvcode.cn:8083 是 Docker 镜像的主机地址和端口号,devtools:1.0.0 是镜像的名称和版本号。
  • xxx: 这是要在容器中执行的命令。一旦容器启动,它会立即执行 xxx 命令。

用VScode是否可以链接docker_ci/cd_03

jq

jq 是一个强大的命令行 JSON 处理工具,它可以用于解析、查询、过滤和转换 JSON 数据。下面是一些 jq 命令的使用示例:

假设有一个名为 data.json 的 JSON 文件,内容如下:

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

jq 来选择 JSON 对象中的特定字段。例如,如果您只想要显示 name 字段的值,执行下面命令。-v选项映射本地目录到容器的/tools/data目录:

docker run --rm -v ./:/tools/data/ docker.mvcode.cn:8083/devtools:1.0.0 jq '.name' /tools/data/data.json

用VScode是否可以链接docker_用VScode是否可以链接docker_04

您可以使用 jq 来根据特定条件过滤 JSON 数据。例如,假设您只想显示年龄大于 25 岁的人的信息:

docker run --rm -v ./:/tools/data/ docker.mvcode.cn:8083/devtools:1.0.0 jq 'select(.age > 25)' /tools/data/data.json

用VScode是否可以链接docker_Docker_05

您也可以使用-w 选项设置容器的工作目录,使用相对地址的data.json文件

docker run --rm -v ./:/tools/data/ -w /tools/data/ docker.mvcode.cn:8083/devtools:1.0.0 jq 'select(.age > 25)' data.json

用VScode是否可以链接docker_容器_06

git

git命令就不用多说了,我们执行下面命令随便Clone Gitlab上的一个项目来测试一下。我使用token的方式访问gitlab仓库。glpat-UN6h9sTN4BAEoNx-YyoF为我的token,仓库也是用Docker搭建的(后续会介绍)没啥可以需要保密的。

docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
git clone http://root:glpat-UN6h9sTN4BAEoNx-YyoF@192.168.3.37:9080/team1/springbootdemo.git

用VScode是否可以链接docker_Docker_07

sshpass

sshpass 是一个命令行工具,用于在非交互式的情况下为 SSH 提供密码。通过 sshpass,您可以通过命令行自动化 SSH 连接,并执行远程命令或脚本。

以下是使用 sshpass 远程执行命令和脚本的基本示例:

  1. 远程执行单个命令:
sshpass -p 'your_password' ssh -o StrictHostKeyChecking=no user@hostname 'command_to_execute'

在这个命令中,your_password 是您的 SSH 密码,user 是您要连接的远程主机的用户名,hostname 是远程主机的地址,command_to_execute 是您要在远程主机上执行的命令。-o StrictHostKeyChecking=no 选项告诉 SSH 客户端在连接时不进行主机密钥验证,这在某些情况下可能会被用于自动化的环境中.执行如下命令:

docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
sshpass -p '你的密码' ssh -o StrictHostKeyChecking=no copier@192.168.3.52 'echo 123'

用VScode是否可以链接docker_Docker_08

需要注意的是,使用 sshpass 命令来传输密码可能会有一些安全风险,因为密码将以明文形式出现在命令行中,可能被其他人或进程看到。因此,您应该仔细考虑是否有更安全的方法来进行身份验证,例如使用 SSH 密钥认证。

curl

要使用 curl 命令访问百度网站,您可以执行以下命令:

docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
curl www.baidu.com

用VScode是否可以链接docker_docker_09

如果您想要查看详细的连接信息,可以使用 -v 选项(verbose):

docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
curl -v www.baidu.com

用VScode是否可以链接docker_ci/cd_10

这将输出包括请求和响应的详细信息。其他选项就不再演示有需要可以搜索一下。

请注意,由于网络环境或其他原因,可能会影响您对百度网站的访问。