github.com/defang-io/defang/src@v0.0.0-20240505002154-bdf411911834/pkg/docker/setup.go (about)

     1  package docker
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"io"
     7  	"os"
     8  
     9  	"github.com/docker/docker/api/types"
    10  
    11  	pkgtypes "github.com/defang-io/defang/src/pkg/types"
    12  )
    13  
    14  func (d *Docker) SetUp(ctx context.Context, containers []pkgtypes.Container) error {
    15  	if len(containers) != 1 {
    16  		return errors.New("only one container is supported with docker driver")
    17  	}
    18  	task := containers[0]
    19  	rc, err := d.ImagePull(ctx, task.Image, types.ImagePullOptions{Platform: task.Platform})
    20  	if err != nil {
    21  		return err
    22  	}
    23  	defer rc.Close()
    24  	_, err = io.Copy(contextAwareWriter{ctx, os.Stderr}, rc) // FIXME: this outputs JSON to stderr
    25  	d.image = task.Image
    26  	d.memory = task.Memory
    27  	d.platform = task.Platform
    28  	return err
    29  }
    30  
    31  type contextAwareWriter struct {
    32  	ctx context.Context
    33  	io.Writer
    34  }
    35  
    36  func (cw contextAwareWriter) Write(p []byte) (n int, err error) {
    37  	select {
    38  	case <-cw.ctx.Done(): // Detect context cancelation
    39  		return 0, cw.ctx.Err()
    40  	default:
    41  		return cw.Writer.Write(p)
    42  	}
    43  }