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

running docker inside bazel test env on osx

正在尝试 运行 java_test ProcessBuilder 中的 运行s docker。 简化测试代码如下:

@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);
    }
}

运行 docker version 直接来自 shell 给出输出:

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 导入 运行files 环境(就像 local_jdk 所做的那样)。但是我该怎么做呢?此外 - 与仅需要读取权限的 jdk 不同,docker 需要对其 lib 文件夹的写入权限。

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

java_test 试过了。 "local" 属性不影响失败。 (尝试了 True 和 False)。


更新:适用于 Linux

我在 linux 中尝试了 运行,它在 "local"=True"local"=False 中都运行良好。似乎与 mac.

有关

似乎这样就可以了:

$ bazel test --test_env=PATH < target >

理解为什么它在 linux

中起作用会很有趣

Linux沙盒默认挂载一些目录(引用the docs):

We currently also mount /bin, /etc, /usr (except /usr/local), and every directory starting with /lib, to allow running local tools. In the future, we are planning to provide a shell with a set of Linux utilities, and to require that all other tools are specified as inputs.

我假设 docker 二进制文件位于标准位置之一,bazel 在这里找到它。

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

总而言之,最佳做法是使测试明确依赖于某些 'docker' 目标。然后 bazel 将确保二进制文件在那里。您可以使用 local_repository(或其 new_ 变体)规则来连接它。