mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 07:57:21 +08:00
feat: 使用docker v29版本客户端
This commit is contained in:
@@ -3,15 +3,15 @@ package data
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/netip"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/moby/moby/api/types/network"
|
||||
"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/types"
|
||||
)
|
||||
|
||||
@@ -74,43 +74,93 @@ func (r *containerNetworkRepo) List() ([]types.ContainerNetwork, error) {
|
||||
|
||||
// Create 创建网络
|
||||
func (r *containerNetworkRepo) Create(req *request.ContainerNetworkCreate) (string, error) {
|
||||
var sb strings.Builder
|
||||
|
||||
sb.WriteString(fmt.Sprintf("docker network create --driver %s", req.Driver))
|
||||
sb.WriteString(fmt.Sprintf(" %s", req.Name))
|
||||
apiClient, err := getDockerClient("/var/run/docker.sock")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
|
||||
|
||||
var ipamConfigs []network.IPAMConfig
|
||||
if req.Ipv4.Enabled {
|
||||
sb.WriteString(fmt.Sprintf(" --subnet %s", req.Ipv4.Subnet))
|
||||
sb.WriteString(fmt.Sprintf(" --gateway %s", req.Ipv4.Gateway))
|
||||
if req.Ipv4.IPRange != "" {
|
||||
sb.WriteString(fmt.Sprintf(" --ip-range %s", req.Ipv4.IPRange))
|
||||
v4Subnet, err := netip.ParsePrefix(req.Ipv4.Subnet)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("invalid ipv4 subnet: %w", err)
|
||||
}
|
||||
v4Gateway, err := netip.ParseAddr(req.Ipv4.Gateway)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("invalid ipv4 gateway: %w", err)
|
||||
}
|
||||
v4IPRange, err := netip.ParsePrefix(req.Ipv4.IPRange)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("invalid ipv4 ip range: %w", err)
|
||||
}
|
||||
ipamConfigs = append(ipamConfigs, network.IPAMConfig{
|
||||
Subnet: v4Subnet,
|
||||
Gateway: v4Gateway,
|
||||
IPRange: v4IPRange,
|
||||
})
|
||||
}
|
||||
if req.Ipv6.Enabled {
|
||||
sb.WriteString(fmt.Sprintf(" --subnet %s", req.Ipv6.Subnet))
|
||||
sb.WriteString(fmt.Sprintf(" --gateway %s", req.Ipv6.Gateway))
|
||||
if req.Ipv6.IPRange != "" {
|
||||
sb.WriteString(fmt.Sprintf(" --ip-range %s", req.Ipv6.IPRange))
|
||||
v6Subnet, err := netip.ParsePrefix(req.Ipv6.Subnet)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("invalid ipv6 subnet: %w", err)
|
||||
}
|
||||
}
|
||||
for _, label := range req.Labels {
|
||||
sb.WriteString(fmt.Sprintf(" --label %s=%s", label.Key, label.Value))
|
||||
}
|
||||
for _, option := range req.Options {
|
||||
sb.WriteString(fmt.Sprintf(" --opt %s=%s", option.Key, option.Value))
|
||||
v6Gateway, err := netip.ParseAddr(req.Ipv6.Gateway)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("invalid ipv6 gateway: %w", err)
|
||||
}
|
||||
v6IPRange, err := netip.ParsePrefix(req.Ipv6.IPRange)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("invalid ipv6 ip range: %w", err)
|
||||
}
|
||||
ipamConfigs = append(ipamConfigs, network.IPAMConfig{
|
||||
Subnet: v6Subnet,
|
||||
Gateway: v6Gateway,
|
||||
IPRange: v6IPRange,
|
||||
})
|
||||
}
|
||||
|
||||
return shell.Exec(sb.String())
|
||||
options := client.NetworkCreateOptions{
|
||||
EnableIPv4: &req.Ipv4.Enabled,
|
||||
EnableIPv6: &req.Ipv6.Enabled,
|
||||
Driver: req.Driver,
|
||||
Options: types.KVToMap(req.Options),
|
||||
Labels: types.KVToMap(req.Labels),
|
||||
}
|
||||
if len(ipamConfigs) > 0 {
|
||||
options.IPAM = &network.IPAM{
|
||||
Config: ipamConfigs,
|
||||
}
|
||||
}
|
||||
|
||||
resp, err := apiClient.NetworkCreate(context.Background(), req.Name, options)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.ID, err
|
||||
}
|
||||
|
||||
// Remove 删除网络
|
||||
func (r *containerNetworkRepo) Remove(id string) error {
|
||||
_, err := shell.ExecfWithTimeout(2*time.Minute, "docker network rm -f %s", id)
|
||||
apiClient, err := getDockerClient("/var/run/docker.sock")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
|
||||
|
||||
_, err = apiClient.NetworkRemove(context.Background(), id, client.NetworkRemoveOptions{})
|
||||
return err
|
||||
}
|
||||
|
||||
// Prune 清理未使用的网络
|
||||
func (r *containerNetworkRepo) Prune() error {
|
||||
_, err := shell.ExecfWithTimeout(2*time.Minute, "docker network prune -f")
|
||||
apiClient, err := getDockerClient("/var/run/docker.sock")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
|
||||
|
||||
_, err = apiClient.NetworkPrune(context.Background(), client.NetworkPruneOptions{})
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user