This commit is contained in:
wandoubaba 2024-10-11 21:24:47 +08:00
commit edddd71968
7 changed files with 1150 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.log
Dockerfile.*

31
README.md Normal file
View File

@ -0,0 +1,31 @@
# dockerporter
一个可以将`images.yaml`清单中的多个来源的镜像标签构建为多平台镜像并推送到一个指定仓库的工具。
## 环境依赖
- docker
- docker buildx
- go (1.23+)
## 用法
### 用go编码运行
```sh
go run main.go
```
### 无go环境使用
```sh
./main
```
## 问题
如果`images.yaml`清单中的镜像tag过多的话有可能会遇到429报错
```text
429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
```

5
go.mod Normal file
View File

@ -0,0 +1,5 @@
module wandoubaba/dockerporter
go 1.23.2
require gopkg.in/yaml.v2 v2.4.0 // indirect

3
go.sum Normal file
View File

@ -0,0 +1,3 @@
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

958
images.yaml Normal file
View File

@ -0,0 +1,958 @@
target: "quay.io/wandoubaba517"
images:
- name: "openresty"
from: "openresty/openresty"
tags:
- tag: "1.25.3.2-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.25.3.2-bookworm"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "golang"
from: "golang"
tags:
- tag: "1.23.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.23"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.22.8"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.22"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "python"
from: "python"
tags:
- tag: "3.13.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12.7"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.11.10"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.11"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.10.15"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.10"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.9.20"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.9"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.7.18"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.7"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "nacos-server"
from: "nacos/nacos-server"
tags:
- tag: "v2.4.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "v2.3.2"
platforms:
- "linux/amd64"
- tag: "v1.4.7"
platforms:
- "linux/amd64"
- name: "zookeeper"
from: "zookeeper"
tags:
- tag: "3.9.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.9"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.8.4"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.8"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.7.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.7"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "elasticsearch"
from: "docker.elastic.co/elasticsearch/elasticsearch"
tags:
- tag: "7.17.18"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.14.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "kibana"
from: "docker.elastic.co/kibana/kibana"
tags:
- tag: "7.17.18"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.14.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "gitea"
from: "gitea/gitea"
tags:
- tag: "1.22.3"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.22"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "grafana"
from: "grafana/grafana"
tags:
- tag: "11.2.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "11.1.7"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "11.0.6"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "10.4.10"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "9.5.21"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "memcached"
tags:
- tag: "latest"
platforms:
- "linux/amd64"
- "linux/arm64"
- "linux/mips64le"
- tag: "1.6.31"
platforms:
- "linux/amd64"
- "linux/arm64"
- "linux/mips64le"
- tag: "1.6"
platforms:
- "linux/amd64"
- "linux/arm64"
- "linux/mips64le"
- tag: "1"
platforms:
- "linux/amd64"
- "linux/arm64"
- "linux/mips64le"
- name: "mongo"
tags:
- tag: "8.0.1"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.0.14"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6.0.18"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "mysql"
tags:
- tag: "9.0.1"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "9.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "9"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.4.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.4"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0.39"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "5.7.37"
platforms:
- "linux/amd64"
- tag: "5.7"
platforms:
- "linux/amd64"
- tag: "5.6.51"
platforms:
- "linux/amd64"
- tag: "5.6"
platforms:
- "linux/amd64"
- name: "pgadmin4"
from: "dpage/pgadmin4"
tags:
- tag: "8.12"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.11"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.10"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.9"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "portainer-ce"
from: "portainer/portainer-ce"
tags:
- tag: "latest"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.21.3-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.21.3"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "rabbitmq"
tags:
- tag: "4.0.2-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4.0.2-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4.0-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4.0-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13.7-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13.7-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12.14-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12.14-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3-management-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3-management"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4.0.2-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4.0.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4.0-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "4"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13.7-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13.7"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.13"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12.14-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12.14"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3.12"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "3"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "redis"
tags:
- tag: "7.4.1-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.2.6-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.2-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6.2.16-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6.2-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "5.0.5-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "5.0-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "5-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4.1"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.2.6"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6.2.16"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "6"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "5.0.5"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "5.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "5"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "postgres"
tags:
- tag: "14.13"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "14"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "15.8"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "15"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16.4"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "17.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "17"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "php"
tags:
- tag: "8.3.12-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.3-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2.24-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1.30-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0.30-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4.33-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4-fpm-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.3.12-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.3-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2.24-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1.30-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0.30-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4.33-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4-cli-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.3.12-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.3-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2.24-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1.30-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0.30-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4.33-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4-fpm"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.3.12-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.3-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2.24-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.2-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1.30-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.1-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0.30-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "8.0-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4.33-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "7.4-cli"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "composer"
tags:
- tag: "latest"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.8.1"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.8"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.7.9"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.7"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.2.24"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "2.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.10.27"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.10"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "nginx"
tags:
- tag: "latest"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.27.2-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.27-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.26.2-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.26-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.24.0-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.24-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.27.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.27"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.26.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.26"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.24.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "1.24"
platforms:
- "linux/amd64"
- "linux/arm64"
- name: "node"
tags:
- tag: "22.9.0-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "22.9-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "22-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "22.9.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "22.9"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "22"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "20.18.0-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "20.18-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "20-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "20.18.0"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "20.18"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "20"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "18.20.4-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "18.20-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "18-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "18.20.4"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "18.20"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "18"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16.20.2-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16.20-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16-alpine"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16.20.2"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16.20"
platforms:
- "linux/amd64"
- "linux/arm64"
- tag: "16"
platforms:
- "linux/amd64"
- "linux/arm64"

BIN
main Executable file

Binary file not shown.

151
main.go Normal file
View File

@ -0,0 +1,151 @@
package main
import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
"gopkg.in/yaml.v2"
)
type Tag struct {
Tag string `yaml:"tag"`
Platforms []string `yaml:"platforms"`
}
type Image struct {
Name string `yaml:"name"`
From string `yaml:"from,omitempty"` // `from` 为可选字段
Tags []Tag `yaml:"tags"`
}
type Config struct {
Target string `yaml:"target"`
Images []Image `yaml:"images"`
}
func main() {
// 记录开始时间
startTime := time.Now()
// 创建日志文件名
logFileName := fmt.Sprintf("build_%s.log", startTime.Format("20060102"))
logFile, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
logErrorInfo(logFile, time.Now(),
fmt.Sprintf("Error opening log file: %v", err))
return
}
defer logFile.Close()
// 记录程序启动时间
logStartTime(logFile, startTime)
// 读取 YAML 文件
data, err := ioutil.ReadFile("images.yaml")
if err != nil {
logErrorInfo(logFile, time.Now(),
fmt.Sprintf("Error reading YAML file: %v", err))
return
}
// 解析 YAML 文件
var config Config
if err := yaml.Unmarshal(data, &config); err != nil {
logErrorInfo(logFile, time.Now(),
fmt.Sprintf("Error parsing YAML: %v", err))
return
}
totalImages := 0
totalTags := 0
// 遍历每个镜像信息
for _, image := range config.Images {
// 如果 `from` 字段为空,则将其设置为 `name`Docker Hub 官方镜像)
if image.From == "" {
image.From = image.Name
}
imageBuilt := false // 记录是否构建过该镜像
for _, tag := range image.Tags {
totalTags++
// 根据镜像生成 Dockerfile
dockerfilePath := filepath.Join(".", fmt.Sprintf("Dockerfile.%s:%s", image.Name, tag.Tag))
if err := generateDockerfile(image.From, tag.Tag, dockerfilePath); err != nil {
logErrorInfo(logFile, time.Now(),
fmt.Sprintf("Error generating Dockerfile for %s:%s: %v", image.Name, tag.Tag, err))
continue
}
// 合并所有平台为一个字符串
platforms := strings.Join(tag.Platforms, ",")
// 构建 Docker 镜像命令,添加 target
buildCmd := exec.Command("docker", "buildx", "build", "--push", "--platform", platforms, "-t", fmt.Sprintf("%s/%s:%s", config.Target, image.Name, tag.Tag), "-f", dockerfilePath, ".")
buildCmd.Stdout = os.Stdout
buildCmd.Stderr = os.Stderr
// 记录开始构建时间
buildStartTime := time.Now()
if err := buildCmd.Run(); err != nil {
logErrorInfo(logFile, time.Now(),
fmt.Sprintf("Error building image %s:%s for platforms %s: %v", image.Name, tag.Tag, platforms, err))
continue
}
// 记录构建结束时间
buildEndTime := time.Now()
// 记录构建日志
logBuildInfo(logFile, buildStartTime, image.Name, tag.Tag, platforms, config.Target, buildEndTime.Sub(buildStartTime))
imageBuilt = true // 标记该镜像已成功构建
// 删除生成的 Dockerfile
if err := os.Remove(dockerfilePath); err != nil {
logErrorInfo(logFile, time.Now(),
fmt.Sprintf("Error deleting Dockerfile %s: %v", dockerfilePath, err))
}
}
if imageBuilt {
totalImages++ // 仅在成功构建过一次时增加镜像计数
}
}
// 计算总时间
elapsedTime := time.Since(startTime)
logCompletion(logFile, elapsedTime, totalImages, totalTags)
}
// 记录程序启动时间
func logStartTime(logFile *os.File, startTime time.Time) {
logFile.WriteString(fmt.Sprintf("Process started at: %s\n", startTime.Format(time.RFC3339)))
}
// 记录构建信息
func logBuildInfo(logFile *os.File, startTime time.Time, imageName, tag string, platforms string, target string, duration time.Duration) {
logFile.WriteString(fmt.Sprintf("%s | Image: %s | Tag: %s | Platforms: %s | Pushed to: %s/%s:%s | Duration: %v\n",
startTime.Format(time.RFC3339), imageName, tag, platforms, target, imageName, tag, duration))
}
// 记录报错
func logErrorInfo(logFile *os.File, startTime time.Time, errorMessage string) {
logFile.WriteString(fmt.Sprintf("%s | %s\n",
startTime.Format(time.RFC3339), errorMessage))
}
// 记录完成时间和统计信息
func logCompletion(logFile *os.File, elapsedTime time.Duration, totalImages, totalTags int) {
logFile.WriteString(fmt.Sprintf("Build completed at: %s\n", time.Now().Format(time.RFC3339)))
logFile.WriteString(fmt.Sprintf("Total images built: %d\n", totalImages))
logFile.WriteString(fmt.Sprintf("Total tags processed: %d\n", totalTags))
logFile.WriteString(fmt.Sprintf("Total execution time: %v\n", elapsedTime))
}
// 生成 Dockerfile
func generateDockerfile(fromImage, tag, filePath string) error {
dockerfileContent := fmt.Sprintf("FROM %s:%s\n", fromImage, tag)
return ioutil.WriteFile(filePath, []byte(dockerfileContent), 0644)
}