以下
ポイントとしては、
- 日本語化している
- SSHサーバが起動している
- Miniconda + conda-forge リポジトリを利用している
- Jupyter Lab に Rubyカーネルが追加されている
- Jupyter Lab に すぐに Perlカーネルを追加できる
セキュリティ的にはいろいろNGかと。
Dockerfile
FROM ubuntu
# 管理ユーザ名
ARG user="[管理ユーザ名]"
# 管理ユーザパスワード
ARG pass="[管理ユーザ名のパスワード]"
# パッケージのインストール時に警告を出さない
ENV DEBIAN_FRONTEND=noninteractive \
DEBCONF_NOWARNINGS=yes
# rootにパスワードを設定
RUN echo "root:[rootパスワード]" | chpasswd \
\
# パッケージのインストール
&& apt-get update -y \
&& apt-get upgrade -y \
&& apt-get install -y \
cpanminus \
curl \
git \
less \
libczmq-dev \
libffi-dev \
libtool \
libzmq3-dev \
locales \
make \
openssh-server \
perl \
ruby \
ruby-dev \
sudo \
tzdata \
vim \
wget \
&& apt-get clean -y \
&& rm -rf \
/var/lib/apt/lists/* \
/var/cache/apt/* \
/usr/local/src/* \
/tmp/* \
\
# 日本語環境の設定
&& locale-gen ja_JP.UTF-8 \
&& echo "export TZ=Asia/Tokyo" > /etc/profile.d/ja_tokyo.sh \
&& echo "export LANG=ja_JP.UTF-8" >> /etc/profile.d/ja_tokyo.sh \
&& echo "export LANGUAGE=ja_JP:ja" >> /etc/profile.d/ja_tokyo.sh \
\
# SSHサーバの設定
&& mkdir /var/run/sshd \
&& echo "PermitRootLogin yes" >> /etc/ssh/sshd_config.d/root_pwd.conf \
&& echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config.d/root_pwd.conf \
&& echo "UseDNS no" >> /etc/ssh/sshd_config.d/root_pwd.conf \
\
# Minicondaのインストール
&& curl -LO https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& bash ./Miniconda3-latest-Linux-x86_64.sh -bfp /opt/miniconda \
&& rm -f ./Miniconda3-latest-Linux-x86_64.sh \
&& echo 'PATH="/opt/miniconda/bin:$PATH"' >> /etc/profile.d/miniconda.sh \
\
# Pythonモジュールをcondaでインストール
&& . /etc/profile.d/miniconda.sh \
&& conda config --add channels conda-forge \
&& conda config --remove channels defaults \
&& conda install -y python=3.9 \
&& conda update -y conda \
&& conda update -y --all \
&& conda install -y \
imageio \
ipywidgets \
jupyterlab \
matplotlib \
numpy \
nodejs \
openpyxl \
pandas \
scikit-learn \
scipy \
seaborn \
xeus-python \
&& conda clean -y --all \
\
# condaでインストールできないモジュールをpipでインストール
&& python -m pip install \
japanize-matplotlib \
mglearn \
&& rm -rf /root/.cache \
\
# JupyterLabの設定
&& mkdir /etc/jupyter \
&& echo "c = get_config()" >> /etc/jupyter/jupyter_notebook_config.py \
&& echo "c.NotebookApp.allow_remote_access = True" >> /etc/jupyter/jupyter_notebook_config.py \
&& echo "c.NotebookApp.allow_root = True" >> /etc/jupyter/jupyter_notebook_config.py \
&& echo "c.NotebookApp.ip = '0.0.0.0'" >> /etc/jupyter/jupyter_notebook_config.py \
&& echo "c.NotebookApp.open_browser = False" >> /etc/jupyter/jupyter_notebook_config.py \
&& echo "c.NotebookApp.port = 8888" >> /etc/jupyter/jupyter_notebook_config.py \
&& echo "c.NotebookApp.token = ''" >> /etc/jupyter/jupyter_notebook_config.py \
&& echo "c.LabBuildApp.minimize = False" >> /etc/jupyter/jupyter_notebook_config.py \
\
# JupyterLabの拡張機能のインストール
&& . /etc/profile.d/miniconda.sh \
&& jupyter labextension install \
@jupyterlab/debugger \
@jupyterlab/toc \
&& jupyter labextension update --all --minimize=False \
&& jupyter lab build --minimize=False \
\
# JupyterにRubyカーネルを追加
&& gem install \
cztop \
iruby \
&& iruby register --force \
\
# JupyterにPerlカーネルを追加
# (これだけでは追加できない, コンテナ内で iperl notebook を初回のみ実行することが必要)
&& cpanm Devel::IPerl --notest \
\
# ユーザ作成
&& adduser -q --gecos "" --disabled-login ${user} \
&& usermod -aG sudo ${user} \
&& echo "${user}:${pass}" | chpasswd
# 作業ディレクトリ
WORKDIR /root/
# 使用ポート
EXPOSE 22 8888
# SSHサーバを起動する
CMD ["/usr/sbin/sshd", "-D"]
Dockerコマンドの例 (Dockerfileのあるディレクトリで実行)
# イメージ作成
docker image build --tag ubuntu/py/sshd:20210328 .
# コンテナをバックグラウンドで起動
docker container run --rm -d --name ubuntu_py_sshd -h ubuntu -p 33322:22 -p 38888:8888 ubuntu/py/sshd:20210328
# コンテナにログイン
docker container exec -it ubuntu_py_sshd bash --login
# JupyterにPerlのカーネルを追加する(初回1回のみ, 正常にrunningしているのを確認を終了)
iperl notebook
# JupyterLabを起動
jupyter lab --no-browser
# コンテナを停止して削除
docker container stop ubuntu_py_sshd