main
分支上提交。common/golang/1.17.9/Dockerfile
。 Dockerfile
、README.md
(非必要)以及打镜像所需的文件。.
├── 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
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
#!/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。