在osx上运行docker内bazeltestingenv

试图运行在ProcessBuilder运行java_test 。 简化testing的代码如下:

 @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 

但运行testing给出了这个输出:

 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有关的东西。

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

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

我认为docker二进制文件位于标准位置之一,bazel在这里find它。

也许在Mac上的二进制文件是在别的地方,只有导出到testing环境的PATH显示它?

除此之外,最好的做法是使testing明确依赖于某个“docker”目标。 然后bazel将确保二进制文件在那里。 您可以使用local_repository (或其new_ )规则来挂钩它。

似乎这样做的诀窍:

$ bazel test –test_env = PATH <target>

理解为什么它在linux中工作会很有趣

Interesting Posts