feat: not create network if already exist

This commit is contained in:
wencaiwulue
2023-03-21 23:45:22 +08:00
parent 2b41cfa11f
commit 2ccf5776a8
2 changed files with 93 additions and 70 deletions

View File

@@ -25,16 +25,18 @@ import (
func CmdDev(f cmdutil.Factory) *cobra.Command { func CmdDev(f cmdutil.Factory) *cobra.Command {
var devOptions = dev.Options{ var devOptions = dev.Options{
Factory: f, Factory: f,
Entrypoint: "", Entrypoint: "",
Publish: opts.NewListOpts(nil), Publish: opts.NewListOpts(nil),
Expose: opts.NewListOpts(nil), Expose: opts.NewListOpts(nil),
Env: opts.NewListOpts(nil), Env: opts.NewListOpts(nil),
Volumes: opts.NewListOpts(nil), Volumes: opts.NewListOpts(nil),
ExtraHosts: opts.NewListOpts(nil), ExtraHosts: opts.NewListOpts(nil),
Aliases: opts.NewListOpts(nil), Aliases: opts.NewListOpts(nil),
NoProxy: false, Links: opts.NewListOpts(nil),
ExtraCIDR: []string{}, LinkLocalIPs: opts.NewListOpts(nil),
NoProxy: false,
ExtraCIDR: []string{},
} }
var sshConf = &util.SshConfig{} var sshConf = &util.SshConfig{}
cmd := &cobra.Command{ cmd := &cobra.Command{
@@ -163,6 +165,8 @@ Startup your kubernetes workloads in local Docker container with same volume、e
cmd.Flags().Var(&devOptions.NetMode, "net", "Connect a container to a network, eg: [default|bridge|host|none|container:$CONTAINER_ID]") cmd.Flags().Var(&devOptions.NetMode, "net", "Connect a container to a network, eg: [default|bridge|host|none|container:$CONTAINER_ID]")
cmd.Flags().Var(&devOptions.NetMode, "network", "Connect a container to a network") cmd.Flags().Var(&devOptions.NetMode, "network", "Connect a container to a network")
cmd.Flags().MarkHidden("net") cmd.Flags().MarkHidden("net")
cmd.Flags().Var(&devOptions.Links, "link", "Add link to another container")
cmd.Flags().Var(&devOptions.LinkLocalIPs, "link-local-ip", "Container IPv4/IPv6 link-local addresses")
// We allow for both "--net-alias" and "--network-alias", although the latter is the recommended way. // We allow for both "--net-alias" and "--network-alias", although the latter is the recommended way.
cmd.Flags().Var(&devOptions.Aliases, "net-alias", "Add network-scoped alias for the container") cmd.Flags().Var(&devOptions.Aliases, "net-alias", "Add network-scoped alias for the container")
cmd.Flags().Var(&devOptions.Aliases, "network-alias", "Add network-scoped alias for the container") cmd.Flags().Var(&devOptions.Aliases, "network-alias", "Add network-scoped alias for the container")

View File

@@ -7,6 +7,7 @@ import (
"net" "net"
"os" "os"
"path/filepath" "path/filepath"
"reflect"
"sort" "sort"
"time" "time"
@@ -58,6 +59,8 @@ type Options struct {
ExtraHosts opts.ListOpts ExtraHosts opts.ListOpts
NetMode opts.NetworkOpt NetMode opts.NetworkOpt
Aliases opts.ListOpts Aliases opts.ListOpts
Links opts.ListOpts
LinkLocalIPs opts.ListOpts
Env opts.ListOpts Env opts.ListOpts
Mounts opts.MountOpt Mounts opts.MountOpt
Volumes opts.ListOpts Volumes opts.ListOpts
@@ -134,74 +137,46 @@ func (d Options) Main(ctx context.Context) error {
} }
mode := container.NetworkMode(d.NetMode.NetworkMode()) mode := container.NetworkMode(d.NetMode.NetworkMode())
if mode.IsBridge() || mode.IsHost() || mode.IsContainer() || mode.IsNone() { if mode.IsBridge() || mode.IsHost() || mode.IsContainer() || mode.IsNone() {
for _, config := range list[:] { for _, runConfig := range list[:] {
// remove expose port // remove expose port
config.config.ExposedPorts = nil runConfig.config.ExposedPorts = nil
config.hostConfig.NetworkMode = mode runConfig.hostConfig.NetworkMode = mode
if mode.IsContainer() { if mode.IsContainer() {
config.hostConfig.PidMode = containertypes.PidMode(d.NetMode.NetworkMode()) runConfig.hostConfig.PidMode = containertypes.PidMode(d.NetMode.NetworkMode())
} }
config.hostConfig.PortBindings = nil runConfig.hostConfig.PortBindings = nil
// remove dns // remove dns
config.hostConfig.DNS = nil runConfig.hostConfig.DNS = nil
config.hostConfig.DNSOptions = nil runConfig.hostConfig.DNSOptions = nil
config.hostConfig.DNSSearch = nil runConfig.hostConfig.DNSSearch = nil
config.hostConfig.PublishAllPorts = false runConfig.hostConfig.PublishAllPorts = false
config.config.Hostname = "" runConfig.config.Hostname = ""
} }
} else { } else {
getInterface, err := tun.GetInterface() var networkID string
networkID, err = createNetwork(ctx, cli, list[0].containerName)
if err != nil { if err != nil {
return err return err
} }
addrs, err := getInterface.Addrs()
if err != nil {
return err
}
cidr, _, err := net.ParseCIDR(addrs[0].String())
if err != nil {
return err
}
create, err := cli.NetworkCreate(ctx, list[0].containerName, types.NetworkCreate{
Driver: "bridge",
Scope: "local",
IPAM: &network.IPAM{
Driver: "",
Options: nil,
Config: []network.IPAMConfig{
{
Subnet: config.CIDR.String(),
Gateway: cidr.String(),
},
},
},
Internal: true,
})
if err != nil {
if errdefs.IsForbidden(err) {
_, _ = cli.NetworkList(ctx, types.NetworkListOptions{})
}
return err
}
list[0].networkingConfig.EndpointsConfig[list[0].containerName] = &network.EndpointSettings{ list[0].networkingConfig.EndpointsConfig[list[0].containerName] = &network.EndpointSettings{
NetworkID: create.ID, NetworkID: networkID,
} }
// skip first // skip first
for _, config := range list[1:] { for _, runConfig := range list[1:] {
// remove expose port // remove expose port
config.config.ExposedPorts = nil runConfig.config.ExposedPorts = nil
config.hostConfig.NetworkMode = containertypes.NetworkMode("container:" + list[0].containerName) runConfig.hostConfig.NetworkMode = containertypes.NetworkMode("container:" + list[0].containerName)
config.hostConfig.PidMode = containertypes.PidMode("container:" + list[0].containerName) runConfig.hostConfig.PidMode = containertypes.PidMode("container:" + list[0].containerName)
config.hostConfig.PortBindings = nil runConfig.hostConfig.PortBindings = nil
// remove dns // remove dns
config.hostConfig.DNS = nil runConfig.hostConfig.DNS = nil
config.hostConfig.DNSOptions = nil runConfig.hostConfig.DNSOptions = nil
config.hostConfig.DNSSearch = nil runConfig.hostConfig.DNSSearch = nil
config.hostConfig.PublishAllPorts = false runConfig.hostConfig.PublishAllPorts = false
config.config.Hostname = "" runConfig.config.Hostname = ""
} }
} }
@@ -215,6 +190,50 @@ func (d Options) Main(ctx context.Context) error {
return terminal(list[0].containerName, dockerCli) return terminal(list[0].containerName, dockerCli)
} }
func createNetwork(ctx context.Context, cli *client.Client, networkName string) (string, error) {
getInterface, err := tun.GetInterface()
if err != nil {
return "", err
}
addrs, err := getInterface.Addrs()
if err != nil {
return "", err
}
cidr, _, err := net.ParseCIDR(addrs[0].String())
if err != nil {
return "", err
}
by := map[string]string{"created_by": config.ConfigMapPodTrafficManager}
create, err := cli.NetworkCreate(ctx, networkName, types.NetworkCreate{
Driver: "bridge",
Scope: "local",
IPAM: &network.IPAM{
Driver: "",
Options: nil,
Config: []network.IPAMConfig{
{
Subnet: config.CIDR.String(),
Gateway: cidr.String(),
},
},
},
Internal: true,
Labels: by,
})
if err != nil {
if errdefs.IsForbidden(err) {
list, _ := cli.NetworkList(ctx, types.NetworkListOptions{})
for _, resource := range list {
if reflect.DeepEqual(resource.Labels, by) {
return resource.ID, nil
}
}
}
return "", err
}
return create.ID, nil
}
type Run []*RunConfig type Run []*RunConfig
func (r Run) Remove(ctx context.Context) error { func (r Run) Remove(ctx context.Context) error {
@@ -223,22 +242,22 @@ func (r Run) Remove(ctx context.Context) error {
return err return err
} }
for _, config := range r { for _, runConfig := range r {
err = cli.NetworkDisconnect(ctx, config.containerName, config.containerName, true) err = cli.NetworkDisconnect(ctx, runConfig.containerName, runConfig.containerName, true)
if err != nil { if err != nil {
log.Errorln(err) log.Debug(err)
} }
err = cli.ContainerRemove(ctx, config.containerName, types.ContainerRemoveOptions{Force: true}) err = cli.ContainerRemove(ctx, runConfig.containerName, types.ContainerRemoveOptions{Force: true})
if err != nil { if err != nil {
log.Errorln(err) log.Debug(err)
} }
} }
for _, config := range r { for _, runConfig := range r {
_, err = cli.NetworkInspect(ctx, config.containerName, types.NetworkInspectOptions{}) _, err = cli.NetworkInspect(ctx, runConfig.containerName, types.NetworkInspectOptions{})
if err == nil { if err == nil {
err = cli.NetworkRemove(ctx, config.containerName) err = cli.NetworkRemove(ctx, runConfig.containerName)
if err != nil { if err != nil {
log.Errorln(err) log.Debug(err)
} }
} }
} }