修复架构特殊符号的问题

This commit is contained in:
NewName
2025-05-17 13:02:27 +08:00
parent 4104120c4b
commit 3a669a2db8
2 changed files with 104 additions and 40 deletions

View File

@@ -2,6 +2,7 @@ package main
import (
"archive/zip"
"bufio"
"crypto/rand"
"encoding/hex"
"encoding/json"
@@ -326,8 +327,20 @@ func downloadImage(task *DownloadTask, index int, imgTask *ImageTask, platform s
if strings.Contains(platform, "--") {
platformArg = platform
} else {
// 仅指定架构名称的情况
platformArg = fmt.Sprintf("--override-os linux --override-arch %s", platform)
// 处理特殊架构格式,如 arm/v7
if strings.Contains(platform, "/") {
parts := strings.Split(platform, "/")
if len(parts) == 2 {
// 适用于arm/v7这样的格式
platformArg = fmt.Sprintf("--override-os linux --override-arch %s --override-variant %s", parts[0], parts[1])
} else {
// 对于其他带/的格式,直接按原格式处理
platformArg = fmt.Sprintf("--override-os linux --override-arch %s", platform)
}
} else {
// 仅指定架构名称的情况
platformArg = fmt.Sprintf("--override-os linux --override-arch %s", platform)
}
}
}
@@ -335,6 +348,8 @@ func downloadImage(task *DownloadTask, index int, imgTask *ImageTask, platform s
cmd := fmt.Sprintf("skopeo copy %s docker://%s docker-archive:%s",
platformArg, imgTask.Image, outputPath)
fmt.Printf("执行命令: %s\n", cmd)
// 执行命令
command := exec.Command("sh", "-c", cmd)
@@ -347,6 +362,14 @@ func downloadImage(task *DownloadTask, index int, imgTask *ImageTask, platform s
return
}
stdout, err := command.StdoutPipe()
if err != nil {
imgTask.Status = string(StatusFailed)
imgTask.Error = fmt.Sprintf("无法创建标准输出管道: %v", err)
sendImageUpdate(task, index)
return
}
if err := command.Start(); err != nil {
imgTask.Status = string(StatusFailed)
imgTask.Error = fmt.Sprintf("启动命令失败: %v", err)
@@ -354,42 +377,89 @@ func downloadImage(task *DownloadTask, index int, imgTask *ImageTask, platform s
return
}
// 模拟逐步进度增加,确保用户体验更好
go func() {
// 每500ms检查一次进度如果进度没有变化则稍微增加一点
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
lastProgress := 0.0
stagnantCount := 0
for {
select {
case <-ticker.C:
// 检查命令是否还在运行
if command.ProcessState != nil && command.ProcessState.Exited() {
return
}
// 如果进度停滞,小幅增加进度,提高用户体验
task.Lock.Lock()
currentProgress := imgTask.Progress
if currentProgress == lastProgress {
stagnantCount++
if stagnantCount > 5 && currentProgress < 90 { // 连续5次无变化且未接近完成
// 缓慢增加进度但不超过95%
newProgress := currentProgress + 0.5
if newProgress > 95 {
newProgress = 95
}
imgTask.Progress = newProgress
updateTaskProgress(task)
sendImageUpdate(task, index)
}
} else {
stagnantCount = 0
lastProgress = currentProgress
}
task.Lock.Unlock()
}
}
}()
// 读取stderr以获取进度信息
go func() {
buf := make([]byte, 1024)
for {
n, err := stderr.Read(buf)
if n > 0 {
output := string(buf[:n])
// 解析进度信息 (这里简化处理假设skopeo输出进度信息)
// 实际需要根据skopeo的真实输出格式进行解析
if strings.Contains(output, "%") {
// 简单解析,实际使用时可能需要更复杂的解析逻辑
parts := strings.Split(output, "%")
if len(parts) > 0 {
numStr := strings.TrimSpace(parts[0])
numStr = strings.TrimLeft(numStr, "Copying blob ")
numStr = strings.TrimLeft(numStr, "Copying config ")
numStr = strings.TrimRight(numStr, " / ")
numStr = strings.TrimSpace(numStr)
// 尝试提取最后一个数字作为进度
fields := strings.Fields(numStr)
if len(fields) > 0 {
lastField := fields[len(fields)-1]
progress := 0.0
fmt.Sscanf(lastField, "%f", &progress)
if progress > 0 && progress <= 100 {
imgTask.Progress = progress
updateTaskProgress(task)
sendImageUpdate(task, index)
}
scanner := bufio.NewScanner(stderr)
for scanner.Scan() {
output := scanner.Text()
fmt.Printf("镜像 %s 进度输出: %s\n", imgTask.Image, output)
// 解析进度信息
if strings.Contains(output, "%") {
parts := strings.Split(output, "%")
if len(parts) > 0 {
numStr := strings.TrimSpace(parts[0])
numStr = strings.TrimLeft(numStr, "Copying blob ")
numStr = strings.TrimLeft(numStr, "Copying config ")
numStr = strings.TrimRight(numStr, " / ")
numStr = strings.TrimSpace(numStr)
// 尝试提取最后一个数字作为进度
fields := strings.Fields(numStr)
if len(fields) > 0 {
lastField := fields[len(fields)-1]
progress := 0.0
fmt.Sscanf(lastField, "%f", &progress)
if progress > 0 && progress <= 100 {
task.Lock.Lock()
imgTask.Progress = progress
task.Lock.Unlock()
updateTaskProgress(task)
sendImageUpdate(task, index)
}
}
}
}
if err != nil {
break
}
}
}()
// 读取stdout
go func() {
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
output := scanner.Text()
fmt.Printf("镜像 %s 标准输出: %s\n", imgTask.Image, output)
}
}()
@@ -409,8 +479,10 @@ func downloadImage(task *DownloadTask, index int, imgTask *ImageTask, platform s
}
// 更新状态为已完成
task.Lock.Lock()
imgTask.Status = string(StatusCompleted)
imgTask.Progress = 100
task.Lock.Unlock()
updateTaskProgress(task)
sendImageUpdate(task, index)
}