@@ -27,7 +27,7 @@ import (
27
27
"runtime"
28
28
29
29
"github.com/containerd/nerdctl/pkg/rootlessutil"
30
-
30
+ "github.com/hashicorp/go-multierror"
31
31
"github.com/sirupsen/logrus"
32
32
)
33
33
@@ -65,15 +65,19 @@ func GetBuildkitHost(namespace string) (string, error) {
65
65
hostRel = append (hostRel , fmt .Sprintf ("buildkit-%s/buildkitd.sock" , namespace ))
66
66
}
67
67
hostRel = append (hostRel , "buildkit-default/buildkitd.sock" , "buildkit/buildkitd.sock" )
68
+ var allErr error
68
69
for _ , p := range hostRel {
70
+ logrus .Debugf ("Choosing the buildkit host %q, candidates=%v (in %q)" , p , hostRel , run )
69
71
buildkitHost := "unix://" + filepath .Join (run , p )
70
- err := PingBKDaemon (buildkitHost )
72
+ _ , err := pingBKDaemon (buildkitHost )
71
73
if err == nil {
74
+ logrus .Debugf ("Chosen buildkit host %q" , buildkitHost )
72
75
return buildkitHost , nil
73
76
}
74
- logrus . WithField ( " host" , buildkitHost ). Warn ( err )
77
+ allErr = multierror . Append ( allErr , fmt . Errorf ( "failed to ping to host %s: %w " , buildkitHost , err ) )
75
78
}
76
- return "" , fmt .Errorf ("no buildkit host is available" )
79
+ logrus .WithError (allErr ).Error (getHint ())
80
+ return "" , fmt .Errorf ("no buildkit host is available, tried %d candidates: %w" , len (hostRel ), allErr )
77
81
}
78
82
79
83
func GetWorkerLabels (buildkitHost string ) (labels map [string ]string , _ error ) {
@@ -111,27 +115,40 @@ func GetWorkerLabels(buildkitHost string) (labels map[string]string, _ error) {
111
115
return labels , nil
112
116
}
113
117
114
- func PingBKDaemon (buildkitHost string ) error {
115
- if runtime .GOOS != "linux" {
116
- return errors .New ("only linux is supported" )
117
- }
118
+ func getHint () string {
118
119
hint := "`buildctl` needs to be installed and `buildkitd` needs to be running, see https://github.com/moby/buildkit"
119
120
if rootlessutil .IsRootless () {
120
121
hint += " , and `containerd-rootless-setuptool.sh install-buildkit` for OCI worker or `containerd-rootless-setuptool.sh install-buildkit-containerd` for containerd worker"
121
122
}
123
+ return hint
124
+ }
125
+
126
+ func PingBKDaemon (buildkitHost string ) error {
127
+ if out , err := pingBKDaemon (buildkitHost ); err != nil {
128
+ if out != "" {
129
+ logrus .Error (string (out ))
130
+ }
131
+ return fmt .Errorf (getHint ()+ ": %w" , err )
132
+ }
133
+ return nil
134
+ }
135
+
136
+ func pingBKDaemon (buildkitHost string ) (output string , _ error ) {
137
+ if runtime .GOOS != "linux" {
138
+ return "" , errors .New ("only linux is supported" )
139
+ }
122
140
buildctlBinary , err := BuildctlBinary ()
123
141
if err != nil {
124
- return fmt . Errorf ( hint + ": %w " , err )
142
+ return " " , err
125
143
}
126
144
args := BuildctlBaseArgs (buildkitHost )
127
145
args = append (args , "debug" , "workers" )
128
146
buildctlCheckCmd := exec .Command (buildctlBinary , args ... )
129
147
buildctlCheckCmd .Env = os .Environ ()
130
148
if out , err := buildctlCheckCmd .CombinedOutput (); err != nil {
131
- logrus .Error (string (out ))
132
- return fmt .Errorf (hint + ": %w" , err )
149
+ return string (out ), err
133
150
}
134
- return nil
151
+ return "" , nil
135
152
}
136
153
137
154
// WriteTempDockerfile is from https://github.com/docker/cli/blob/v20.10.9/cli/command/image/build/context.go#L118
0 commit comments