pip3ベースでデータサイエンス環境を作るためのDockerfile


やること

データサイエンス用のDockerコンテナといえばjupyter公式が配布しているscipy-notebookがありますが、Dockerfileを見るとcondaベースで書かれています。
しかし、宗教上の理由でcondaを使いたくありません。
そこで、今回はpip3ベースでデータサイエンス用の環境を作るためのDockerfileを書きます。

参考にした記事
Dockerを使って機械学習の環境を作ろうとした話

方針

・ python公式のDocker imageをベースにする
・ pip3を使う
・ 必要なモジュールのみをrequirements.txtから読み込む
google-cloud-bigqueryでBigQueryと繋ぎたいのでCloudSDKを入れる
・ jupyterlab+plotlyで可視化をしたいのでNode.jsを入れる

出来たもの

Dockerfile

# Pythonの3.8をベースにする
# 参考: https://qiita.com/penpenta/items/3b7a0f1e27bbab56a95f
FROM python:latest

USER root

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y sudo \
    && apt-get install -y lsb-release \ # google-cloud-sdkのインストール時に必要
    && pip3 install --upgrade pip

# 作業するディレクトリを変更, なくてもいい
# WORKDIR /home/{適当なユーザー名}

# 予め作成してDockerfileと同じフォルダにあるrequirements.txtをインストール
COPY requirements.txt ${PWD}
RUN pip3 install -r requirements.txt

# Cloud SDKをインストール
# https://cloud.google.com/sdk/docs/downloads-apt-get
RUN export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
    echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
    apt-get update -y && apt-get install google-cloud-sdk -y

# plotlyを使うため、Node.jsをインストール
# https://github.com/nodesource/distributions/blob/master/README.md
RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - \
    && sudo apt-get install -y nodejs

# JupyterLabでplotlyをサポートする
ENV NODE_OPTIONS=--max-old-space-size=4096
RUN jupyter labextension install @jupyter-widgets/[email protected] --no-build \
    && jupyter labextension install [email protected] --no-buil \
    && jupyter labextension install [email protected] --no-build \
    && jupyter lab build
ENV NODE_OPTIONS=

今回インストールするモジュール群をrequirements.txtに書きます。
バージョン固定はお好みで

requirements.txt
numpy
pandas
matplotlib
seaborn
scikit-learn
scrapy
jupyter
plotly
google-cloud-bigquery
jupyterlab

使い方

適当なフォルダの中に上記2ファイルを入れて、そのディレクトリに移動します。
後は以下のコマンドを順に実行すればOK

# Docker imageを作成
docker build --rm -t {Docker imageの名前} .
# Docker Containerを作成
# Dockerの中と外を繋ぐためにポートフォワーディング(-p)する
# Dockerコンテナを消してもファイルが消えないようにDocker外のフォルダをマウント(-v)する
docker run -itp {コンテナ外のport}:{コンテナ内のport} -v {コンテナ外のフォルダの絶対パス,末尾に"/"はつけない}:{コンテナ内でフォルダをマウントしたい場所の絶対パス+マウントするフォルダのDocker内での名称} --name {コンテナの名前} {作成元のimageの名前} /bin/bash
# jupyterの起動
jupyter lab --ip=0.0.0.0 --allow-root --port {コンテナ内のport}

その他諸々

# cloud SDKの認証
gcloud init
# google-cloud-bigqueryのAPI認証
hogehoge
export GOOGLE_APPLICATION_CREDENTIALS={認証ファイルの絶対パス}
export GOOGLE_CLOUD_PROJECT={繋げるプロジェクト名}