JupyterLab + Poetry + Docker環境で、Elixirを実行する(Elixirライブラリも使える)


この記事は、「fukuoka.ex Elixir/Phoenix Advent Calendar 2020」22日目の記事です。
きのうは@GKBRさんの「Hello! After World!! Serverless - (第0章)」でした!

概要

JupyterLabで、Python 以外の開発言語も実行できるようにする。

  • 実行環境の構築はDockerで行い、Pythonバージョン及びライブラリ管理はPoetryで行います。
  • Poetryでは仮想環境の構築はスキップします。(Dockerコンテナの構築やってるので)
  • 本記事では、Elixirの対話型実行環境「IEx」をJupyterLabで実行します。
    • JupyterカーネルのIElixirを使います。

後述もしますが、JupyterLabではコマンドの実行結果をそのままファイル形式で保存できます。
そのため、例えばElixirならIEx実行コマンドのコード管理にも役立てられる、ということがJupyterLabを実行するメリットのひとつです。

実行環境

  • MacOS
  • Docker (docker-compose)

環境構築 & コード

  • 任意のプロジェクト名でディレクトリを作ります
  • ディレクトリ直下に、以下の3ファイルを用意します

Dockerfile

Dockerfile
FROM python:3.8.6-slim

COPY pyproject.toml ./

ENV PYTHONUNBUFFERED=1 \
  ERLANG_PACKAGER_VERSION=2.0

RUN apt-get update -y && \
  apt-get upgrade -y && \
  apt-get install -y \
  build-essential \
  curl \
  git \
  inotify-tools \
  libsqlite3-dev \
  libzmq3-dev \
  sudo \
  vim \
  wget

# Install: pip & poetry
RUN pip install --upgrade pip
RUN pip install poetry
RUN poetry config virtualenvs.create false && \
  poetry install

# Install: Erlang
RUN wget https://packages.erlang-solutions.com/erlang-solutions_${ERLANG_PACKAGER_VERSION}_all.deb
RUN dpkg -i erlang-solutions_${ERLANG_PACKAGER_VERSION}_all.deb
RUN apt-get update && apt-get install -y esl-erlang
RUN rm erlang-solutions_${ERLANG_PACKAGER_VERSION}_all.deb
RUN which erl

# Install: Elixir
RUN apt-get update && apt-get install elixir
RUN which elixir
RUN mix --version && which mix

RUN mix local.hex --force
RUN mix local.rebar --force

RUN apt-get clean

# Install: IElixir
RUN git clone https://github.com/pprzetacznik/IElixir.git
WORKDIR IElixir
RUN mix deps.get
RUN mix test
RUN MIX_ENV=prod mix compile
RUN ./install_script.sh

CMD ["iex"]

docker-compose.yml

docker-compose.yml
version: "3"
services:
  eda:
    build: ./
    user: root
    volumes:
      - ./:/app
    working_dir: /app
    tty: true
    ports:
      - "8890:8890"
    command:
      jupyter lab
        --port=8890
        --ip=0.0.0.0
        --allow-root
        --NotebookApp.token=''
        --no-browser
  • ポート番号8890の部分はお好みでどうぞ
    • 本記事では8890で進めていますが、JupyterLabのデフォルトは8888ポート

pyproject.toml

pyproject.toml
[tool.poetry]
name = "jupyterlab_docker"
version = "0.2.0"
description = "Environment JupyterLab Poetry docker-compose"

authors = ["im"]

[tool.poetry.dependencies]
python = "^3.8"

jupyterlab = "*"
numpy = "*"
matplotlib = "*"
japanize-matplotlib = "*"

[tool.poetry.dev-dependencies]
pytest = "*"

[build-system]
requires = ["poetry_core>=1.0.10"]
build-backend = "poetry.masonry.api"
  • Pythonのライブラリ追加や削除は、[tool.poetry.dependencies]内の設定でお好みでどうぞ(本記事では説明対象のスコープ外とします)

実行

terminal
$ cd hogehoge(ファイルを用意したディレクトリ)

$ docker-compose build

$ docker-compose up

コンテナが起動したら、ブラウザでhttp://localhost:8890を確認します。

Elixirカーネルを追加することができました。

Elixirのコマンド実行もできています。

JupyterLabでの実行結果をファイルで保存できるので便利ですね!(.ipynb

(追記)ElixirのライブラリをJupyterLabで使う

Boyle.install({:math, "~> 0.5.0"})のようにコードを書くことで、ライブラリの使用が可能となります。

おわりに

JupyterLab + Poetry + Docker環境でElixirを実行する環境を構築して、実際にElixirのコマンドを実行しました。

なお、本記事ではElixir言語を取り上げていますが、他言語でのJupyterLab実行環境構築もおなじようなノリでできるので、本記事でもし参考になる部分などがあれば参考にされて、試してみられるとよいと思います!

また、今回構築したJupyterLab + Poetry + Docker環境は、ふつうにPython用として使うことももちろん可能ですので、そちらのコンテキストでもよろしかったらどうぞ。

明日の「fukuoka.ex Elixir/Phoenix Advent Calendar 2020」は、@emadurandalさんです。お楽しみに!

お知らせ

kokura.ex

北九州小倉のElixirコミュニティ「kokura.ex」は、福岡市で2017年から人気を博しているElixirコミュニティ「fukuoka.ex」が小倉にブランチした、新生Elixirコミュニティです。

fukuoka.ex同様、

  • 「高速処理性能」と「高い開発効率性」を両立できるプログラミング言語「Elixir」
  • そのWebアプリケーションフレームワーク「Phoenix」

を、北九州を起点として広め、ワイワイ盛り上げていくコミュニティです。
これから先端技術をやりたい方や、最新のプログラミングを学びたい方、未来に向けてITに強くなりたい方など、技術への興味レベルが高い方や、プログラミングに関心が高い方のご参加を歓迎します。
オンラインでのもくもく勉強会を、毎月ペースで開催しておりますのでぜひどうぞ。
(はじめてElixirに触れる方も、お気軽にご参加ください!)

  • イベントページ fukuoka.ex
    • connpassイベント一覧より、kokura.exのページをご覧いただけます

Elixirアドベントカレンダー

Elixir Advent Calendar 2020」もありますので、こちらもぜひどうぞ。