运行 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_
变体)规则来连接它。
正在尝试 运行 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_
变体)规则来连接它。