21
18

More than 3 years have passed since last update.

Docker + Haskell の Hello Worldビルド

Last updated at Posted at 2020-02-24

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つしか作りませんが、
今後の拡張を考えたつくりにはしておきます。
常にクセづけておくことで、迷うことがなくなります。

.env
COMPOSE_PROJECT_NAME=haskell-docker-starter

Haskellビルド用コンテナ

docker-compose.yml
version: '3'
services:

  haskell:
    build: ./haskell
    container_name: '${COMPOSE_PROJECT_NAME}-haskell'
    tty: true
    volumes:
      - "../src/haskell:/opt/src"
Dockerfile
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 がソースコードのようです。

Lib.hs
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

ありがとうございます。

21
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
18