github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/tests/workers/docker.go (about)

     1  package workers
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"os/exec"
     7  
     8  	"github.com/moby/buildkit/identity"
     9  	"github.com/moby/buildkit/util/testutil/integration"
    10  	bkworkers "github.com/moby/buildkit/util/testutil/workers"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  func InitDockerWorker() {
    15  	integration.Register(&dockerWorker{
    16  		id: "docker",
    17  	})
    18  	integration.Register(&dockerWorker{
    19  		id:                    "docker+containerd",
    20  		containerdSnapshotter: true,
    21  	})
    22  }
    23  
    24  type dockerWorker struct {
    25  	id                    string
    26  	containerdSnapshotter bool
    27  	unsupported           []string
    28  }
    29  
    30  func (c dockerWorker) Name() string {
    31  	return c.id
    32  }
    33  
    34  func (c dockerWorker) Rootless() bool {
    35  	return false
    36  }
    37  
    38  func (c *dockerWorker) NetNSDetached() bool {
    39  	return false
    40  }
    41  
    42  func (c dockerWorker) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) {
    43  	moby := bkworkers.Moby{
    44  		ID:                    c.id,
    45  		ContainerdSnapshotter: c.containerdSnapshotter,
    46  	}
    47  	bk, bkclose, err := moby.New(ctx, cfg)
    48  	if err != nil {
    49  		return bk, cl, err
    50  	}
    51  
    52  	name := "integration-" + identity.NewID()
    53  	cmd := exec.Command("docker", "context", "create",
    54  		name,
    55  		"--docker", "host="+bk.DockerAddress(),
    56  	)
    57  	cmd.Env = append(os.Environ(), "BUILDX_CONFIG=/tmp/buildx-"+name)
    58  	if err := cmd.Run(); err != nil {
    59  		return bk, cl, errors.Wrapf(err, "failed to create buildx instance %s", name)
    60  	}
    61  
    62  	cl = func() error {
    63  		err := bkclose()
    64  		cmd := exec.Command("docker", "context", "rm", "-f", name)
    65  		if err1 := cmd.Run(); err == nil {
    66  			err = errors.Wrapf(err1, "failed to remove buildx instance %s", name)
    67  		}
    68  		return err
    69  	}
    70  
    71  	return &backend{
    72  		builder:             name,
    73  		context:             name,
    74  		unsupportedFeatures: c.unsupported,
    75  	}, cl, nil
    76  }
    77  
    78  func (c dockerWorker) Close() error {
    79  	return nil
    80  }