package docker import ( "context" "fmt" "github.com/moby/moby/api/types/network" "github.com/moby/moby/client" ) // EnsureNetwork creates a Docker network with the given name if it does not // already exist. It returns the network ID in all cases. func (c *Client) EnsureNetwork(ctx context.Context, networkName string) (string, error) { // Check if the network already exists. filterArgs := make(client.Filters).Add("name", networkName) listResult, err := c.api.NetworkList(ctx, client.NetworkListOptions{ Filters: filterArgs, }) if err != nil { return "", fmt.Errorf("list networks for %s: %w", networkName, err) } // NetworkList with a name filter may return partial matches, so check exact name. for _, n := range listResult.Items { if n.Name == networkName { return n.ID, nil } } // Create the network. resp, err := c.api.NetworkCreate(ctx, networkName, client.NetworkCreateOptions{ Driver: "bridge", Labels: map[string]string{ LabelProject: "docker-watcher", }, }) if err != nil { return "", fmt.Errorf("create network %s: %w", networkName, err) } return resp.ID, nil } // ConnectNetwork attaches a container to an existing network. func (c *Client) ConnectNetwork(ctx context.Context, networkID string, containerID string) error { _, err := c.api.NetworkConnect(ctx, networkID, client.NetworkConnectOptions{ Container: containerID, EndpointConfig: &network.EndpointSettings{}, }) if err != nil { return fmt.Errorf("connect container %s to network %s: %w", containerID, networkID, err) } return nil }