質問: haskell - Docker Hub に > > > ``` > Dockerize an application using stack: > > FROM haskell:8 > RUN stack install pandoc pandoc-citeproc > ENTRYPOINT ["pandoc"] > > ``` > > とあるので、これはDockerfileに記載するんだなと推測して、Dockerfileを作り上記コードを記述しました。 そして下記を実行するとエラーになりました。 ``` % 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 ``` 上記エラーに ``` To install the correct GHC into /root/.stack/programs/x86_64-linux/, try running "stack setup" or use the "--install-ghc" flag. ``` とあるので、 `stack setup` または なんのフラグか知りませんが、 `--install-ghc` を使用してみればいいのかもしれないですが、公式に書いてあるとおりやって駄目ならそもそもの段階で間違ってそうなので、何が間違ってるのかわかりませんので、`stack setup`等は試してません。何がいけないのでしょうか? 本当にやりたいことは、ランダムに関するパッケージをインストールしたいんですが、まずは公式の言う通り試しています。 stack setup: "expected minor version match with ghc-3.10.7" · Issue #1903 · commercialhaskell/stack に関連しそうなものがありましたが、Dockerの話ではなさそうですし、そもそもstackを今はじめてつかうので、前提知識がなにもなくほとんど理解できません。
回答: > > 公式に書いてあるとおりやって駄目ならそもそもの段階で間違ってそうなので、 > > > これは恐らく公式がおかしいですね... 推測ですが作った当時サンプルコードが動いていたとすれば、stackの仕様変更に追いついていないのではないかと思われます(あるいは、書いた人が現在のHaskell固有のややこしい事情をわかっていないか)。 Docker Official ImageはHaskell関係者(もちろん、stackの関係者ですらない)が主にメンテナンスしているので追従が必ずしも早いとは言えないです。 それに、仮にHaskellに近い人が主にメンテナンスしていたとしても、このドキュメント自体がテストされているわけでもない限り、ドキュメントにおけるミスは発生し得ます(残念ながら、特に我々Haskellコミュニティーは人不足なので...)。 ドキュメントのままコピペで行うなら、手元で試した限り、cabalを使った方法はうまくいくようです。 ``` FROM haskell:8 RUN cabal update && cabal install pandoc pandoc-citeproc ENTRYPOINT ["pandoc"] ``` stackとcabalの役割の違いは、**この質問に関する限りで単純化して**いうと、stackはいろいろなバージョンのGHCをインストールして切り替えるのをサポートするけど、cabalはそれはしてくれません。 しかしこのDockerイメージにはすでにGHCも決まったバージョンのものがインストールされてますし、GHCの使い分けをDockerに委ねるのであれば、敢えてstackにこだわる必要もないのではないでしょうか。 stackで行う方法も試しましたが、どうもstackからインストール済みのGHCをうまく見られなくなってしまっているようなので、ここでは割愛します(後で気が向いたら調べてPull requestを送ります)。 一応、`--install-ghc`オプションを使えばできるようですが、余分にGHCをインストールすることになってしまうので、あまりおすすめしません。 それなら他のOSのイメージでstackをインストールしてから入れるのと大して変わらないからです。 ※余談: 多分私や他のHaskellerもこの問題にぶち当たっているはずですが、別解がすぐに思いつくので恐らく修正しないままやってしまっているのだと思われます。すみません...。 なので報告ありがとうございます!