在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中工作会很有趣