基础镜像Dcokerfile集中管理
优点
- 结合Gitlab CI,可以快速便捷地新建和更新镜像。
- 可以快速找到镜像对应的 Dockerfile,明确镜像的具体组成,避免重复造轮子。
- 基于Dockerfile,方便对镜像进行扩展。
如何使用
- 创建、修改Dockerfile文件,提交到仓库,就会触发 Gitlab 流水线,自动构建镜像并上传到Harbor。
- 此仓库单分支管理,可直接在
main
分支上提交。 - 项目结构,拿golang基础镜像举例:
common/golang/1.17.9/Dockerfile
。- 第一级目录对应harbor的项目。
- 第二级目录为镜像名称。
- 第三级目录为镜像版本。
- 在第三级目录下存放镜像的
Dockerfile
、README.md
(非必要)以及打镜像所需的文件。
- 请严格按照上诉项目结构存放Dockerfile,否则流水线无法正常工作。
如何实现
仓库结构
.
├── build-image.sh
├── cloud
│ └── xx-service-base
│ └── v1.3
│ ├── Dockerfile
│ └── xx-service-base-requirements.txt
├── common
│ ├── alpine-timezone-shanghai
│ │ └── 3.11.3
│ │ └── Dockerfile
│ ├── docker-alpine
│ │ └── 3.16.0
│ │ ├── Dockerfile
│ │ └── README.md
│ ├── golang
│ │ └── 1.17.9
│ │ ├── Dockerfile
│ │ └── README.md
│ ├── kubectl
│ │ └── 1.19.10
│ │ └── Dockerfile
│ ├── node-nginx
│ │ └── 10.9.0-alpine
│ │ └── Dockerfile
│ └── openjdk
│ └── 8-alpine
│ └── Dockerfile
├── devops
│ └── startup-script
│ └── v1
│ ├── Dockerfile
│ ├── manage-startup-script.sh
│ └── startup-script.yml
└── README.md
.gitlab-ci.yml
stages:
- build
build_image:
stage: build
tags:
- 172.x.x.x-runner
image: 172.x.x.x/common/docker-alpine:latest
script:
- chmod +x ./build-image.sh && ./build-image.sh
- 每次commit都会触发流水线
build-image.sh
#!/bin/bash
docker login "${DOCKER_REGISTRY_SERVER}" --username "${DOCKER_REGISTRY_USER}" --password "${DOCKER_REGISTRY_PASSWORD}"
FILES=$(git diff --name-only --diff-filter=d HEAD^ HEAD | grep Dockerfile | sort)
if [ ${#FILES[*]} -eq 0 ]; then
echo "No Dockerfile changed, skip build image"
exit 0
fi
for FILE in $FILES; do
DIR=$(dirname "$FILE")
echo "DIR: $DIR"
cd $DIR
VERSION=${DIR##*/}
echo "VERSION: $VERSION"
IMAGE_NAME=${DIR%/*}
echo "IMAGE_NAME: $IMAGE_NAME"
docker build -t $IMAGE_NAME:$VERSION .
docker tag "$IMAGE_NAME:$VERSION" "${DOCKER_REGISTRY_ADDR}/$IMAGE_NAME:$VERSION"
docker tag "$IMAGE_NAME:$VERSION" "${DOCKER_REGISTRY_ADDR}/$IMAGE_NAME:latest"
docker push "${DOCKER_REGISTRY_ADDR}/$IMAGE_NAME:$VERSION"
docker push "${DOCKER_REGISTRY_ADDR}/$IMAGE_NAME:latest"
docker rmi -f "${DOCKER_REGISTRY_ADDR}/$IMAGE_NAME:$VERSION"
docker rmi -f "${DOCKER_REGISTRY_ADDR}/$IMAGE_NAME:latest"
docker rmi -f "$IMAGE_NAME:$VERSION"
cd -
done
DOCKER_REGISTRY_SERVER
:gitlab里配置的变量。git diff
:commit变动的文件。--diff-filter=d
:过滤删除的文件。HEAD^ HEAD
:上一次commit。- 所有tag的镜像删除操作必须放到最后,否则不能彻底删除镜像,目前没搞明白为啥
参考资料
https://www.infoq.cn/article/xdgdpbzjhaxaook0p9lv
https://github.com/kubesphere-retired/devops/blob/master/hack/util.sh
https://blog.csdn.net/whatday/article/details/106076384
您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=ds11aka0db0v