70019


[No compiler found, expected minor version match with
ghc-8.8.4](https://ja.stackoverflow.com/questions/70001/no-compiler-found-
expected-minor-version-match-with-ghc-8-8-4)とは直接関係ないと思いますが、続き的な意味合いの質問です。

Dockerfileに

[code]

    FROM haskell:8
    RUN cabal update && cabal install pandoc pandoc-citeproc
    ENTRYPOINT ["pandoc"]
    
[/code]

と書いて実行したころ下記のようなエラーがでました、ログが大量なので、エラー箇所以外は省略します。

[code]

    cabal: Failed to build pandoc-types-1.21 (which is required by
    pandoc-citeproc-0.17.0.2 and exe:pandoc from pandoc-2.10.1). The build process
    was killed (i.e. SIGKILL). The typical reason for this is that there is not
    enough memory available (e.g. the OS killed a process using lots of memory).
    
    The command '/bin/sh -c cabal update && cabal install pandoc pandoc-citeproc' returned a non-zero code: 1
    
[/code]

実行方法は下記です。

[code]

    docker build . -t hoge
    
[/code]

おそらくDockerのためのメモリが足りないんじゃないかと思うのですが  
[Dockerコンテナで利用できるリソースや権限を制限する（Dockerの最新機能を使ってみよう：第3回） |
さくらのナレッジ](https://knowledge.sakura.ad.jp/5118/)

引用:

>
[code]

>     -m、–memory メモリ容量を制限する  
>     –memory-reservation メモリ容量を緩く制限する  Docker 1.9以降
>     –kernel-memory  カーネルが利用できるメモリ量を制限する Docker 1.9以降
>     –memory-swap  メモリ＋SWAPの総量を制限する  Docker 1.5以降
>     –memory-swappiness= コンテナ内でのスワップメモリ利用頻度を調整する Docker 1.8以降
>     –oom-kill-disable OOM Killerを無効化する  Docker 1.7以降
>     –oom-score-adj  コンテナ自体のOOM Killer優先度を調整する Docker 1.10以降
>     –shm-size /dev/shmに割り当てる容量を指定する Docker 1.10以降
>  
[/code]

フラグがいっぱいあります。どれに何を指定すればいいんでしょうか？

Docker for Mac を使用しています。


CC BY-SA 4.0
2020-08-31T01:42:38.860
70003
2020-08-31T13:12:11.543
2020-08-31T13:12:11.543
754
9008
question
macos docker haskell
The typical reason for this is that there is not enough memory available (e.g. the OS killed a process using lots of memory) のエラーが発生する


私はDockerには詳しくないので、イメージに割り当てるメモリーを増やす方法はわかりませんが、このエラーについてはもっと簡単に回避する方法があります。  
それは問題が発生したパッケージのみを単独で、使用するCPUの数を制限しながらビルドする方法です。  
つまりこの場合:

[code]

    # ライブラリーのinstallをするときは--libオプションを付けてください。
    cabal install --lib -j1 pandoc-types
    
[/code]

です。  
無事ビルドが完了したら再び`cabal install pandoc pandoc-citeproc`を実行します。

結果、Dockerfileの全体は次のように変わるでしょう。

[code]

    FROM haskell:8
    RUN cabal update && cabal install --lib -j1 pandoc-types && cabal install pandoc pandoc-citeproc
    ENTRYPOINT ["pandoc"]
    
[/code]

この方法でもうまくいかない場合は、残念ですがお使いのマシンのメモリーの量を増やした方がいいのかも知れません。Dockerの設定でなんとかなる問題なのかはちょっとわかりません。

関連: <https://haskell.e-bigmoon.com/posts/2017/12-31-travis-out-of-memory.html>
こちらはstackを使った方法ですが、理屈は同じです。

...と、ここまで回答した後で恐縮ですが、前回の質問と目的が変わっていないのならば、「本当にやりたいことは、ランダムに関するパッケージをインストール」したいのですよね？  
ここに書いてあるDockerfileは、pandocというHaskell製の著名なコマンドをインストールするためのものです。  
なので、とりあえずrandomパッケージとかを使いたいだけなら、敢えてpandocをインストールする必要はないでしょう（すみません、前の質問の時点でそう回答するべきでしたね...）。  
pandocは非常に依存パッケージが多く、ビルドに時間のかかるものです。  
本当にpandocが入ったイメージを使いたいだけならビルド済みのイメージを探した方が効率がいいでしょう（ちゃんとメンテされてるものがあるか怪しいですが）。  
サンプルコードにそう書いてあるのは、おそらく典型的な用途として紹介しているだけじゃないかと思われます。


CC BY-SA 4.0
2020-08-31T02:20:45.860
70004
2020-08-31T02:20:45.860
8007
70003
answer


<https://blog.pinkumohikan.com/entry/increase-memory-limit-of-docker-for-mac>

こちらにあるように、 mac の docker にはメモリ制限がかかっています。これは、 mac 上で動かす linux
カーネル(VM)に対してかかる制限であるという自分の認識です。

メモリ上限を上げると、問題は解消しませんか？


CC BY-SA 4.0
2020-08-31T13:09:02.770
70019
2020-08-31T13:09:02.770
754
70003
answer