2017-02-28 2 views
1

J'ai épuisé ma mémoire virtuelle en essayant d'installer SyntaxNet à partir de ce Dockerfile en utilisant la boîte à outils Docker. Je reçu ce message lors de la compilation du Dockerfile:Mémoire virtuelle épuisée Installation de SyntaxNet à l'aide de Docker Toolbox

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 

J'ai le sentiment que cela pourrait être résolu en changeant les emplois par défaut de Bazel limite avec (par exemple) --jobs=1, mais je ne sais pas où je mettrais que dans la Dockerfile.

Répondre

2

Il y a deux possibilités: Vous pouvez soit modifier le Dockerfile afin qu'il crée un ~/.bazelrc qui contient le texte suivant:

build --jobs=1 

Notez que cela fonctionne, même si le Dockerfile court bazel test (par opposition à bazel build), car les indicateurs build du code .bazelrc s'appliquent également à la commande test de Bazel.

L'autre possibilité serait de modifier la commande RUN dans le Dockerfile pour inclure le paramètre --jobs=1, par ex. RUN [...] && bazel test --jobs=1 --genrule_strategy=standalone [...]. Bazel devrait alors générer au plus un processus fils unique pendant la construction. Vous pouvez le vérifier en exécutant "ps axuf" sur votre hôte et en regardant l'arborescence de votre conteneur. Si vous avez modifié le cmd RUN, vous devriez également voir le paramètre --jobs=1 sur la ligne de commande de Bazel.