リポジトリの紹介
今回の作業内容について、下記のリポジトリで差分を見ることができる。
Pipenvの紹介
how-to-make-stock-trading-system.dogwood008.com
昨日は、Docker で Python 3 を動かすところまでやった。今日は、 Python のライブラリである backtrader をインストールするために Pipenv というバージョンを固定するためのライブラリをインストールする。
日本語版: pipenv-ja.readthedocs.io 英語最新版: pipenv.pypa.io
これを使うと、Pipfile
と Pipfile.lock
という2つのファイル1で、ライブラリと Python 本体のバージョンを固定してくれる。さらにはバージョンのみならず、ハッシュ値も記録してくれるので、例えば PyPI2ではなく git を通じて取得したライブラリも、しっかりと固定してくれる。
これにより、開発環境はもとより、本番環境でも自動的に固定したバージョンのライブラリをダウンロードしてきてくれる。ただ、 Docker の文脈だと、本番環境特有のバグや、バージョン不一致等を避けるために、開発環境も本番環境も同じイメージを使うのが望ましい3という狙いがある。したがって、この場合はどちらかという冪等性4を保てるという意味に於いて、バージョン固定の意義が大きい。
便利スクリプトの作成
その前に、便利スクリプトを作っておこう。これから何回も使用するので、タイプ数を減らす目的である5。なお、作らなくても問題ない。
下記の dogwood008 の部分は、自分のIDやニックネーム等、好きなものに変更してほしい。
# Makefile build: docker build -t dogwood008/backtrader . run: docker run --rm -it dogwood008/backtrader bash
これをmac, Linuxの人は Makefile
という名前で保存する。Windows の人はやや長くなるので、最後に書く。
Dockerfile を修正する
まず、昨日作った Dockerfile
を、下記のように変更する。なお、 Makefile
と同様、 maintainer
の部分も好きに変えてほしい。
# Dockerfile FROM python:3.8.6 LABEL maintainer="dogwood008" ARG workdir=/app RUN mkdir $workdir WORKDIR $workdir RUN pip install --upgrade pip && \ pip install pipenv
Dockerfile を使った、イメージのビルド
次に、この Dockerfile
をビルドしよう。 Makefile
を作ったので、 make build
でビルドできる。作っていない人は、コマンド docker build -t dogwood008/backtrader .
をそのまま入力すれば良い(最後のピリオドを忘れないように)。
そうすると、下記のような出力が表示される。 Successfully built
と表示されればOKだ。
$ make build docker build -t backtrader . Sending build context to Docker daemon 152.1kB Step 1/8 : FROM python:3.8.6 ---> a52c041f5098 Step 2/8 : LABEL maintainer "dogwood008+stock-trading-system@example.com" ---> Running in d0832df533b2 Removing intermediate container d0832df533b2 ---> 3a9495df3959 Step 3/8 : ARG workdir=/app ---> Running in 40e89d02d76e Removing intermediate container 40e89d02d76e ---> 8588c1675a64 Step 4/8 : RUN mkdir $workdir ---> Running in 43b166c04830 Removing intermediate container 43b166c04830 ---> c82c123c0bd1 Step 5/8 : WORKDIR $workdir ---> Running in 72d852d8e7ae Removing intermediate container 72d852d8e7ae ---> 6eb637219842 Step 6/8 : ADD Pipfile $workdir ---> edd28b96ca89 Step 7/8 : ADD Pipfile.lock $workdir ---> e08c91d623c5 Step 8/8 : RUN pip install --upgrade pip && pip install pipenv ---> Running in 93e3c7cd5e63 Collecting pip Downloading pip-20.2.4-py2.py3-none-any.whl (1.5 MB) Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 20.2.3 Uninstalling pip-20.2.3: Successfully uninstalled pip-20.2.3 Successfully installed pip-20.2.4 Collecting pipenv Downloading pipenv-2020.8.13-py2.py3-none-any.whl (3.9 MB) Collecting virtualenv Downloading virtualenv-20.0.35-py2.py3-none-any.whl (4.9 MB) Collecting virtualenv-clone>=0.2.5 Downloading virtualenv_clone-0.5.4-py2.py3-none-any.whl (6.6 kB) Requirement already satisfied: setuptools>=36.2.1 in /usr/local/lib/python3.8/site-packages (from pipenv) (50.3.0) Requirement already satisfied: pip>=18.0 in /usr/local/lib/python3.8/site-packages (from pipenv) (20.2.4) Collecting certifi Downloading certifi-2020.6.20-py2.py3-none-any.whl (156 kB) Collecting filelock<4,>=3.0.0 Downloading filelock-3.0.12-py3-none-any.whl (7.6 kB) Collecting distlib<1,>=0.3.1 Downloading distlib-0.3.1-py2.py3-none-any.whl (335 kB) Collecting appdirs<2,>=1.4.3 Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB) Collecting six<2,>=1.9.0 Downloading six-1.15.0-py2.py3-none-any.whl (10 kB) Installing collected packages: filelock, distlib, appdirs, six, virtualenv, virtualenv-clone, certifi, pipenv Successfully installed appdirs-1.4.4 certifi-2020.6.20 distlib-0.3.1 filelock-3.0.12 pipenv-2020.8.13 six-1.15.0 virtualenv-20.0.35 virtualenv-clone-0.5.4 Removing intermediate container 93e3c7cd5e63 ---> 4c92855b6b6d Successfully built 4c92855b6b6d Successfully tagged doogwood008/backtrader:latest
これで Pipenv のインストールは完了である。次回は、 Pipenv を使用して、ライブラリ backtrader をインストールする。
Windows の人向け
Windows の人は、それぞれの docker ~
の行でファイルを分けて、 build.bat
と run.bat
にして、中身を下記の通りにすると動くんじゃないかと思う(未検証)。この場合、 make ~~~
ではなく、bat ファイルを直接実行することになるだろう。
# build.bat docker build -t dogwood008/backtrader .
# run.bat docker run --rm -it dogwood008/backtrader bash
しかし、素直に VirtualBox + Vagrant の構成にしてしまうか、WSL 2 を導入するのが、躓きが少なくなると思う6。
-
Node.js でいうところの
package.json
とpackage-lock.json
、 Ruby で言うところのGemfile
とGemfile.lock
である。↩ -
Node.js でいうところの npm 、Ruby でいうところの RubyGems である。↩
-
これを実現させるために、同じイメージからコンテナを作成し、コンテナを実行するときに環境変数で動作を変えるようにすることが多い。↩
-
冪等性(べきとうせい; idempotency, idempotence)とは、(特にコンピュータ科学の文脈に於いては)何度実行しても同じ結果を出力することを言う。このために、状態によって振る舞いが変わるような部分の排除が必要になったりする。 Docker の文脈でいうと、「開発用マシンでも本番用マシンでも、どんな環境にイメージを持っていっても(だいたい)ビルドして同じ引数を与えてやれば同じ動作をする」ということを実現させるために冪等性が必要、という意味で語られることが多いように思う。↩
-
なお、後日の記事で書くが、この便利スクリプトは更に docker-compose によって置き換えられる。↩
-
てっきり、Win 10 Homeだと Hyper-V が載ってないので、使えないと思い込んでいたが、 Hyper-Vはいらないらしい。最近知った。↩