この記事は、「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
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
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
[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]
内の設定でお好みでどうぞ(本記事では説明対象のスコープ外とします)
実行
$ 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の数値計算ライブラリ「Math」も使えますよー📗
— im (@im_miolab) December 22, 2020
`Boyle.install({所望のライブラリ})` したら、
(mixファイルの準備とかimport hogeとかしなくても)よしなにやってくれるので便利ですhttps://t.co/hPzaBn8O3H#kokuraex #Elixir #JupyterLab #Python pic.twitter.com/78dlAC21rr
おわりに
JupyterLab + Poetry + Docker環境でElixirを実行する環境を構築して、実際にElixirのコマンドを実行しました。
なお、本記事ではElixir言語を取り上げていますが、他言語でのJupyterLab実行環境構築もおなじようなノリでできるので、本記事でもし参考になる部分などがあれば参考にされて、試してみられるとよいと思います!
- Jupyter kernels ・・・各言語のJupyterカーネル一覧
また、今回構築した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」もありますので、こちらもぜひどうぞ。
- 12月8日の枠に自分も執筆参加してますので、よろしかったらご覧ください!
【Elixir 1.11】Phoenix Framework + DB開発をDockerでやる #1(コンテナ開発環境構築~CRUD実装~テスト)