17言語をぶち込んだJupyter LabのDockerイメージを作ってみた

いろんなプログラミング言語をちょっとかじってみるのに便利かなと思って、Jupyter Lab のDocker イメージを作ってみた。

![launcher.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/859b5e19-00dc-05a1-26b3-92134ad70a6f.png)

- [HeRoMo/jupyter\-langs](https://github.com/HeRoMo/jupyter-langs)
- [hero/jupyter\-langs \- Docker Hub](https://hub.docker.com/r/hero/jupyter-langs)

欲張ったせいで約10GB（圧縮して4GB）以上もあるイメージになってしまった。

## TL;DR

- プログラミング言語の学習用にJupyter LabのDockerイメージを作った
- 17言語をサポートしている
- `docker-compose up` ですぐ使える
- `linux/amd64`,`linux/arm64` をサポート
- イメージが大きくなってしまったので容量制限のない速いネットワークでPullしたほうがよい

## サポートしている言語

サポートしている言語は次の通り。

|Languages|Version|jupyter kernel|
|---|--:|---|
| [Python](https://www.python.org/) |3.10.0|[IPython](https://ipython.org/)|
| [C#](https://docs.microsoft.com/en-us/dotnet/csharp/)(.Net6)| 10.0 | [.NET Interactive](https://github.com/dotnet/interactive)|
| [Elixir](https://elixir-lang.org/) |1.12.3|[ierl](https://github.com/filmor/ierl)|
| [Erlang](https://www.erlang.org/) |OTP 24.0.4|[ierl](https://github.com/filmor/ierl)|
| [F#](https://fsharp.org/)(.Net6) | 6.0.9 | [.NET Interactive](https://github.com/dotnet/interactive)|
| [Go](https://golang.org/) |1.19.1|[Gophernotes](https://github.com/gopherdata/gophernotes)|
| [Java](https://openjdk.java.net/) |18.0.2.1|[Ganymede](https://github.com/allen-ball/ganymede)|
| JavaScript([Node.js](https://nodejs.org/en/))|18.8.0|[tslab](https://github.com/yunabe/tslab)|
| [Julia](https://julialang.org/) |1.8.2|[IJulia](https://github.com/JuliaLang/IJulia.jl)|
| [Kotlin](https://kotlinlang.org/) |1.8.0|[jupyter\-kotlin](https://github.com/ligee/kotlin-jupyter)|
| [Powershell](https://docs.microsoft.com/en-us/powershell/)(.Net6) | 7.2.6 | [.NET Interactive](https://github.com/dotnet/interactive)|
| [R](https://www.r-project.org/) |4.1.3|[IRKernel](http://irkernel.github.io/)|
| [Ruby](https://www.ruby-lang.org/) | 3.1.2 |[IRuby](https://github.com/SciRuby/iruby)|
| [Rust](https://www.rust-lang.org/) |1.64.0|[EvCxR Jupyter Kernel](https://github.com/google/evcxr/tree/master/evcxr_jupyter)|
| [Scala](https://www.scala-lang.org/) |2.13.8|[almond](https://github.com/almond-sh/almond)|
| Sparql||[SPARQL kernel](https://github.com/paulovn/sparql-kernel)|
| [Typescript](https://www.typescriptlang.org/) | 4.8.2 | [tslab](https://github.com/yunabe/tslab)|

* Python では [Plotly](https://plotly.com/python/)と Dash, [leaflet](https://ipyleaflet.readthedocs.io/en/latest/) が利用できる。
* R と Julia でも [Plotly](https://plotly.com/python/) は利用できる。

なるべく新しいバージョンが使えるようにした。
が、*Jupyter kernel*によってバージョンが固定されてしまう言語もあり、最新バージョンになってないものもある。

Pythonを学ぶ動機としては機械学習があると思うが、そういう用途には無料でGPUも利用できる[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja#scrollTo=ol93N5hsyNG0)を使うことをおすすめする。

このイメージはあくまで言語学習用途を想定している。

## 言語の追加・入れ替え

[5\.5\.0](https://github.com/HeRoMo/jupyter-langs/releases/tag/5.5.0) で.NETのC#、F#、Powershellを追加した。@mototoke さんPRありがとうございました。
[4\.0\.0](https://github.com/HeRoMo/jupyter-langs/releases/tag/4.0.0) では初めて言語の入替を行った。
[3\.2\.0](https://github.com/HeRoMo/jupyter-langs/releases/tag/3.2.0) までは Groovy をサポートしていたが、4.0.0で落とした。理由はJVM言語で使っていたJupyterカーネル[BeakerX](http://beakerx.com/)の利用をやめたため。Python3.8にアップデートしようとすると、BeakerXが動かず、共存できなかった。で、Pythonのアップデートを優先して、BeakerXを切った。
Java,Kotlin,Scalaについては他にカーネルがあったが、Groovyにはなかったので落とすことなった。
まあ、JVM言語の中ではマイナーだし（参考:[Google Trend](https://trends.google.co.jp/trends/explore?date=today%205-y&geo=JP&q=%2Fm%2F02js86,%2Fm%2F0_lcrx4,%2Fm%2F091hdj)）、今後自分で使うことはないだろうと[^groovy]。
代わりに、見聞きすることが増えてきた[Julia](https://julialang.org/)を追加した。

[^groovy]: Groovyはオワコンというわけではなく、開発はApache Software Foundationのもとで継続しており、2020年2月にはバージョン3.0.0がリリースされている。

## 使い方

初回はDockerイメージをPullする。サイズが10GB弱もあるので容量制限のない速いネットワークでの作業をおすすめする[^size]。
次のコマンドを実行すると、コンテナが起動する。

[^size]: バージョンを重ねる毎にサイズが増え、3.2.0では15.2GBにもなってしまった。流石にまずいと思って4.0.0ではminiconda3に切り替えて、9.84GBとなり、サイズを減らすことに成功した。

```bash
$ mkdir your/jupyter/project/dir
$ cd your/jupyter/project/dir
$ wget https://raw.githubusercontent.com/HeRoMo/jupyter-langs/master/docker-compose.yml
$ docker-compose up
```

コンテナが立ち上がったら http://localhost:8888/ にアクセスすると Jupyter Lab が開く

## リポジトリ

作ったノートはgitで管理してリポジトリにプッシュしておくと、Webでいつでも参照できて便利。

GithubもGitlabもノートをjupyter同様にレンダリングしてくれる。
Gitlabのほうがレンダリングが圧倒的に速くてストレスが少ないのでおすすめ。

ただ、コードのシンタックスハイライトはGithubの方が見やすい。

## あとがき

作るのに思ったより時間がかかってしまったので、それぞれの言語をローカルにインストールしたほうが早かったような気がする。
が、今後はこれでコンテナを起動するだけになるかな。

Dockerイメージのサイズが大きくなりすぎてしまっていたのを幾分改善でできたのは良かった。
メンテナンスしやすいように各言語のインストール処理を分けている状況では更に大きく減らすのは難しいな。。。