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 }