Dockerの中で Haskell をビルドして、Hello World することがゴールです。
手順をシンプルに書いていきます。
まず Docker と Docker-compose を入れておきます。これは省略します。
Dockerディレクトリを作成
以下のようにファイルを作ります。
./docker
./docker/.env
./docker/docker-compose.yml
./docker/haskell
./docker/haskell/Dockerfile
./src/
./src/haskell
Dockerの設定
Docker全体用の設定
今回はコンテナは1つしか作りませんが、
今後の拡張を考えたつくりにはしておきます。
常にクセづけておくことで、迷うことがなくなります。
COMPOSE_PROJECT_NAME=haskell-docker-starter
Haskellビルド用コンテナ
version: '3'
services:
haskell:
build: ./haskell
container_name: '${COMPOSE_PROJECT_NAME}-haskell'
tty: true
volumes:
- "../src/haskell:/opt/src"
FROM centos:centos7
RUN curl -sSL https://get.haskellstack.org/ | sh
# stackインストール
RUN stack upgrade
RUN stack --version
# stack の初期設定
RUN stack setup
バージョン表示もいれておくと、ビルド時に確かめられて便利です。
Dockerコンテナ作成
cd ./docker
docker-compose build
docker-compose up -d
これで Dockerコンテナが起動します。
docker-compose build せずとも、 up -d だけでもビルド一緒にしてくれているのですが、
それは気を利かせてくれているだけなので、動きを理解するためにも build してみましょう。
Haskell の初期プロジェクト作成
docker exec -it haskell-docker-starter-haskell bash
# 以下 Docker の中
cd /opt/src
stack new sample-project
これにより、
./src/haskell/sample-project
というフォルダができ、中にたくさんのファイル群ができています。
ちなみに Dockerコンテナ内からは、 /opt/src/sample-project でアクセスできます。
sample-project のビルド
初期処理
stack init が必要です。
ホストOS以下のコマンドを実行すれば Docker内で stack init が動作します。
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src && stack init"
ビルド
変更する度に行うビルドです。
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src && stack build"
どこかに実行ファイルができています。
なにかわかったら追記します。
実行
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src/sample-project && stack exec sample-project-exe"
# 出力結果: someFunc
これはなにかのファイルを読んで、実行パスを探してくれているみたいです。
なにかわかったら追記します。
ソースコード編集
./src/haskell/sample-project/src がソースコードのようです。
module Lib
( someFunc
) where
someFunc :: IO ()
someFunc = putStrLn "someFunc"
"someFunc" をとりあえず "Hello World" に変更します。
そして ビルド、実行
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src && stack build"
docker exec haskell-docker-starter-haskell bash -c "cd /opt/src/sample-project && stack exec sample-project-exe"
# 出力結果: Hello World
これでホストOSの環境をいじらずに Haskell をビルド、実行することができました。
github
参考
Stackでやる最速Haskell Hello world! (GHCのインストール付き!)
https://qiita.com/igrep/items/da1d8df6d40eb001a561
ありがとうございます。