44 "context"
55 "os"
66 "os/exec"
7+ "sync"
78
89 "github.com/moby/buildkit/identity"
910 "github.com/moby/buildkit/util/testutil/integration"
@@ -18,6 +19,11 @@ func InitDockerContainerWorker() {
1819
1920type containerWorker struct {
2021 id string
22+
23+ docker integration.Backend
24+ dockerClose func () error
25+ dockerErr error
26+ dockerOnce sync.Once
2127}
2228
2329func (w * containerWorker ) Name () string {
@@ -29,9 +35,11 @@ func (w *containerWorker) Rootless() bool {
2935}
3036
3137func (w * containerWorker ) New (ctx context.Context , cfg * integration.BackendConfig ) (integration.Backend , func () error , error ) {
32- bk , bkclose , err := dockerWorker {id : w .id }.New (ctx , cfg )
33- if err != nil {
34- return bk , bkclose , err
38+ w .dockerOnce .Do (func () {
39+ w .docker , w .dockerClose , w .dockerErr = dockerWorker {id : w .id }.New (ctx , cfg )
40+ })
41+ if w .dockerErr != nil {
42+ return w .docker , w .dockerClose , w .dockerErr
3543 }
3644
3745 name := "integration-container-" + identity .NewID ()
@@ -42,29 +50,32 @@ func (w *containerWorker) New(ctx context.Context, cfg *integration.BackendConfi
4250 "--driver=docker-container" ,
4351 "--driver-opt=network=host" ,
4452 )
45- cmd .Env = append (os .Environ (), "DOCKER_CONTEXT=" + bk .DockerAddress ())
53+ cmd .Env = append (os .Environ (), "DOCKER_CONTEXT=" + w . docker .DockerAddress ())
4654 if err := cmd .Run (); err != nil {
4755 return nil , nil , errors .Wrapf (err , "failed to create buildx instance %s" , name )
4856 }
4957
5058 cl := func () error {
51- var err error
52- if err1 := bkclose (); err == nil {
53- err = err1
54- }
5559 cmd := exec .Command ("buildx" , "rm" , "-f" , name )
56- if err1 := cmd .Run (); err == nil {
57- err = err1
58- }
59- return err
60+ return cmd .Run ()
6061 }
6162
6263 return & backend {
63- context : bk .DockerAddress (),
64+ context : w . docker .DockerAddress (),
6465 builder : name ,
6566 }, cl , nil
6667}
6768
6869func (w * containerWorker ) Close () error {
70+ if close := w .dockerClose ; close != nil {
71+ return close ()
72+ }
73+
74+ // reset the worker to be ready to go again
75+ w .docker = nil
76+ w .dockerClose = nil
77+ w .dockerErr = nil
78+ w .dockerOnce = sync.Once {}
79+
6980 return nil
7081}
0 commit comments