产生需求
为了应对网络连接速度慢的问题,我们可以将一些常用的 Docker 镜像存储在本地,方便需要时快速拉取。这里选择的工具是 Harbor。以下是一个示例脚本,使用 Bash 编写,用于自动化拉取镜像并将其推送到本地部署的 Harbor。
前提条件
- 已经在本地部署了 Harbor 并配置好。
- Docker 已经安装并配置好。
- 可以通过 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
编辑器中完成修改后,保存并退出。
最终步骤
-
打开
crontab
:如果你还在
nano
编辑器中,你已经看到了crontab
文件的内容。 -
添加新的定时任务:
你已经添加了以下行:
0 1 */10 * * /home/hellohistory/automation_script/pull_and_push_images.sh
-
保存并退出:
按
Ctrl + O
保存文件,然后按Enter
确认。接着按Ctrl + X
退出编辑器。 -
验证
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 项目中。
运行脚本
-
设置可执行权限:
确保脚本具有可执行权限:
chmod +x /home/hellohistory/automation_script/pull_and_push_images.sh
-
手动运行脚本:
手动运行脚本并查看日志文件:
chmod +x /home/hellohistory/automation_script/pull_and_push_images.sh
/home/hellohistory/automation_script/pull_and_push_images.sh
-
查看日志文件:
检查日志文件
/home/hellohistory/automation_script/log.txt
以查看脚本的输出和错误信息:
cat /home/hellohistory/automation_script/log.txt
通过查看日志文件中的输出和错误信息,你可以诊断和解决可能存在的问题。如果推送镜像失败,请检查日志中具体的错误信息,以进一步排查问题。
这样,我们就完成了具体的设置工作,接下来可以运行脚本开始任务即可。