需求
因为测试需要,需要快速构建一系列 docker 镜像包,并上传到指定镜像仓库。
实现一
该实现利用镜像重新tag的思路制作简单的镜像。
创建文件
vim z-gen-img.sh
编写程序
#!/bin/bash
#
# sudo ./z-gen-img.sh baseImg:tag newImgName [num] [repo-uri]
# baseImg:tag : 基础镜像名称及版本, alpine:latest
# newImgName : 新镜像名称
# num : 默认 10
# repo-url : 默认 localhost:5000
# 使用示例:
#
# sudo ./z-gen-img.sh alpine:latest img 5
# 表示:基于alpine:latest生成一个img镜像,生成5个版本,上传到默认仓库 localhost:5000
# sudo ./z-gen-img.sh mysql:8 img01 6 localhost:5001
# 表示: 基于mysql:8 生成一个app01镜像,生成6个版本,上传到 http://localhost:5001 仓库
# 基础镜像
baseImg=$1
# 镜像名称
name=$2
# 程序版本个数
num=$3
# 仓库地址
uri=$4
echo " 基础镜像: $baseImg"
echo " 镜像名为: $name "
echo " 镜像版本数: $num "
# 程序名不能以数字开头
if [[ ! -n "$baseImg" ]];
then
echo "基础镜像必填"
exit 500
fi
# 程序名不能以数字开头
if [[ "$name" =~ ^[0-9].* ]];
then
echo "名称不能以数字开头"
exit 500
fi
# 数据校验,如果不输入,则默认是 10
if [[ ! -n "$num" ]];
then
num = 10
fi
if [[ ! "$num" =~ [0-9]* ]]
then
echo "版本数只能是数字 1 -- 20"
exit 500
fi
if [[ "$num" -gt 20 || "$num" -lt 1 ]]
then
echo "版本数范围 1 -- 20"
exit 500
fi
# 仓库地址处理
if [[ ! -n "$uri" ]];
then
uri="localhost:5000"
fi
# 循环生成并推送到仓库
for ((i=1;i<=$num;i++));
do
newImgName="$uri/$name:0.$i.0"
# 基于基础镜像大标签
docker tag $baseImg $newImgName
# 推送到指定仓库
docker push $newImgName
# 删除本地标签
docker rmi $newImgName
sleep 5
done
使用
语法:
./z-gen-img.sh baseImg:tag newImgName [num] [repo-uri]
- baseImg:tag : 基础镜像名称及版本, alpine:latest
- newImgName : 新镜像名称
- num : 默认 10
- repo-url : 默认 localhost:5000
使用示例:
sudo ./z-gen-img.sh alpine:latest img 5
表示:基于alpine:latest生成一个img镜像,生成5个版本,上传到默认仓库 localhost:5000sudo ./z-gen-img.sh mysql:8 img01 6 localhost:5001
表示: 基于mysql:8 生成一个app01镜像,生成6个版本,上传到 http://localhost:5001 仓库
注
因为使用 docker 用户权限的身份命令,如使用 sudo
命令运行
实现二
高实现利用Dcokerfile
构建镜像原理,包含Dcokerfile和可执行文件z-gen-img.sh
两个文件。
Dockerfile 文件
FROM nginx
RUN echo "demo img"
z-gen-img.sh 文件
#!/bin/bash
#
# sudo ./z-gen-img.sh newImgName [num] [repo-uri]
# newImgName : 新镜像名称
# num : 默认 10
# repo-url : 默认 localhost:5000
# 使用示例:
#
# sudo ./z-gen-img.sh img 5
# 表示:基于 Dockerfile 生成 img 镜像,生成5个版本,上传到默认仓库 localhost:5000
# sudo ./z-gen-img.shimg01 6 localhost:5001
# 表示: 基于 Dockerfile 生成一个app01镜像,生成6个版本,上传到 http://localhost:5001 仓库
# 镜像名称
name=$1
# 程序版本个数
num=$2
# 仓库地址
uri=$3
echo " 镜像名为: $name "
echo " 镜像版本数: $num "
# 程序名不能以数字开头
if [[ "$name" =~ ^[0-9].* ]];
then
echo "名称不能以数字开头"
exit 500
fi
# 数据校验,如果不输入,则默认是 10
if [[ ! -n "$num" ]];
then
num = 10
fi
if [[ ! "$num" =~ [0-9]* ]]
then
echo "版本数只能是数字 1 -- 20"
exit 500
fi
if [[ "$num" -gt 20 || "$num" -lt 1 ]]
then
echo "版本数范围 1 -- 20"
exit 500
fi
# 仓库地址处理
if [[ ! -n "$url" ]];
then
uri="localhost:5000"
fi
# 循环生成并推送到仓库
for ((i=1;i<=$num;i++));
do
newImgName="$uri/$name:0.$i.0"
# 基于基础镜像大标签
docker build -t $newImgName .
# 推送到指定仓库
docker push $newImgName
# 删除本地标签
docker rmi $newImgName
# 暂停5秒
sleep 5
done
使用
语法:
./z-gen-img.sh newImgName [num] [repo-uri]
- newImgName : 新镜像名称
- num : 默认 10
- repo-url : 默认 localhost:5000
使用示例:
sudo ./z-gen-img.sh img 5
表示:生成一个img镜像,生成5个版本,上传到默认仓库 localhost:5000sudo ./z-gen-img.sh img01 6 localhost:5001
表示: 生成一个app01镜像,生成6个版本,上传到 http://localhost:5001 仓库