1

尝试使用 Docker 工具箱从此Dockerfile安装SyntaxNet时,我耗尽了虚拟内存。编译 Dockerfile 时收到此消息:

ERROR: /root/.cache/bazel/_bazel_root/5b21cea144c0077ae150bf0330ff61a0/external/org_tensorflow/tensorflow/core/kernels/BUILD:1921:1: C++ compilation of rule '@org_tensorflow//tensorflow/core/kernels:svd_op' failed: gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE '-D_FORTIFY_SOURCE=1' -fstack-protector -Wall -Wl,-z,-relro,-z,now -B/usr/bin -B/usr/bin -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-canonical-system-headers ... (remaining 115 argument(s) skipped): com.google.devtools.build.lib.shell.BadExitStatusException: Process exited with status 1. virtual memory exhausted: Cannot allocate memory ____Building complete. ____Elapsed time: 8548.364s, Critical Path: 8051.91s

我觉得这可以通过使用 (例如) 更改 Bazel 的默认作业限制来解决--jobs=1,但是我不确定将其放在 Dockerfile 中的哪个位置。

4

1 回答 1

2

有两种可能性:您可以修改 Dockerfile 以便它创建一个~/.bazelrc包含以下文本的文件:

build --jobs=1

请注意,即使 Dockerfile 运行bazel test(而不是bazel build),这仍然有效,因为build中的标志.bazelrc也适用于 Bazel 的test命令。

另一种可能性是修改RUNDockerfile 中的命令以包含--jobs=1参数,例如RUN [...] && bazel test --jobs=1 --genrule_strategy=standalone [...].

然后,Bazel 应该在构建期间生成不超过一个子进程。您可以通过在主机上运行“ps axuf”并查看容器的进程树来验证这一点。如果您修改了cmd,您还应该在 Bazel 的命令行上RUN看到该参数。--jobs=1

于 2017-03-02T12:05:17.800 回答