Gitlab CI/CD 实践五:基础镜像 Dockerfile 仓库 CI 流水线配置

202402201512745

基础镜像Dockerfile集中管理

完整代码:https://github.com/EchoGroot/dockerfile

优点

  • 结合Gitlab CI,可以快速便捷地新建和更新镜像。
  • 可以快速找到镜像对应的 Dockerfile,明确镜像的具体组成,避免重复造轮子。
  • 基于Dockerfile,方便对镜像进行扩展。

如何使用

  1. 创建、修改Dockerfile文件,提交到仓库,就会触发 Gitlab 流水线,自动构建镜像并上传到Harbor。
  2. 此仓库单分支管理,可直接在main分支上提交。
  3. 项目结构,拿golang基础镜像举例:common/golang/1.17.9/Dockerfile
    1. 第一级目录对应harbor的项目。
    2. 第二级目录为镜像名称。
    3. 第三级目录为镜像版本。
    4. 在第三级目录下存放镜像的DockerfileREADME.md(非必要)以及打镜像所需的文件。
  4. 请严格按照上诉项目结构存放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
  • 每次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。

参考资料

  1. VPGAME 的 Kubernetes 迁移实践
  2. devops
  3. linux shell 文件路径 分解 解析 切分 ${str:a:b} 用法
作者:Yuyy
博客:https://yuyy.info

评论

  1. rantrism
    Windows Chrome
    2年前
    2022-6-22 10:04:45

    您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。

  2. Yuyy
    博主
    Linux Chrome
    2年前
    2022-6-24 11:43:10

    我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=ds11aka0db0v

  3. 1
    Macintosh Chrome
    2年前
    2022-9-23 15:03:45

    标题的 Dockerfile 拼错了

    • Yuyy
      博主
      1
      Linux Chrome
      2年前
      2022-9-23 17:47:45

      哈哈 感谢指正!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇