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 }