2017-02-28 104 views
1

嘗試使用Docker Toolbox從此Dockerfile安裝SyntaxNet時,我耗盡了虛擬內存。我收到此消息編譯Dockerfile時:用盡虛擬內存使用Docker Toolbox安裝SyntaxNet

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 

我有一種感覺,這可以通過改變巴澤爾的默認工作來解決與(例如)--jobs=1限制,但我不知道在那裏我會提出,在Dockerfile。

回答

2

有兩種可能性:你可以任意修改Dockerfile,這樣它會創建一個~/.bazelrc,包含以下內容:

build --jobs=1 

需要注意的是這個工程,即使Dockerfile運行bazel test(而不是bazel build ),因爲.bazelrc中的build標誌也適用於Bazel的test命令。

另一種可能性是修改Dockerfile中的RUN命令以包含--jobs=1參數,例如, RUN [...] && bazel test --jobs=1 --genrule_strategy=standalone [...]

Bazel應該在構建過程中產生不超過一個子進程。您可以通過在主機上運行「ps axuf」並查看容器的進程樹來驗證此情況。如果修改了RUN cmd,則還應該看到Bazel命令行上的--jobs=1參數。