react-native bundle で FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

React Nativeアプリのビルド環境をdocker上に構築しているのですが、あるタイミングで `react-native bundle` コマンドが以下のようなエラーを出力し失敗するようになってしまいました。

```
> react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
Loading dependency graph, done.
Loading dependency graph...
<--- Last few GCs --->

[24:0x3def1e0]   805808 ms: Mark-sweep 1323.4 (1536.9) -> 1323.3 (1537.4) MB, 2489.5 / 0.0 ms  allocation failure GC in old space requested
[24:0x3def1e0]   808226 ms: Mark-sweep 1323.3 (1537.4) -> 1323.2 (1489.4) MB, 2413.2 / 0.0 ms  last resort GC in old space requested
[24:0x3def1e0]   810702 ms: Mark-sweep 1323.2 (1489.4) -> 1323.2 (1484.4) MB, 2474.2 / 0.0 ms  last resort GC in old space requested


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x2e41a2725879 <JSObject>
    1: _append [/app/node_modules/@babel/generator/lib/buffer.js:~112] [pc=0x3a9aabf22649](this=0x3f72c6539ee1 <Buffer map = 0x247c946822b1>,str=0x2e41a277c0c9 <String[1]:  >,line=6105,column=26,identifierName=0x2e3c0c782201 <null>,filename=0x2e3c0c782201 <null>,force=0x2e3c0c7823e1 <false>)
    2: token [/app/node_modules/@babel/generator/lib/printer.js:~126] [pc=0x3a9aabf2fe00](this=0x3f72c653...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [node]
 2: 0x8cbf4c [node]
 3: v8::Utils::ReportOOMFailure(char const*, bool) [node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node]
 5: v8::internal::Factory::NewUninitializedFixedArray(int) [node]
 6: 0xd7fc13 [node]
 7: v8::internal::Runtime_GrowArrayElements(int, v8::internal::Object**, v8::internal::Isolate*) [node]
 8: 0x3a9aab0842fd
Aborted
npm ERR! code ELIFECYCLE
npm ERR! errno 134
npm ERR! react_project@0.0.1 android-linux: `react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res`
npm ERR! Exit status 134
npm ERR! 
npm ERR! Failed at the react_project@0.0.1 android-linux script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2019-01-28T07_35_33_700Z-debug.log
```

以下の2つを実施することで解決しました。

- dockerコンテナへの割当メモリを増やす

```yaml:docker-compose.yml
version: '3'
services:
  deploy:
    build: .
    volumes:
      - .:/app
      - data-gradle:/root/.gradle
      - data-nodemodules:/app/node_modules
    working_dir: /app
　　　　　# 追記
    shm_size: 4GB 
volumes:
  data-gradle:
  data-nodemodules:
```

- `react-native bundle` コマンド実行時、nodeのオプション`--expose-gc --max_old_space_size`を指定する  
コマンド全体はこのようになります。

```
node --expose-gc --max_old_space_size=2048 $(npm bin)/react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
```

# 追記
`assembleDebug|Release` するときは、build.gradleからも同じオプションを設定する必要があります。
`nodeExecutableAndArgs` という設定値でデフォルトの `node` コマンドにオプションを追加することができます。

```gradle:app/build.gradle
project.ext.react = [
        bundleAssetName: "index.android.bundle",
        entryFile      : "index.js",
        bundleInDebug  : true,
        bundleInRelease: true,
        root           : "../../",
        nodeExecutableAndArgs: ["node","--expose-gc","--max_old_space_size=2048"],  //  追記
]
```