在osx上的bazel测试环境中运行docker

时间:2017-06-18 10:49:58

标签: macos docker sandbox bazel

尝试在java_test内运行docker ProcessBuilder。 简化测试代码如下:

@Test
public void testDockerExecutable(){
    System.out.println("======== running docker ==============");
    try {
        Process p = new ProcessBuilder("docker","version")
                .inheritIO()
                .start();
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

直接从shell运行docker version会产生输出:

Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:00:50 2017
 OS/Arch:      linux/amd64
 Experimental: true

但是运行测试会得到输出:

WARNING: Streamed test output requested. All tests will be run locally, without sharding, one at a time.
INFO: Found 1 test target...
JUnit4 Test Runner
.======== here ==============
java.io.IOException: Cannot run program "docker": error=2, No such file or directory

我知道我需要以某种方式将docker导入runfiles环境(就像local_jdk那样)。但是我该怎么做?另外 - 与仅需要读取权限的jdk不同,docker需要对其lib文件夹具有写权限。

我的环境是 mac os x sierra 和bazel HEAD(68028317c1d3d831a24f90e2b25d1410ce045c54)。

使用java_test进行了尝试。 "local"属性不会影响失败。 (尝试使用True和False)。

更新:适用于Linux

我尝试在linux中运行它,它适用于"local"=True"local"=False。好像它与mac有关。

2 个答案:

答案 0 :(得分:2)

Linux沙箱默认安装一些目录(引用the docs):

  

我们目前还挂载/ bin,/ etc,/ usr(除了/ usr / local),以及每个以/ lib开头的目录,以允许运行本地工具。将来,我们计划提供一个带有一组Linux实用程序的shell,并要求将所有其他工具指定为输入。

我假设docker二进制文件位于其中一个标准位置,而bazel在此处找到它。

也许在mac上,二进制文件在其他地方,只有将PATH导出到测试环境才会显示出来?

除此之外,最佳做法是使测试明确依赖于某些“docker”目标。然后bazel将确保二进制文件存在。您可以使用local_repository(或其new_变体)规则将其连接起来。

答案 1 :(得分:0)

似乎这就是诀窍:

  

$ bazel test --test_env = PATH<目标>

理解为什么它在linux中运行会很有趣