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

基础镜像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,否则流水线无法正常工作。

如何实现

仓库结构

├── build-image.sh
├── xx
│   └── 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
│   │   │   └── Dockerfile
│   │   ├── 1.17.9
│   │   │   ├── Dockerfile
│   │   │   └── README.md
│   │   └── 1.19
│   │       ├── Dockerfile
│   │       └── README.md
│   ├── golangci-lint
│   │   ├── 1.44.2
│   │   │   ├── Dockerfile
│   │   │   └── README.md
│   │   └── 1.48.0
│   │       └── Dockerfile
│   ├── kubectl
│   │   ├── 1.19.10
│   │   │   └── Dockerfile
│   │   ├── 1.21.10
│   │   │   └── Dockerfile
│   │   └── 1.9.11
│   │       └── 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
│   │   └── 1.28.1
│   │       └── Dockerfile
│   └── ubuntu
│       └── 20.04
│           └── 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.1.1.2-runner
  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。
  • 所有tag的镜像删除操作必须放到最后,否则不能彻底删除镜像,目前没搞明白为啥

Dockerfile

common/golang/1.19/Dockerfile

FROM golang:1.19

# 设置私服
RUN go env -w GOPRIVATE=git.google.com

# 设置忽略私服的https证书校验
RUN go env -w GOINSECURE=git.google.com
RUN git config --global http.sslverify false
RUN git config --global https.sslverify false

# 设置代理
RUN go env -w GOPROXY="https://goproxy.cn,direct"

RUN go env -w GO111MODULE=on
  • git.google.com:私服地址更换成自己公司内部的git地址,可用于下载内部的go依赖。

common/golangci-lint/1.48.0/Dockerfile

FROM 172.30.3.150/common/golang:1.19

RUN go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.48.0

common/kubectl/1.19.10/Dockerfile

FROM bitnami/kubectl:1.19.10

USER root

RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && \
    apt-get install apt-transport-https ca-certificates -y && \
    apt-get update &&  \
    apt-get install -y --no-install-recommends make git

参考资料

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

作者:Yuyy
博客:https://yuyy.info

评论

  1. rantrism
    Windows Chrome
    5月前
    2022-6-22 10:04:45

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

  2. Yuyy
    博主
    Linux Chrome
    5月前
    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
小恐龙
花!
上一篇
下一篇