@@ -3,17 +3,54 @@ use std::path::PathBuf;
3
3
use std:: process:: { Command , ExitStatus } ;
4
4
use std:: { env, fs} ;
5
5
6
+ use semver:: { Version , VersionReq } ;
7
+
6
8
use { Target , Toml } ;
7
9
use cargo:: Root ;
8
10
use errors:: * ;
9
11
use extensions:: CommandExt ;
10
12
use id;
11
13
use rustc;
12
14
15
+ lazy_static ! {
16
+ /// Retrieve the Docker Daemon version.
17
+ ///
18
+ /// # Panics
19
+ /// Panics if the version cannot be retrieved or parsed
20
+ static ref DOCKER_VERSION : Version = {
21
+ let version_string = Command :: new( "docker" )
22
+ . arg( "version" )
23
+ . arg( "--format={{.Server.APIVersion}}" )
24
+ . run_and_get_stdout( false )
25
+ . expect( "Unable to obtain Docker version" ) ;
26
+ // API versions don't have "patch" version
27
+ Version :: parse( & format!( "{}.0" , version_string. trim( ) ) )
28
+ . expect( "Cannot parse Docker engine version" )
29
+ } ;
30
+
31
+ /// Version requirements for user namespace.
32
+ ///
33
+ /// # Panics
34
+ /// Panics if the parsing fails
35
+ static ref USERNS_REQUIREMENT : VersionReq = {
36
+ VersionReq :: parse( ">= 1.24" )
37
+ . expect( "Unable to parse version requirements" )
38
+ } ;
39
+ }
40
+
41
+ /// Add the `userns` flag, if needed
42
+ pub fn docker_command ( subcommand : & str ) -> Command {
43
+ let mut docker = Command :: new ( "docker" ) ;
44
+ docker. arg ( subcommand) ;
45
+ if USERNS_REQUIREMENT . matches ( & DOCKER_VERSION ) {
46
+ docker. args ( & [ "--userns" , "host" ] ) ;
47
+ }
48
+ docker
49
+ }
50
+
13
51
/// Register QEMU interpreters
14
52
pub fn register ( verbose : bool ) -> Result < ( ) > {
15
- Command :: new ( "docker" )
16
- . arg ( "run" )
53
+ docker_command ( "run" )
17
54
. arg ( "--privileged" )
18
55
. arg ( "--rm" )
19
56
. arg ( "-it" )
@@ -64,10 +101,9 @@ pub fn run(target: &Target,
64
101
. run ( verbose)
65
102
. chain_err ( || "couldn't generate Cargo.lock" ) ?;
66
103
67
- let mut docker = Command :: new ( "docker ") ;
104
+ let mut docker = docker_command ( "run ") ;
68
105
69
106
docker
70
- . arg ( "run" )
71
107
. arg ( "--rm" )
72
108
. args ( & [ "--user" , & format ! ( "{}:{}" , id:: user( ) , id:: group( ) ) ] )
73
109
. args ( & [ "-e" , "CARGO_HOME=/cargo" ] )
0 commit comments