#author("2022-01-04T02:50:20+00:00","","")
#mynavi(Pythonメモ)
#author("2023-09-23T11:29:46+09:00","","")
#mynavi(Python覚え書き)
#setlinebreak(on);

* 概要 [#wd12d47f]
#html(<div class="pl20">)
増えてきたノートブックの整理用に Jupyter lab で Python 以外の言語を利用できる環境を構築する。
尚、当記事は Docker での利用を前提とする。
Jupyter lab で Python 以外の言語を利用できる環境を構築する。
尚、当記事では公式の Dockerイメージに Go などの幾つかのカーネルを追加するサンプルを記載する。

#html(</div>)

* 目次 [#k8203827]
#contents
- 関連
-- [[Jupyter Notebook]]

* 利用できる Jupyter kernel [#t95b4f5d]
#html(<div class="pl20">)
対象の言語用のカーネルを追加する事で jupyter でPython 以外の言語を利用する事が出来る。
https://github.com/jupyter/jupyter/wiki/Jupyter-kernels
#html(</div>)

* フォルダ構成 [#ad9bdb4c]
#html(<div class="pl10">)

#html(){{
<table style="border: 1px solid #333">
<tr>
  <td style="line-height: 1.5">
├─ docker-compose.yml<br />
├─ container<br />
│  └─ Dockerfile<br />
└─ work<br />
  </td>
  <td style="padding-right: 20px;">
    <br />
    <br />
    <br />
    ... notebook の保存先<br />
  </td>
</tr>
</table>
<br />
}}

#myterm2(){{
mkdir container
mkdir work
}}

#html(</div>)

* docker-compose.yml の作成 [#q2a7a9b9]

#html(<div class="pl20">)
docker-compose.yml
#mycode2(){{
version: "3"
services:
    jupyter:
        build:
          context: ./container
          args:
            MYTOKEN: abcd1234!
        container_name: my-jupyterlab
        volumes:
          - ./work:/home/jovyan/work
        ports:
          - 8888:8888
}}
#html(</div>)

* Dockerfileの作成 [#jbf7e9e8]
#html(<div class="pl20">)

ベースとなるイメージは公式のものを使用する
https://jupyter-docker-stacks.readthedocs.io/en/latest/
ベースとなるイメージは上記を使用し、これに R、Typescript、Go、Java、Bash 及び PHP のカーネルを追加インストールする。

container/Dockerfile
#mycode2(){{
FROM jupyter/minimal-notebook:lab-4.0.5
#  M1 の Mac book の時は --platform=linux/amd64 を指定
#FROM --platform=linux/amd64 jupyter/minimal-notebook:lab-4.0.5
#FROM jupyter/minimal-notebook:lab-3.6.3
#FROM jupyter/scipy-notebook:lab-3.2.3

#ENV DOCKER_DEFAULT_PLATFORM=linux/amd64

USER root
RUN apt-get update
RUN apt-get install -y build-essential

USER jovyan
RUN mkdir -p $HOME/.local/share/jupyter/runtime \
 && mkdir -p $HOME/.local/share/jupyter/kernels

#--------------------------------------------
# Goインストール
#--------------------------------------------
USER root
#ENV GO_VERSION=1.17.5
ENV GO_VERSION=1.18.10
RUN echo "download go - start" \
 && mkdir /tmp/go && cd /tmp/go \
 && wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz \
 && rm -rf /usr/local/go && tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz \
 && echo "download go - end" \
 && rm -rf /tmp/go

#--------------------------------------------
# Go カーネル
#--------------------------------------------
USER jovyan
ENV GOPATH=$HOME/go
RUN mkdir -p $GOPATH
ENV PATH=$PATH:/usr/local/go/bin
RUN echo "setup go kernel - start" \
 && echo "get kernel - start" \
 && env GO111MODULE=off go get -d -u github.com/gopherdata/gophernotes \
 && cd "$(go env GOPATH)"/src/github.com/gopherdata/gophernotes \
 && env GO111MODULE=on go install \
 && echo "copy go kernel - start" \
 && rm -rf ~/.local/share/jupyter/kernels/gophernotes \
 && cp -R kernel ~/.local/share/jupyter/kernels/gophernotes \
 && echo "copy go kernel - end" \
 && cd ~/.local/share/jupyter/kernels/gophernotes \
 && chmod +w ./kernel.json \
 && sed "s|gophernotes|$(go env GOPATH)/bin/gophernotes|" < kernel.json.in > kernel.json \
 && echo "setup go kernel - end"

#--------------------------------------------
# TypeScript カーネル
#--------------------------------------------
USER jovyan
RUN npm install -g tslab \
 && tslab install --python=python3 \
 && jupyter kernelspec list

#--------------------------------------------
# java インストール
#--------------------------------------------
USER jovyan
RUN mkdir $HOME/openjdk && cd $HOME/openjdk \
  && wget https://download.java.net/java/GA/jdk20.0.2/6e380f22cbe7469fa75fb448bd903d8e/9/GPL/openjdk-20.0.2_linux-x64_bin.tar.gz \
  && tar xzfv openjdk-20.0.2_linux-x64_bin.tar.gz \
  && rm -rf openjdk-20.0.2_linux-x64_bin.tar.gz
ENV PATH=$HOME/openjdk/openjdk-20.0.2/bin:$PATH

#--------------------------------------------
# java カーネル
#--------------------------------------------
USER jovyan
RUN cd /tmp \
  && wget https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip \
  && unzip ijava-1.3.0.zip \
  && python3 install.py --sys-prefix \
  && rm -rf ijava-1.3.0.zip

#--------------------------------------------
# Rustインストール
#--------------------------------------------
USER root
ENV RUST_VERSION=1.72.0
ENV EVCXR_JUPYTER_VERSION=v0.15.1
RUN cd /tmp \
  && wget https://static.rust-lang.org/dist/rust-${RUST_VERSION}-x86_64-unknown-linux-gnu.tar.gz \
  && tar zxfv rust-${RUST_VERSION}-x86_64-unknown-linux-gnu.tar.gz \
  && rust-${RUST_VERSION}-x86_64-unknown-linux-gnu/install.sh \
  && wget https://github.com/evcxr/evcxr/releases/download/${EVCXR_JUPYTER_VERSION}/evcxr_jupyter-${EVCXR_JUPYTER_VERSION}-x86_64-unknown-linux-gnu.tar.gz \
  && tar xzfv evcxr_jupyter-${EVCXR_JUPYTER_VERSION}-x86_64-unknown-linux-gnu.tar.gz \
  && mv evcxr_jupyter-${EVCXR_JUPYTER_VERSION}-x86_64-unknown-linux-gnu/evcxr_jupyter /usr/local/bin/evcxr_jupyter
#RUN cargo install evcxr_jupyter
USER jovyan
RUN evcxr_jupyter --install

#--------------------------------------------
# R インストール
#--------------------------------------------
USER root
RUN apt install -y r-base r-base-dev
RUN echo "install.packages('IRkernel')" >/tmp/install.r \
  && echo "IRkernel::installspec( user = FALSE, sys_prefix = TRUE )" >>/tmp/install.r \
  && R -f /tmp/install.r

#--------------------------------------------
# ホームディレクトリ変更&トークン固定
#--------------------------------------------
USER jovyan
# docker-compose.yml 側で指定した固定トークン
ARG MYTOKEN
RUN mkdir -p $HOME/work
RUN jupyter lab --generate-config \
  && mv $HOME/.jupyter/jupyter_lab_config.py $HOME/.jupyter/jupyter_lab_config.bak \
  && cat $HOME/.jupyter/jupyter_lab_config.bak | awk -v workdir=$HOME/work '{ if ($2=="c.ServerApp.notebook_dir") { print; print "c.ServerApp.notebook_dir = \047"workdir"\047"; print "c.ServerApp.root_dir = \047"workdir"\047"; } else { print;} }' | awk -v mytoken=$MYTOKEN '{ if ($2=="c.ServerApp.token") { print; print "c.ServerApp.token = \047"mytoken"\047" } else { print;} }' > $HOME/.jupyter/jupyter_lab_config.py

#--------------------------------------------
# ポートバインド設定
#--------------------------------------------
EXPOSE 8888/tcp
EXPOSE 8888/udp

#--------------------------------------------
# jupyter lab起動
#--------------------------------------------
CMD ["jupyter", "lab"]
}}

#html(</div>)

* コンテナ作成/起動 [#b71812e0]
#html(<div class="pl20">)
#myterm2(){{
docker run -p 8888:8888 jupyter/scipy-notebook:33add21fab64
docker-compose up --build -d
}}
#html(</div>)

* Token確認 [#va74d4de]
#html(<div class="pl20">)

トークン固定を行わない場合は以下の通りトークンを確認する
#myterm2(){{
docker exec -i my-jupyterlab jupyter lab list

Currently running servers:
http://e43d493977dc:8888/?token=427aea993fdb768ef4f442d0b1cd600f56cf73f30bf8d316 :: /home/jovyan
}}
#html(</div>)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS