docker
Elm

elm-replをdockerで動かして、Elm入門ハンズオンを試してみた

動機

しばらくElmに触れられなかったところ、文法など忘れてしまっていた。
そんな呟きをしたら以下のスライドを教えていただいたので挑戦。
Elm入門ハンズオン

動作環境

  • windows10
  • vagrant2.1.1
  • virtualbox5.2.12
  • ubuntu-18.04
  • Docker version 18.05.0-ce, build f150324
  • docker-compose version 1.21.2, build a133471

elm環境作成

ディレクトリ構成は以下。

- bin
  - repl.sh
- docker
  - elm
    - Dockerfile
    - ensure_libsysconfcpus.sh
    - replace_elm_make.sh
  - docker-compose.yml
docker/elm/Dockerfile
FROM node:10.5.0

# Add Tini nodeはpid 1で動くようにできていないのでpid1でtiniを動かす。
# http://ngzm.hateblo.jp/entry/2017/08/22/185224
ENV TINI_VERSION v0.15.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]


# コンテナ上の作業ディレクトリ作成
WORKDIR /app

# 後で確認出来るようにpackage.jsonを作成
RUN npm init -y

# elmインストール
RUN yarn add  elm

# elm 高速化
ADD ./ensure_libsysconfcpus.sh /app/ensure_libsysconfcpus.sh
ADD ./replace_elm_make.sh /app/replace_elm_make.sh

RUN /app/ensure_libsysconfcpus.sh
RUN /app/replace_elm_make.sh

# test
RUN yarn add --dev elm-test

# 追加モジュール
RUN yarn elm package install elm-lang/core -y

# package.json設定
RUN sed -i -e "s/\(\"scripts\": {\)/\1\n    \"repl\": \"elm-repl\", /" /app/package.json
docker/docker-compose.yml
version: '3'
services:
  elm:
    build: ./elm
    volumes:
      - cache1:/app/elm-stuff
volumes:
  cache1:
bin/repl.sh
#!/bin/bash

# 変数設定
bin_dir=$(cd $(dirname $0) && pwd)
composeFile=${1:-"docker-compose.yml"}
containerName=${2:-"elm"}

# docker-composeの起動
cd $bin_dir/../docker && docker-compose -f $composeFile run $containerName /bin/bash -c "yarn repl"

(この時点のソース)

ハンズオンを試す

./bin/repl.shを実行して、replを起動。スライドを順番に試した。
リストの扱いが、特に勉強になった。
モジュールの解説は、そのうち追加されるのだろうか。
elmの基本的なことを少し学べたと思う。

参考

Elm入門ハンズオン
Docker で node.js を動かすときは PID 1 にしてはいけない