#はじめに
Anacondaの有償化に伴い、こちらでminiconda+conda-forgeに関する運用の記事を書いたところ、そこそこに反響があったので、今回はDockerで開発環境を揃えるところをご紹介したい。
#環境
私がWindows派であり、condaはケモインフォマティクスをやるために利用しているため、今回は以下の構成で説明する。またWebアプリの開発を想定してDjangoも用意することする。
- Windows 10
- python 3.7
- django 3系 (WEBアプリフレームワーク)
- Pytorch 1.7 cpu版 (ディープラーニングフレームワーク)
- RDKit (ケモインフォマティクスライブラリ)
- gunicorn (WEBサーバ)
#手順
Dockerのインストール
まずは以下に従ってDockerをインストールしよう。
Dockerfileの作成
続いて以下のようにDockerfileを作成しよう。
FROM continuumio/miniconda3
# conda create
RUN conda create -n chemodel python==3.7
# install conda package
SHELL ["conda", "run", "-n", "chemodel", "/bin/bash", "-c"]
RUN conda install django=3.* -c conda-forge --override-channels
RUN conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cpuonly -c pytorch -c conda-forge -c tboyer --override-channels
RUN conda install -c rdkit -c conda-forge rdkit --override-channels
# install pip package
RUN pip3 install --upgrade pip
RUN pip3 install gunicorn
Dockerfileについて解説する
- まず、
FROM~
のところで、minocondaのベースイメージを指定する。 - 続いて、
RUN conda create -n chemodel python==3.7
で、作成したいPythonのバージョンでConda仮想環境を作成する。 -
SHELL~
の行でその仮想環境をActivateする。ここが今回の最大の肝で、この方法を間違えると、それ以降のconda installによるインストールが、作成した仮想環境ではなく、base環境に反映されてしまうのだ。 - ここまでくれば、その後は、conda, pipで各自インストールしたいものを列挙すればOKだ。Anaconda有償化の影響をうけ、チャネルやオプションの指定は、前回の記事を参考にしてほしい。
- pytorch1.7は、pytorch, conda-forgeだけからではインストールできなかったっぽかったので、tboyerというマイナーなチャネルを指定したが、危険だと思われる方は別のPyTorchのバージョンを指定してみてほしい。
Dockerイメージのビルド
作成したDockerfileのあるフォルダで以下を実行するとビルドできるはずだ。
docker build -t kimisyo/dev:1.0 -f Dockerfile ./
Dockerイメージの確認
docker images
でイメージができたか確認してみよう。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kimisyo/dev 1.0 90cbde3916c9 17 hours ago 3.33GB
Dockerコンテナの起動
Djangoアプリを作成し、以下のようにDockerコンテナを起動すると、http://locahost:8080/
で、作成したDjangoアプリを参照できるはずだ。
$docker run -itd -p 8080:8000 --name chemodel --mount type=bind,src=<Djangoのプロジェクトがあるフォルダを絶対パスで指定>, target=/chemodel,readonly kimisyo/dev:1.0 /bin/bash -c "conda run -n chemodel;
cd /chemodel/; /opt/conda/envs/chemodel/bin/gunicorn --bind 0.0.0.0:8000 chemodel.wsgi"
ちょっと分かりにくいので簡単に説明する。
-
-p 8080:8000
は、Dockerコンテナ側の8000ポートをローカルの8080ポートで参照できるようにするための指定である。 -
-mountオプション
では、ローカルにあるDjangoプロジェクトのフォルダを、コンテナ側で認識させるために /chemodelというフォルダにマウントしている。 - 最後の
/bin/bash -c "conda run -n chemodel; cd /chemodel/; /opt/conda/envs/chemodel/bin/gunicorn --bind 0.0.0.0:8000 chemodel.wsgi"
ではコンテナ起動時に、conda仮想環境をActivateし、コンテナ内のDjangoアプリフォルダに移動し、gunicornによりDjangoアプリを起動している。
#おわりに
一度開発環境を作ってしまえば、毎回パッケージをインストールする必要もなく、本番環境もDockerで簡単にデプロイしてしまうこともできそうだ。Hava a good miniconda+conda-forge & Docker Life!
参考
- Activating a Conda environment in your Dockerfile 今回の肝となるCondaのActivte方法が記載されている。