尝试在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中运行它,它适用于"local"=True
和"local"=False
。好像它与mac有关。
答案 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中运行会很有趣