@@ -6,10 +6,12 @@ package main
6
6
import (
7
7
"encoding/json"
8
8
"fmt"
9
+ "strings"
9
10
10
11
"golang.org/x/exp/slices"
11
12
12
13
"github.com/aws/aws-sdk-go-v2/aws"
14
+ "github.com/sirupsen/logrus"
13
15
"github.com/spf13/afero"
14
16
"github.com/spf13/cobra"
15
17
@@ -41,6 +43,11 @@ type nerdctlCommandCreator struct {
41
43
fc * config.Finch
42
44
}
43
45
46
+ type (
47
+ argHandler func (systemDeps NerdctlCommandSystemDeps , fc * config.Finch , args []string , index int ) error
48
+ commandHandler func (systemDeps NerdctlCommandSystemDeps , fc * config.Finch , cmdName * string , args * []string ) error
49
+ )
50
+
44
51
func newNerdctlCommandCreator (
45
52
ncc command.NerdctlCmdCreator ,
46
53
ecc command.Creator ,
@@ -192,12 +199,33 @@ var nerdctlCmds = map[string]string{
192
199
"wait" : "Block until one or more containers stop, then print their exit codes" ,
193
200
}
194
201
202
+ var dockerCompatCmds = map [string ]string {
203
+ "buildx" : "build version" ,
204
+ }
205
+
206
+ var aliasMap = map [string ]string {
207
+ "build" : "image build" ,
208
+ "run" : "container run" ,
209
+ "cp" : "container cp" ,
210
+ }
211
+
212
+ var commandHandlerMap = map [string ]commandHandler {
213
+ "buildx" : handleBuildx ,
214
+ "inspect" : handleDockerCompatInspect ,
215
+ }
216
+
217
+ var argHandlerMap = map [string ]map [string ]argHandler {
218
+ "image build" : {
219
+ "--load" : handleDockerBuildLoad ,
220
+ },
221
+ }
222
+
195
223
var cmdFlagSetMap = map [string ]map [string ]sets.Set [string ]{
196
224
"container run" : {
197
225
"shortBoolFlags" : sets .New [string ]("-d" , "-i" , "-t" ),
198
226
"longBoolFlags" : sets .New [string ](
199
227
"--detach" , "--init" , "--interactive" , "--oom-kill-disable" ,
200
- "--privileged" , "--read-only" , "--rm" , "--rootfs" , "--tty" ),
228
+ "--privileged" , "--read-only" , "--rm" , "--rootfs" , "--tty" , "--sig-proxy" ),
201
229
"shortArgFlags" : sets .New [string ]("-e" , "-h" , "-m" , "-u" , "-w" , "-p" , "-l" , "-v" ),
202
230
},
203
231
"exec" : {
@@ -215,3 +243,99 @@ var cmdFlagSetMap = map[string]map[string]sets.Set[string]{
215
243
"shortArgFlags" : sets .New [string ]("-e" , "-h" , "-m" , "-u" , "-w" , "-p" , "-l" , "-v" ),
216
244
},
217
245
}
246
+
247
+ // converts "docker build --load" flag to "nerdctl build --output=type=docker".
248
+ func handleDockerBuildLoad (_ NerdctlCommandSystemDeps , fc * config.Finch , nerdctlCmdArgs []string , index int ) error {
249
+ if fc .DockerCompat {
250
+ nerdctlCmdArgs [index ] = "--output=type=docker"
251
+ }
252
+
253
+ return nil
254
+ }
255
+
256
+ func handleBuildx (_ NerdctlCommandSystemDeps , fc * config.Finch , cmdName * string , args * []string ) error {
257
+ if fc == nil || ! fc .DockerCompat {
258
+ return nil
259
+ }
260
+
261
+ if cmdName != nil && * cmdName == "buildx" {
262
+ subCmd := (* args )[0 ]
263
+ buildxSubcommands := []string {"bake" , "create" , "debug" , "du" , "imagetools" , "inspect" , "ls" , "prune" , "rm" , "stop" , "use" , "version" }
264
+
265
+ if slices .Contains (buildxSubcommands , subCmd ) {
266
+ return fmt .Errorf ("unsupported buildx command: %s" , subCmd )
267
+ }
268
+
269
+ logrus .Warn ("buildx is not supported. using standard buildkit instead..." )
270
+ if subCmd == "build" {
271
+ * args = (* args )[1 :]
272
+ }
273
+ * cmdName = "build"
274
+ }
275
+ // else, continue with the original command
276
+ return nil
277
+ }
278
+
279
+ func handleDockerCompatInspect (_ NerdctlCommandSystemDeps , fc * config.Finch , cmdName * string , args * []string ) error {
280
+ if ! fc .DockerCompat {
281
+ return nil
282
+ }
283
+
284
+ if * args == nil {
285
+ return fmt .Errorf ("invalid arguments: args (null pointer)" )
286
+ }
287
+
288
+ modeDockerCompat := `--mode=dockercompat`
289
+ inspectType := ""
290
+ sizeArg := ""
291
+ savedArgs := []string {}
292
+ skip := false
293
+
294
+ for idx , arg := range * args {
295
+ if skip {
296
+ skip = false
297
+ continue
298
+ }
299
+
300
+ if (arg == "--type" ) && (idx < len (* args )- 1 ) {
301
+ inspectType = (* args )[idx + 1 ]
302
+ skip = true
303
+ continue
304
+ }
305
+
306
+ if strings .Contains (arg , "--type" ) && strings .Contains (arg , "=" ) {
307
+ inspectType = strings .Split (arg , "=" )[1 ]
308
+ continue
309
+ }
310
+
311
+ if (arg == "--size" ) || (arg == "-s" ) {
312
+ sizeArg = "--size"
313
+ continue
314
+ }
315
+
316
+ savedArgs = append (savedArgs , arg )
317
+ }
318
+
319
+ switch inspectType {
320
+ case "image" :
321
+ * cmdName = "image inspect"
322
+ * args = append ([]string {modeDockerCompat }, savedArgs ... )
323
+ case "volume" :
324
+ * cmdName = "volume inspect"
325
+ if sizeArg != "" {
326
+ * args = append ([]string {sizeArg }, savedArgs ... )
327
+ } else {
328
+ * args = append ([]string {}, savedArgs ... )
329
+ }
330
+ case "container" :
331
+ * cmdName = "inspect"
332
+ * args = append ([]string {modeDockerCompat }, savedArgs ... )
333
+ case "" :
334
+ * cmdName = "inspect"
335
+ * args = append ([]string {modeDockerCompat }, savedArgs ... )
336
+ default :
337
+ return fmt .Errorf ("unsupported inspect type: %s" , inspectType )
338
+ }
339
+
340
+ return nil
341
+ }
0 commit comments