Skip to content

Commit 47c562e

Browse files
committed
Fixes permission issues with userns on Docker host
Fixes #90
1 parent 9426dc0 commit 47c562e

File tree

4 files changed

+68
-4
lines changed

4 files changed

+68
-4
lines changed

Cargo.lock

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ version = "0.1.11-dev"
1111

1212
[dependencies]
1313
error-chain = "0.7.1"
14+
lazy_static = "0.2"
1415
libc = "0.2.18"
1516
rustc_version = "0.1.7"
17+
semver = "0.6.0"
1618
toml = "0.2.1"

src/docker.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,54 @@ use std::path::PathBuf;
33
use std::process::{Command, ExitStatus};
44
use std::{env, fs};
55

6+
use semver::{Version, VersionReq};
7+
68
use {Target, Toml};
79
use cargo::Root;
810
use errors::*;
911
use extensions::CommandExt;
1012
use id;
1113
use rustc;
1214

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+
1351
/// Register QEMU interpreters
1452
pub fn register(verbose: bool) -> Result<()> {
15-
Command::new("docker")
16-
.arg("run")
53+
docker_command("run")
1754
.arg("--privileged")
1855
.arg("--rm")
1956
.arg("-it")
@@ -64,10 +101,9 @@ pub fn run(target: &Target,
64101
.run(verbose)
65102
.chain_err(|| "couldn't generate Cargo.lock")?;
66103

67-
let mut docker = Command::new("docker");
104+
let mut docker = docker_command("run");
68105

69106
docker
70-
.arg("run")
71107
.arg("--rm")
72108
.args(&["--user", &format!("{}:{}", id::user(), id::group())])
73109
.args(&["-e", "CARGO_HOME=/cargo"])

src/main.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
#[macro_use]
22
extern crate error_chain;
3+
#[macro_use]
4+
extern crate lazy_static;
35
extern crate libc;
46
extern crate rustc_version;
7+
extern crate semver;
58
extern crate toml;
69

710
mod cargo;

0 commit comments

Comments
 (0)