基础镜像Dockerfile集中管理
完整代码:https://github.com/EchoGroot/dockerfile
优点
- 结合Gitlab CI,可以快速便捷地新建和更新镜像。
- 可以快速找到镜像对应的 Dockerfile,明确镜像的具体组成,避免重复造轮子。
- 基于Dockerfile,方便对镜像进行扩展。
如何使用
- 创建、修改Dockerfile文件,提交到仓库,就会触发 Gitlab 流水线,自动构建镜像并上传到Harbor。
- 此仓库单分支管理,可直接在
main
分支上提交。
- 项目结构,拿golang基础镜像举例:
common/golang/1.17.9/Dockerfile
。
- 第一级目录对应harbor的项目。
- 第二级目录为镜像名称。
- 第三级目录为镜像版本。
- 在第三级目录下存放镜像的
Dockerfile
、README.md
(非必要)以及打镜像所需的文件。
- 请严格按照上诉项目结构存放Dockerfile,否则流水线无法正常工作。
仓库结构
.
├── .gitignore
├── .gitlab-ci.yml
├── README.md
├── build-image.sh
└── common
├── alpine-timezone-shanghai
│ └── 3.11.3
│ └── Dockerfile
├── arthas
│ ├── 3.7.1
│ │ └── Dockerfile
│ └── README.md
├── debug-tools
│ ├── 1.0.0
│ │ └── Dockerfile
│ └── README.md
├── docker-alpine
│ └── 3.16.0
│ ├── Dockerfile
│ └── README.md
├── frps
│ └── 0.48.0
│ └── Dockerfile
├── golang
│ ├── 1.17
│ │ └── Dockerfile
│ ├── 1.17.9
│ │ ├── Dockerfile
│ │ └── README.md
│ ├── 1.19
│ │ ├── Dockerfile
│ │ └── README.md
│ └── 1.20.3
│ ├── Dockerfile
│ └── README.md
├── golang-node
│ └── 1.0.0
│ ├── Dockerfile
│ └── README.md
├── golangci-lint
│ ├── 1.44.2
│ │ ├── Dockerfile
│ │ └── README.md
│ ├── 1.48.0
│ │ └── Dockerfile
│ └── 1.52.2
│ └── Dockerfile
├── hugo
│ └── 0.98.0
│ └── Dockerfile
├── kubectl
│ ├── 1.19.10
│ │ └── Dockerfile
│ ├── 1.21.10
│ │ └── Dockerfile
│ ├── 1.25.12
│ │ └── Dockerfile
│ └── 1.9.11
│ └── Dockerfile
├── kubectl-golang
│ ├── 1.19.10
│ │ └── Dockerfile
│ └── 1.28.2
│ └── Dockerfile
├── ldap-client
│ └── 1.0.0
│ └── Dockerfile
├── maven
│ ├── 3.8.6-jdk-11
│ │ ├── Dockerfile
│ │ └── settings.xml
│ └── 3.8.6-jdk-8
│ ├── Dockerfile
│ └── settings.xml
├── node
│ ├── 10.23-buster
│ │ └── Dockerfile
│ └── 14.20.0
│ └── Dockerfile
├── node-nginx
│ └── 10.9.0-alpine
│ └── Dockerfile
├── openjdk
│ ├── 11-jre-buster
│ │ └── Dockerfile
│ └── 8-alpine
│ └── Dockerfile
├── protoc
│ └── 3.21.9
│ └── Dockerfile
├── samba
│ └── 1.0.0
│ └── Dockerfile
├── samba-client-serpi90
│ └── 1.0.0
│ └── Dockerfile
└── ubuntu
└── 20.04
└── Dockerfile
流水线脚本:.gitlab-ci.yml
stages:
- build
build_image:
stage: build
tags:
- x86
image: 172.1.1.1/common/docker-alpine:latest
script:
- chmod +x ./build-image.sh && ./build-image.sh
构建镜像脚本: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。
参考资料
- VPGAME 的 Kubernetes 迁移实践
- devops
- linux shell 文件路径 分解 解析 切分 ${str:a:b} 用法
Post Views: 2,412
您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=ds11aka0db0v
标题的 Dockerfile 拼错了
哈哈 感谢指正!