2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 10:17:17 +08:00

feat: 使用docker v29版本客户端

This commit is contained in:
2025-11-14 03:53:01 +08:00
parent 4c4c8647cd
commit c74a6208a1
7 changed files with 341 additions and 131 deletions

View File

@@ -2,16 +2,17 @@ package data
import (
"context"
"fmt"
"encoding/base64"
"encoding/json"
"slices"
"strings"
"time"
"github.com/moby/moby/api/types/registry"
"github.com/moby/moby/client"
"github.com/acepanel/panel/internal/biz"
"github.com/acepanel/panel/internal/http/request"
"github.com/acepanel/panel/pkg/shell"
"github.com/acepanel/panel/pkg/tools"
"github.com/acepanel/panel/pkg/types"
)
@@ -59,33 +60,58 @@ func (r *containerImageRepo) List() ([]types.ContainerImage, error) {
// Pull 拉取镜像
func (r *containerImageRepo) Pull(req *request.ContainerImagePull) error {
var sb strings.Builder
if req.Auth {
sb.WriteString(fmt.Sprintf("docker login -u %s -p %s", req.Username, req.Password))
if _, err := shell.Exec(sb.String()); err != nil {
return fmt.Errorf("login failed: %w", err)
}
sb.Reset()
}
sb.WriteString(fmt.Sprintf("docker pull %s", req.Name))
if _, err := shell.Exec(sb.String()); err != nil {
apiClient, err := getDockerClient("/var/run/docker.sock")
if err != nil {
return err
}
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
return nil
options := client.ImagePullOptions{}
if req.Auth {
authConfig := registry.AuthConfig{
Username: req.Username,
Password: req.Password,
}
encodedJSON, err := json.Marshal(authConfig)
if err != nil {
return err
}
authStr := base64.URLEncoding.EncodeToString(encodedJSON)
options.RegistryAuth = authStr
}
out, err := apiClient.ImagePull(context.Background(), req.Name, options)
if err != nil {
return err
}
defer out.Close()
return out.Wait(context.Background())
}
// Remove 删除镜像
func (r *containerImageRepo) Remove(id string) error {
_, err := shell.ExecfWithTimeout(2*time.Minute, "docker rmi %s", id)
apiClient, err := getDockerClient("/var/run/docker.sock")
if err != nil {
return err
}
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
_, err = apiClient.ImageRemove(context.Background(), id, client.ImageRemoveOptions{
Force: true,
PruneChildren: true,
})
return err
}
// Prune 清理未使用的镜像
func (r *containerImageRepo) Prune() error {
_, err := shell.ExecfWithTimeout(2*time.Minute, "docker image prune -f")
apiClient, err := getDockerClient("/var/run/docker.sock")
if err != nil {
return err
}
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
_, err = apiClient.ImagePrune(context.Background(), client.ImagePruneOptions{})
return err
}