@@ -320,7 +320,8 @@ fn get_cross_volumes(
320
320
msg_info : & mut MessageInfo ,
321
321
) -> cross:: Result < Vec < String > > {
322
322
use cross:: docker:: VOLUME_PREFIX ;
323
- let stdout = docker:: subcommand ( engine, "volume" )
323
+ let stdout = engine
324
+ . subcommand ( "volume" )
324
325
. arg ( "list" )
325
326
. args ( [ "--format" , "{{.Name}}" ] )
326
327
// handles simple regex: ^ for start of line.
@@ -348,7 +349,7 @@ pub fn remove_all_volumes(
348
349
) -> cross:: Result < ( ) > {
349
350
let volumes = get_cross_volumes ( engine, msg_info) ?;
350
351
351
- let mut command = docker :: subcommand ( engine , "volume" ) ;
352
+ let mut command = engine . subcommand ( "volume" ) ;
352
353
command. arg ( "rm" ) ;
353
354
if force {
354
355
command. arg ( "--force" ) ;
@@ -370,7 +371,7 @@ pub fn prune_volumes(
370
371
engine : & docker:: Engine ,
371
372
msg_info : & mut MessageInfo ,
372
373
) -> cross:: Result < ( ) > {
373
- let mut command = docker :: subcommand ( engine , "volume" ) ;
374
+ let mut command = engine . subcommand ( "volume" ) ;
374
375
command. args ( [ "prune" , "--force" ] ) ;
375
376
if execute {
376
377
command. run ( msg_info, false ) . map_err ( Into :: into)
@@ -397,34 +398,34 @@ pub fn create_persistent_volume(
397
398
} ;
398
399
let mount_finder = docker:: MountFinder :: create ( engine) ?;
399
400
let dirs = docker:: ToolchainDirectories :: assemble ( & mount_finder, toolchain. clone ( ) ) ?;
400
- let container = dirs. unique_container_identifier ( & toolchain. host ( ) . target ) ?;
401
- let volume = dirs. unique_toolchain_identifier ( ) ?;
401
+ let container_id = dirs. unique_container_identifier ( & toolchain. host ( ) . target ) ?;
402
+ let volume_id = dirs. unique_toolchain_identifier ( ) ?;
403
+ let volume = docker:: DockerVolume :: new ( engine, & volume_id) ;
402
404
403
- if docker :: volume_exists ( engine , & volume, msg_info) ? {
404
- eyre:: bail!( "Error: volume {volume } already exists." ) ;
405
+ if volume. exists ( msg_info) ? {
406
+ eyre:: bail!( "Error: volume {volume_id } already exists." ) ;
405
407
}
406
408
407
- docker:: subcommand ( engine, "volume" )
408
- . args ( [ "create" , & volume] )
409
- . run_and_get_status ( msg_info, false ) ?;
409
+ volume. create ( msg_info) ?;
410
410
411
411
// stop the container if it's already running
412
- let state = docker:: container_state ( engine, & container, msg_info) ?;
412
+ let container = docker:: DockerContainer :: new ( engine, & container_id) ;
413
+ let state = container. state ( msg_info) ?;
413
414
if !state. is_stopped ( ) {
414
- msg_info. warn ( format_args ! ( "container {container } was running." ) ) ?;
415
- docker :: container_stop_default ( engine , & container, msg_info) ?;
415
+ msg_info. warn ( format_args ! ( "container {container_id } was running." ) ) ?;
416
+ container. stop_default ( msg_info) ?;
416
417
}
417
418
if state. exists ( ) {
418
- msg_info. warn ( format_args ! ( "container {container } was exited." ) ) ?;
419
- docker :: container_rm ( engine , & container, msg_info) ?;
419
+ msg_info. warn ( format_args ! ( "container {container_id } was exited." ) ) ?;
420
+ container. remove ( msg_info) ?;
420
421
}
421
422
422
423
// create a dummy running container to copy data over
423
424
let mount_prefix = docker:: MOUNT_PREFIX ;
424
- let mut docker = docker :: subcommand ( engine , "run" ) ;
425
- docker. args ( [ "--name" , & container ] ) ;
425
+ let mut docker = engine . subcommand ( "run" ) ;
426
+ docker. args ( [ "--name" , & container_id ] ) ;
426
427
docker. arg ( "--rm" ) ;
427
- docker. args ( [ "-v" , & format ! ( "{}:{}" , volume , mount_prefix) ] ) ;
428
+ docker. args ( [ "-v" , & format ! ( "{}:{}" , volume_id , mount_prefix) ] ) ;
428
429
docker. arg ( "-d" ) ;
429
430
let is_tty = io:: Stdin :: is_atty ( ) && io:: Stdout :: is_atty ( ) && io:: Stderr :: is_atty ( ) ;
430
431
if is_tty {
@@ -440,34 +441,15 @@ pub fn create_persistent_volume(
440
441
docker. args ( [ "sh" , "-c" , "sleep infinity" ] ) ;
441
442
}
442
443
// store first, since failing to non-existing container is fine
443
- docker:: Container :: create ( engine. clone ( ) , container. clone ( ) ) ?;
444
- docker. run_and_get_status ( msg_info, false ) ?;
445
-
446
- docker:: remote:: copy_volume_container_xargo (
447
- engine,
448
- & container,
449
- & dirs,
450
- mount_prefix. as_ref ( ) ,
451
- msg_info,
452
- ) ?;
453
- docker:: remote:: copy_volume_container_cargo (
454
- engine,
455
- & container,
456
- & dirs,
457
- mount_prefix. as_ref ( ) ,
458
- copy_registry,
459
- msg_info,
460
- ) ?;
461
- docker:: remote:: copy_volume_container_rust (
462
- engine,
463
- & container,
464
- & dirs,
465
- None ,
466
- mount_prefix. as_ref ( ) ,
467
- msg_info,
468
- ) ?;
469
-
470
- docker:: Container :: finish_static ( is_tty, msg_info) ;
444
+ docker:: ChildContainer :: create ( engine. clone ( ) , container_id. clone ( ) ) ?;
445
+ docker. run_and_get_status ( msg_info, true ) ?;
446
+
447
+ let data_volume = docker:: ContainerDataVolume :: new ( engine, & container_id, & dirs) ;
448
+ data_volume. copy_xargo ( mount_prefix. as_ref ( ) , msg_info) ?;
449
+ data_volume. copy_cargo ( mount_prefix. as_ref ( ) , copy_registry, msg_info) ?;
450
+ data_volume. copy_rust ( None , mount_prefix. as_ref ( ) , msg_info) ?;
451
+
452
+ docker:: ChildContainer :: finish_static ( is_tty, msg_info) ;
471
453
472
454
Ok ( ( ) )
473
455
}
@@ -484,13 +466,14 @@ pub fn remove_persistent_volume(
484
466
} ;
485
467
let mount_finder = docker:: MountFinder :: create ( engine) ?;
486
468
let dirs = docker:: ToolchainDirectories :: assemble ( & mount_finder, toolchain) ?;
487
- let volume = dirs. unique_toolchain_identifier ( ) ?;
469
+ let volume_id = dirs. unique_toolchain_identifier ( ) ?;
470
+ let volume = docker:: DockerVolume :: new ( engine, & volume_id) ;
488
471
489
- if !docker :: volume_exists ( engine , & volume, msg_info) ? {
490
- eyre:: bail!( "Error: volume {volume } does not exist." ) ;
472
+ if !volume. exists ( msg_info) ? {
473
+ eyre:: bail!( "Error: volume {volume_id } does not exist." ) ;
491
474
}
492
475
493
- docker :: volume_rm ( engine , & volume, msg_info) ?;
476
+ volume. remove ( msg_info) ?;
494
477
495
478
Ok ( ( ) )
496
479
}
@@ -500,7 +483,8 @@ fn get_cross_containers(
500
483
msg_info : & mut MessageInfo ,
501
484
) -> cross:: Result < Vec < String > > {
502
485
use cross:: docker:: VOLUME_PREFIX ;
503
- let stdout = docker:: subcommand ( engine, "ps" )
486
+ let stdout = engine
487
+ . subcommand ( "ps" )
504
488
. arg ( "-a" )
505
489
. args ( [ "--format" , "{{.Names}}: {{.State}}" ] )
506
490
// handles simple regex: ^ for start of line.
@@ -543,13 +527,13 @@ pub fn remove_all_containers(
543
527
544
528
let mut commands = vec ! [ ] ;
545
529
if !running. is_empty ( ) {
546
- let mut stop = docker :: subcommand ( engine , "stop" ) ;
530
+ let mut stop = engine . subcommand ( "stop" ) ;
547
531
stop. args ( & running) ;
548
532
commands. push ( stop) ;
549
533
}
550
534
551
535
if !( stopped. is_empty ( ) && running. is_empty ( ) ) {
552
- let mut rm = docker :: subcommand ( engine , "rm" ) ;
536
+ let mut rm = engine . subcommand ( "rm" ) ;
553
537
if force {
554
538
rm. arg ( "--force" ) ;
555
539
}
0 commit comments