@@ -3,6 +3,7 @@ package panel
3
3
import (
4
4
"fmt"
5
5
"os"
6
+ "os/exec"
6
7
"strings"
7
8
"time"
8
9
@@ -147,6 +148,9 @@ func (c *ContainerList) SetKeyBinding() {
147
148
if err := c .SetKeybinding (c .name , 'f' , gocui .ModNone , c .Filter ); err != nil {
148
149
panic (err )
149
150
}
151
+ if err := c .SetKeybinding (c .name , 'a' , gocui .ModNone , c .AttachContainer ); err != nil {
152
+ panic (err )
153
+ }
150
154
}
151
155
152
156
func (c * ContainerList ) selected () (* Container , error ) {
@@ -220,24 +224,11 @@ func (c *ContainerList) StartContainer(g *gocui.Gui, v *gocui.View) error {
220
224
return nil
221
225
}
222
226
223
- g .Update (func (g * gocui.Gui ) error {
224
- c .StateMessage ("container starting..." )
225
-
226
- g .Update (func (g * gocui.Gui ) error {
227
- defer c .Refresh (g , v )
228
- defer c .CloseStateMessage ()
229
-
230
- if err := c .Docker .StartContainerWithID (container .ID ); err != nil {
231
- c .ErrMessage (err .Error (), c .name )
232
- return nil
233
- }
234
-
235
- c .SwitchPanel (c .name )
236
-
237
- return nil
238
- })
239
-
240
- return nil
227
+ c .AddTask (fmt .Sprintf ("Start container %s" , container .Name ), func () error {
228
+ if err := c .Docker .StartContainerWithID (container .ID ); err != nil {
229
+ return err
230
+ }
231
+ return c .Refresh (g , v )
241
232
})
242
233
243
234
return nil
@@ -250,24 +241,11 @@ func (c *ContainerList) StopContainer(g *gocui.Gui, v *gocui.View) error {
250
241
return nil
251
242
}
252
243
253
- g .Update (func (g * gocui.Gui ) error {
254
- c .StateMessage ("container stopping..." )
255
-
256
- g .Update (func (g * gocui.Gui ) error {
257
- defer c .CloseStateMessage ()
258
- defer c .Refresh (g , v )
259
-
260
- if err := c .Docker .StopContainerWithID (container .ID ); err != nil {
261
- c .ErrMessage (err .Error (), c .name )
262
- return nil
263
- }
264
-
265
- c .SwitchPanel (c .name )
266
-
267
- return nil
268
- })
269
-
270
- return nil
244
+ c .AddTask (fmt .Sprintf ("Stop container %s" , container .Name ), func () error {
245
+ if err := c .Docker .StopContainerWithID (container .ID ); err != nil {
246
+ return err
247
+ }
248
+ return c .Refresh (g , v )
271
249
})
272
250
273
251
return nil
@@ -320,37 +298,23 @@ func (c *ContainerList) ExportContainer(g *gocui.Gui, v *gocui.View) error {
320
298
}
321
299
322
300
data := c .form .GetFieldTexts ()
301
+ container := data ["Container" ]
302
+ path := data ["Path" ]
323
303
324
- g .Update (func (g * gocui.Gui ) error {
325
- c .form .Close (g , v )
326
- c .StateMessage ("container exporting..." )
327
-
328
- g .Update (func (g * gocui.Gui ) error {
329
- defer c .CloseStateMessage ()
330
-
331
- file , err := os .OpenFile (data ["Path" ], os .O_WRONLY | os .O_CREATE | os .O_EXCL , 0666 )
332
- if err != nil {
333
- c .ErrMessage (err .Error (), c .name )
334
- return nil
335
- }
336
- defer file .Close ()
337
-
338
- options := docker.ExportContainerOptions {
339
- ID : data ["Container" ],
340
- OutputStream : file ,
341
- }
342
-
343
- if err := c .Docker .ExportContainerWithOptions (options ); err != nil {
344
- c .ErrMessage (err .Error (), c .name )
345
- return nil
346
- }
304
+ c .form .Close (g , v )
347
305
348
- c .SwitchPanel (c .name )
349
-
350
- return nil
306
+ c .AddTask (fmt .Sprintf ("Export container %s to %s" , container , path ), func () error {
307
+ file , err := os .OpenFile (path , os .O_WRONLY | os .O_CREATE | os .O_EXCL , 0666 )
308
+ if err != nil {
309
+ return err
310
+ }
311
+ defer file .Close ()
351
312
352
- })
353
- return nil
313
+ options := docker.ExportContainerOptions {
314
+ ID : container ,
315
+ OutputStream : file ,
316
+ }
317
+ return c .Docker .ExportContainerWithOptions (options )
354
318
})
355
319
356
320
return nil
@@ -408,32 +372,23 @@ func (c *ContainerList) CommitContainer(g *gocui.Gui, v *gocui.View) error {
408
372
data ["Tag" ] = "latest"
409
373
}
410
374
375
+ container := data ["Container" ]
376
+ repository := data ["Repository" ]
377
+ tag := data ["Tag" ]
378
+
411
379
options := docker.CommitContainerOptions {
412
- Container : data [ "Container" ] ,
413
- Repository : data [ "Repository" ] ,
414
- Tag : data [ "Tag" ] ,
380
+ Container : container ,
381
+ Repository : repository ,
382
+ Tag : tag ,
415
383
}
416
384
417
- g .Update (func (g * gocui.Gui ) error {
418
- c .form .Close (g , v )
419
- c .StateMessage ("container committing..." )
420
-
421
- g .Update (func (g * gocui.Gui ) error {
422
- defer c .CloseStateMessage ()
385
+ c .form .Close (g , v )
423
386
424
- if err := c .Docker .CommitContainerWithOptions (options ); err != nil {
425
- c .ErrMessage (err .Error (), c .name )
426
- return nil
427
- }
428
-
429
- c .Panels [ImageListPanel ].Refresh (g , v )
430
- c .SwitchPanel (c .name )
431
-
432
- return nil
433
-
434
- })
435
-
436
- return nil
387
+ c .AddTask (fmt .Sprintf ("Commit container %s to %s" , container , repository + ":" + tag ), func () error {
388
+ if err := c .Docker .CommitContainerWithOptions (options ); err != nil {
389
+ return err
390
+ }
391
+ return c .Refresh (g , v )
437
392
})
438
393
439
394
return nil
@@ -485,32 +440,21 @@ func (c *ContainerList) RenameContainer(g *gocui.Gui, v *gocui.View) error {
485
440
}
486
441
487
442
data := c .form .GetFieldTexts ()
443
+ oldName := data ["Container" ]
444
+ name := data ["NewName" ]
488
445
489
446
options := docker.RenameContainerOptions {
490
- ID : data [ "Container" ] ,
491
- Name : data [ "NewName" ] ,
447
+ ID : oldName ,
448
+ Name : name ,
492
449
}
493
450
494
- g .Update (func (g * gocui.Gui ) error {
495
- c .form .Close (g , v )
496
- c .StateMessage ("container renaming..." )
497
-
498
- g .Update (func (g * gocui.Gui ) error {
499
- defer c .CloseStateMessage ()
500
-
501
- if err := c .Docker .RenameContainerWithOptions (options ); err != nil {
502
- c .ErrMessage (err .Error (), c .name )
503
- return nil
504
- }
451
+ c .form .Close (g , v )
505
452
506
- c .Refresh (g , v )
507
- c .SwitchPanel (c .name )
508
-
509
- return nil
510
-
511
- })
512
-
513
- return nil
453
+ c .AddTask (fmt .Sprintf ("Rename container %s to %s" , oldName , name ), func () error {
454
+ if err := c .Docker .RenameContainerWithOptions (options ); err != nil {
455
+ return err
456
+ }
457
+ return c .Refresh (g , v )
514
458
})
515
459
516
460
return nil
@@ -597,3 +541,23 @@ func (c *ContainerList) Filter(g *gocui.Gui, lv *gocui.View) error {
597
541
598
542
return nil
599
543
}
544
+
545
+ func (c * ContainerList ) AttachContainer (g * gocui.Gui , v * gocui.View ) error {
546
+ return AttachFlag
547
+ }
548
+
549
+ func (c * ContainerList ) Attach () error {
550
+ selected , err := c .selected ()
551
+ if err != nil {
552
+ return err
553
+ }
554
+
555
+ cmd := exec .Command ("docker" , "attach" , selected .ID )
556
+
557
+ cmd .Stdin = os .Stdin
558
+ cmd .Stdout = os .Stdout
559
+ cmd .Stderr = os .Stderr
560
+ cmd .Run ()
561
+
562
+ return nil
563
+ }
0 commit comments