70002


[haskell - Docker Hub](https://hub.docker.com/_/haskell) に

>
[code]

>     Dockerize an application using stack:
>  
>     FROM haskell:8
>     RUN stack install pandoc pandoc-citeproc
>     ENTRYPOINT ["pandoc"]
>  
[/code]

とあるので、これはDockerfileに記載するんだなと推測して、Dockerfileを作り上記コードを記述しました。  
そして下記を実行するとエラーになりました。

[code]

    % docker build . -t hoge
    Sending build context to Docker daemon   5.12kB
    Step 1/3 : FROM haskell:8
     ---> 28d6a90e41e2
    Step 2/3 : RUN stack install pandoc pandoc-citeproc
     ---> Running in 8ad45a57c741
    Writing implicit global project config file to: /root/.stack/global-project/stack.yaml
    Note: You can change the snapshot via the resolver field there.
    Using latest snapshot resolver: lts-16.12
    No compiler found, expected minor version match with ghc-8.8.4 (x86_64-tinfo6) (based on resolver setting in /root/.stack/global-project/stack.yaml).
    To install the correct GHC into /root/.stack/programs/x86_64-linux/, try running "stack setup" or use the "--install-ghc" flag. To use your system GHC installation, run "stack config set system-ghc --global true", or use the "--system-ghc" flag.
    The command '/bin/sh -c stack install pandoc pandoc-citeproc' returned a non-zero code: 1
    
[/code]

上記エラーに

[code]

    To install the correct GHC into /root/.stack/programs/x86_64-linux/, try running "stack setup" or use the "--install-ghc" flag.
    
[/code]

とあるので、 `stack setup` または なんのフラグか知りませんが、 `--install-ghc`
を使用してみればいいのかもしれないですが、公式に書いてあるとおりやって駄目ならそもそもの段階で間違ってそうなので、何が間違ってるのかわかりませんので、`stack
setup`等は試してません。何がいけないのでしょうか？

本当にやりたいことは、ランダムに関するパッケージをインストールしたいんですが、まずは公式の言う通り試しています。

[stack setup: "expected minor version match with ghc-3.10.7" · Issue #1903 ·
commercialhaskell/stack](https://github.com/commercialhaskell/stack/issues/1903)
に関連しそうなものがありましたが、Dockerの話ではなさそうですし、そもそもstackを今はじめてつかうので、前提知識がなにもなくほとんど理解できません。


CC BY-SA 4.0
2020-08-31T00:21:02.613
70001
2020-09-09T12:31:03.530
2020-08-31T00:36:04.747
9008
9008
question
docker haskell
No compiler found, expected minor version match with ghc-8.8.4


> 公式に書いてあるとおりやって駄目ならそもそもの段階で間違ってそうなので、

これは恐らく公式がおかしいですね...
推測ですが作った当時サンプルコードが動いていたとすれば、stackの仕様変更に追いついていないのではないかと思われます（あるいは、書いた人が現在のHaskell固有のややこしい事情をわかっていないか）。  
Docker Official
ImageはHaskell関係者（もちろん、stackの関係者ですらない）が主にメンテナンスしているので追従が必ずしも早いとは言えないです。

それに、仮にHaskellに近い人が主にメンテナンスしていたとしても、このドキュメント自体がテストされているわけでもない限り、ドキュメントにおけるミスは発生し得ます（残念ながら、特に我々Haskellコミュニティーは人不足なので...）。

ドキュメントのままコピペで行うなら、手元で試した限り、cabalを使った方法はうまくいくようです。

[code]

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

stackとcabalの役割の違いは、 **この質問に関する限りで単純化して**
いうと、stackはいろいろなバージョンのGHCをインストールして切り替えるのをサポートするけど、cabalはそれはしてくれません。

しかしこのDockerイメージにはすでにGHCも決まったバージョンのものがインストールされてますし、GHCの使い分けをDockerに委ねるのであれば、敢えてstackにこだわる必要もないのではないでしょうか。

stackで行う方法も試しましたが、どうもstackからインストール済みのGHCをうまく見られなくなってしまっているようなので、ここでは割愛します（後で気が向いたら調べてPull
requestを送ります）。  
一応、`--install-ghc`オプションを使えばできるようですが、余分にGHCをインストールすることになってしまうので、あまりおすすめしません。  
それなら他のOSのイメージでstackをインストールしてから入れるのと大して変わらないからです。

※余談:
多分私や他のHaskellerもこの問題にぶち当たっているはずですが、別解がすぐに思いつくので恐らく修正しないままやってしまっているのだと思われます。すみません...。  
なので報告ありがとうございます！


CC BY-SA 4.0
2020-08-31T00:56:58.383
70002
2020-08-31T00:56:58.383
8007
70001
answer


いろいろ追加で調査して別の方法がわかったので、別の回答とします。  
元の回答のようにcabalを使った解決策でも十分ですが、やっぱりstackを利用したいという場合は参考にしてください。  
ここで言いたいことは要するに「Considerations for Stack」で言っていることの解説ですが、具体的にどう直せばいいかも付け加えておきます。

元のサンプルコードのように、stack.yamlなどの設定が成されていない状態で`stack install
pandoc`を実行すると、次の処理を行います:

  1. 最も新しいバージョンのLTS Haskell（「このバージョンのパッケージとこのバージョンのGHCの組み合わせならコンパイルできる！」というものを集めたリスト）を[Stackage](https://www.stackage.org/)から取得する。
  2. LTS Haskellではバージョン毎に利用するGHCのバージョンが決まっているので、該当するGHCがインストール済みかチェックする。

このとき、該当するGHCがインストールされていなかった場合に、件のエラーが出る、というわけです。

で、なんで該当するGHCがインストールされていなかったのかというと、最新のLTS
Haskellに対応するバージョンのGHCと、実際に`haskell:8`のイメージにインストールされている（ver.
8系で最新の）GHCのバージョンが食い違っていたからです。  
前者は2020年9月9日時点でLTS Haskellがver. 16.13でGHC 8.8.4, `haskell:8`に入っているGHCがver.
8.10.2となっています。  
LTS
Haskellはたくさんのパッケージがビルドできるようになったことを確認してから最新のGHCに追従するので、このように最新のGHCのバージョンに追いつかないことがしばしばあります。

なので直すには、例えば次のように書いて、最新のLTS Haskellが必要とするGHCのバージョンにあったイメージを使うようにしましょう:

[code]

    FROM haskell:8.8
    RUN stack install pandoc pandoc-citeproc
    ENTRYPOINT ["pandoc"]
    
[/code]

stackの`--resolver`オプションで使用するLTS Haskellのバージョンを明示すると、より確実です:

[code]

    FROM haskell:8.8
    RUN stack --resolver=lts-16.13 install pandoc pandoc-citeproc
    ENTRYPOINT ["pandoc"]
    
[/code]

各LTS Haskellに対応するGHCのバージョンについては、 Stackageのウェブサイト <https://www.stackage.org/>
をご覧ください。

なお、「Considerations for Stack」への案内が不十分なことについてはPull requestしておきました。  
<https://github.com/docker-library/docs/pull/1794>


CC BY-SA 4.0
2020-09-09T12:31:03.530
70258
2020-09-09T12:31:03.530
8007
70001
answer