やること
データサイエンス用の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/jupyterlab-manager@1.1 --no-build \
&& jupyter labextension install jupyterlab-plotly@1.4.0 --no-buil \
&& jupyter labextension install plotlywidget@1.4.0 --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={繋げるプロジェクト名}