使用 Harbor 自动化管理 Docker 镜像

产生需求

为了应对网络连接速度慢的问题,我们可以将一些常用的 Docker 镜像存储在本地,方便需要时快速拉取。这里选择的工具是 Harbor。以下是一个示例脚本,使用 Bash 编写,用于自动化拉取镜像并将其推送到本地部署的 Harbor。

前提条件

  1. 已经在本地部署了 Harbor 并配置好。
  2. Docker 已经安装并配置好。
  3. 可以通过 Docker CLI 访问 Harbor。

为了安全地处理 Docker 登录凭据,可以使用 Docker 提供的凭据存储功能,也可以直接在脚本中传递用户名和密码。以下是两种方法的示例:

方法一:使用 Docker 凭据存储

1. 登录到 Harbor 并保存凭据

在终端中手动执行一次登录操作,这样凭据会被 Docker 存储在本地配置中。

docker login 192.168.1.12:19088

输入用户名和密码完成登录。Docker 会将凭据保存在 ~/.docker/config.json 文件中。

2. 修改脚本

因为凭据已经保存,脚本中可以省略登录步骤,下面的dockerhub也需要替换为自己准备的Harbor的项目名称,并且将需要同步的镜像写入到images.txt文件当中。

#!/bin/bash

# 镜像列表文件
IMAGE_LIST_FILE="images.txt"

# Harbor 的地址和项目名
HARBOR_ADDRESS="192.168.1.12:19088"
HARBOR_PROJECT="dockerhub"

# 从文件中读取镜像列表
if [ ! -f "$IMAGE_LIST_FILE" ]; then
    echo "镜像列表文件不存在: $IMAGE_LIST_FILE"
    exit 1
fi

# 读取每一行镜像并处理
while IFS= read -r IMAGE; do
    if [[ -n "$IMAGE" ]]; then
        # 拉取镜像
        docker pull "$IMAGE"

        # 获取镜像名和标签
        IMAGE_NAME=$(echo "$IMAGE" | awk -F':' '{print $1}')
        IMAGE_TAG=$(echo "$IMAGE" | awk -F':' '{print $2}')
        if [[ -z "$IMAGE_TAG" ]]; then
            IMAGE_TAG="latest"
        fi

        # 打标签
        TARGET_IMAGE="$HARBOR_ADDRESS/$HARBOR_PROJECT/$(basename $IMAGE_NAME):$IMAGE_TAG"
        docker tag "$IMAGE" "$TARGET_IMAGE"

        # 推送到 Harbor
        docker push "$TARGET_IMAGE"

        # 删除本地镜像
        docker rmi "$IMAGE" "$TARGET_IMAGE"
    fi
done < "$IMAGE_LIST_FILE"

方法二:在脚本中传递用户名和密码

如果你更倾向于在脚本中明确地设置用户名和密码,可以按以下方式修改脚本:

1. 修改脚本

在脚本中添加用户名和密码变量,并在 docker login 命令中使用它们。如果选择这种方法需要注意的事情是将Harbor 登录凭据这个地方的username和password替换为自己的Harbor的账号与密码,还需要注意授予这个账号密码访问权限,下面的dockerhub也需要替换为自己准备的Harbor的项目名称,并且将需要同步的镜像写入到images.txt文件当中。

#!/bin/bash

# 镜像列表文件
IMAGE_LIST_FILE="images.txt"

# Harbor 的地址和项目名
HARBOR_ADDRESS="192.168.1.12:19088"
HARBOR_PROJECT="dockerhub"

# Harbor 登录凭据
HARBOR_USERNAME="username"
HARBOR_PASSWORD="password"

# 从文件中读取镜像列表
if [ ! -f "$IMAGE_LIST_FILE" ]; then
    echo "镜像列表文件不存在: $IMAGE_LIST_FILE"
    exit 1
fi

# 登录到 Harbor
echo "$HARBOR_PASSWORD" | docker login $HARBOR_ADDRESS -u "$HARBOR_USERNAME" --password-stdin

# 读取每一行镜像并处理
while IFS= read -r IMAGE; do
    if [[ -n "$IMAGE" ]]; then
        # 拉取镜像
        docker pull "$IMAGE"

        # 获取镜像名和标签
        IMAGE_NAME=$(echo "$IMAGE" | awk -F':' '{print $1}')
        IMAGE_TAG=$(echo "$IMAGE" | awk -F':' '{print $2}')
        if [[ -z "$IMAGE_TAG" ]]; then
            IMAGE_TAG="latest"
        fi

        # 打标签
        TARGET_IMAGE="$HARBOR_ADDRESS/$HARBOR_PROJECT/$(basename $IMAGE_NAME):$IMAGE_TAG"
        docker tag "$IMAGE" "$TARGET_IMAGE"

        # 推送到 Harbor
        docker push "$TARGET_IMAGE"

        # 删除本地镜像
        docker rmi "$IMAGE" "$TARGET_IMAGE"
    fi
done < "$IMAGE_LIST_FILE"

# 登出 Harbor
docker logout $HARBOR_ADDRESS

请注意,直接在脚本中包含明文密码是不安全的,尤其是如果脚本可能被共享或存储在不安全的位置。推荐使用第一种方法,即使用 Docker 凭据存储,以确保凭据的安全性。

定时任务设置

为了实现自动化拉取,我们可以将脚本设置为定时任务,设置为每10天检查一次更新。以下是具体步骤:

修改 crontab

1. 打开 crontab 编辑器
crontab -e
2. 添加定时任务

crontab 编辑器中添加以下行:

0 1 */10 * * /path/to/pull_and_push_images.sh

这行命令的意思是每10天的凌晨1点(01:00)运行脚本。记得将 /path/to/pull_and_push_images.sh 替换为实际脚本的路径。

3. 保存并退出

crontab 编辑器中完成修改后,保存并退出。

最终步骤

  1. 打开 crontab

    如果你还在 nano 编辑器中,你已经看到了 crontab 文件的内容。

  2. 添加新的定时任务

    你已经添加了以下行:

    0 1 */10 * * /home/hellohistory/automation_script/pull_and_push_images.sh
    
  3. 保存并退出

    Ctrl + O 保存文件,然后按 Enter 确认。接着按 Ctrl + X 退出编辑器。

  4. 验证 crontab 设置

    使用以下命令验证你的 crontab 设置是否成功:

    crontab -l
    

    你应该能看到类似以下的输出:

    0 1 */10 * * /home/hellohistory/automation_script/pull_and_push_images.sh
    

脚本文件检查

确保你的脚本文件 /home/hellohistory/automation_script/pull_and_push_images.sh 是可执行的。如果还没有设置可执行权限,可以使用以下命令:

chmod +x /home/hellohistory/automation_script/pull_and_push_images.sh

这样,每10天凌晨1点,脚本 /home/hellohistory/automation_script/pull_and_push_images.sh 就会自动运行,拉取并推送镜像到本地的 Harbor 项目中。

运行脚本

  1. 设置可执行权限

    确保脚本具有可执行权限:

    chmod +x /home/hellohistory/automation_script/pull_and_push_images.sh
    
  2. 手动运行脚本

    手动运行脚本并查看日志文件:

chmod +x /home/hellohistory/automation_script/pull_and_push_images.sh
/home/hellohistory/automation_script/pull_and_push_images.sh
  1. 查看日志文件

    检查日志文件 /home/hellohistory/automation_script/log.txt 以查看脚本的输出和错误信息:

cat /home/hellohistory/automation_script/log.txt

通过查看日志文件中的输出和错误信息,你可以诊断和解决可能存在的问题。如果推送镜像失败,请检查日志中具体的错误信息,以进一步排查问题。

这样,我们就完成了具体的设置工作,接下来可以运行脚本开始任务即可。

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Jenkins是一个持续集成工具,用于自动化构建、测试和部署软件。Docker是一个开源的容器化平台,可以帮助开发人员打包应用程序和其依赖项成为一个容器。Harbor是一个企业级的Docker镜像注册表,可以帮助组织管理和存储Docker镜像。 在自动化部署流程中,Jenkins可以与DockerHarbor结合使用,实现自动化构建、打包和部署应用程序的流程。具体步骤如下: 首先,开发人员在代码仓库中提交新的代码。Jenkins会定期检测代码仓库的变化,一旦检测到新的代码提交,Jenkins就会触发自动化构建流程。 在构建过程中,Jenkins会使用Docker来创建应用程序的镜像,将应用程序和其依赖项打包成一个可移植的容器。然后,Jenkins会将构建的镜像推送到Harbor中进行存储与管理。 接下来,Jenkins会触发自动化部署流程。在部署过程中,Jenkins会从Harbor中拉取最新的镜像,并将其部署到目标环境中。这可以是测试环境、预发布环境或生产环境,具体取决于组织的部署策略。 在部署完成后,Jenkins可以执行自动化测试流程,验证应用程序在目标环境中的运行情况。如果测试通过,部署流程就会顺利完成。如果测试失败,Jenkins会通知相关人员,并触发回滚流程。 通过整合Jenkins、DockerHarbor,可以实现一个端到端的自动化部署流程,帮助组织提高软件交付的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值