github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/driver/docker-container/factory.go (about)

     1  package docker
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"github.com/docker/buildx/driver"
    10  	dockeropts "github.com/docker/cli/opts"
    11  	dockerclient "github.com/docker/docker/client"
    12  	"github.com/pkg/errors"
    13  )
    14  
    15  const prioritySupported = 30
    16  const priorityUnsupported = 70
    17  const defaultRestartPolicy = "unless-stopped"
    18  
    19  func init() {
    20  	driver.Register(&factory{})
    21  }
    22  
    23  type factory struct {
    24  }
    25  
    26  func (*factory) Name() string {
    27  	return "docker-container"
    28  }
    29  
    30  func (*factory) Usage() string {
    31  	return "docker-container"
    32  }
    33  
    34  func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient, dialMeta map[string][]string) int {
    35  	if api == nil {
    36  		return priorityUnsupported
    37  	}
    38  	return prioritySupported
    39  }
    40  
    41  func (f *factory) New(ctx context.Context, cfg driver.InitConfig) (driver.Driver, error) {
    42  	if cfg.DockerAPI == nil {
    43  		return nil, errors.Errorf("%s driver requires docker API access", f.Name())
    44  	}
    45  	rp, err := dockeropts.ParseRestartPolicy(defaultRestartPolicy)
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  	d := &Driver{
    50  		factory:       f,
    51  		InitConfig:    cfg,
    52  		restartPolicy: rp,
    53  	}
    54  	for k, v := range cfg.DriverOpts {
    55  		switch {
    56  		case k == "network":
    57  			d.netMode = v
    58  		case k == "image":
    59  			d.image = v
    60  		case k == "memory":
    61  			if err := d.memory.Set(v); err != nil {
    62  				return nil, err
    63  			}
    64  		case k == "memory-swap":
    65  			if err := d.memorySwap.Set(v); err != nil {
    66  				return nil, err
    67  			}
    68  		case k == "cpu-period":
    69  			vv, err := strconv.ParseInt(v, 10, 0)
    70  			if err != nil {
    71  				return nil, err
    72  			}
    73  			d.cpuPeriod = vv
    74  		case k == "cpu-quota":
    75  			vv, err := strconv.ParseInt(v, 10, 0)
    76  			if err != nil {
    77  				return nil, err
    78  			}
    79  			d.cpuQuota = vv
    80  		case k == "cpu-shares":
    81  			vv, err := strconv.ParseInt(v, 10, 0)
    82  			if err != nil {
    83  				return nil, err
    84  			}
    85  			d.cpuShares = vv
    86  		case k == "cpuset-cpus":
    87  			d.cpusetCpus = v
    88  		case k == "cpuset-mems":
    89  			d.cpusetMems = v
    90  		case k == "cgroup-parent":
    91  			d.cgroupParent = v
    92  		case k == "restart-policy":
    93  			d.restartPolicy, err = dockeropts.ParseRestartPolicy(v)
    94  			if err != nil {
    95  				return nil, err
    96  			}
    97  		case k == "default-load":
    98  			d.defaultLoad, err = strconv.ParseBool(v)
    99  			if err != nil {
   100  				return nil, err
   101  			}
   102  		case strings.HasPrefix(k, "env."):
   103  			envName := strings.TrimPrefix(k, "env.")
   104  			if envName == "" {
   105  				return nil, errors.Errorf("invalid env option %q, expecting env.FOO=bar", k)
   106  			}
   107  			d.env = append(d.env, fmt.Sprintf("%s=%s", envName, v))
   108  		default:
   109  			return nil, errors.Errorf("invalid driver option %s for docker-container driver", k)
   110  		}
   111  	}
   112  
   113  	return d, nil
   114  }
   115  
   116  func (f *factory) AllowsInstances() bool {
   117  	return true
   118  }