これまでの振り返り
昨日はコンテナの中でインストールしたが、今度はその操作を Dockerfile
に書き込むことで、自動化する。
how-to-make-stock-trading-system.dogwood008.com
今日の完成形
GitHubにも本日の状態を再現した状態でアップロードしてあるので、参考にしてほしい。
昨日作ったファイル
下記の2つのファイル Pipfile
Pipfile.lock
が、昨日作成したファイルである。未だ作っていない人は、下記をコピーしてもOKである(その場合、コマンド部1は除いてほしい)。
root@8e82ce23f287:/# cat Pipfile [[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] [packages] backtrader = "*" [requires] python_version = "3.8"
root@8e82ce23f287:/# cat Pipfile.lock { "_meta": { "hash": { "sha256": "62f2c898940a09cc88c8fc42c85e52c3526c851c12517325c638b20dfa1be2ab" }, "pipfile-spec": 6, "requires": { "python_version": "3.8" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "backtrader": { "hashes": [ "sha256:0dc8912a98352b75122f8d7084bc63ee47f61c2a1d16f506d4d82aee3941297a" ], "index": "pypi", "version": "==1.9.76.123" } }, "develop": {} }
Dockerfile
の修正
次に、 Dockerfile
を次のように修正する。イメージに Pipfile
Pipfile.lock
を追加して、それを読み込みながら環境(固定したバージョンがインストールされた状態)を再現する操作 pipenv sync
2を記述することが目的である。
ADD
命令は、イメージをビルドする際に指定したファイルをDocker から見えるようにするコマンドである。今回は Pipfile
と Pipfile.lock
を見えるようにするために、イメージに追加する。似た命令に、 COPY
命令3がある。
FROM python:3.8.6 LABEL maintainer "dogwood008" ARG workdir=/app RUN mkdir $workdir WORKDIR $workdir ADD Pipfile $workdir # ←イメージに Pipfile を追加する ADD Pipfile.lock $workdir # ←イメージに Pipfile.lock を追加する RUN pip install --upgrade pip && \ pip install pipenv && \ pipenv sync # ←Pipfile.lock を読み込み、固定したバージョンを再現する
イメージのビルド
次に、 make build
4 で、イメージをビルドする。
$ make build docker build -t dogwood008/backtrader . [+] Building 19.6s (11/11) FINISHED => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.2s => => transferring dockerfile: 315B 0.1s => [internal] load metadata for docker.io/library/python:3.8.6 2.4s => [internal] load build context 0.0s => => transferring context: 61B 0.0s => [1/6] FROM docker.io/library/python:3.8.6@sha256:0d3333986c2684c699fefa9f39767bd185980ac6 0.0s => CACHED [2/6] RUN mkdir /app 0.0s => CACHED [3/6] WORKDIR /app 0.0s => CACHED [4/6] ADD Pipfile /app 0.0s => CACHED [5/6] ADD Pipfile.lock /app 0.0s => [6/6] RUN pip install --upgrade pip && pip install pipenv && pipenv sync 15.7s => exporting to image 1.3s => => exporting layers 1.3s => => writing image sha256:324eda94515de559ac34a897b159f6c7b875c1c96072feb0f61e3f689d845cc9 0.0s => => naming to docker.io/dogwood008/backtrader
動作確認
無事ビルドできたら、試しに実行してみる。
$ make run docker run --rm -it dogwood008/backtrader bash root@1dcdc85f7015:/app#
コンテナには入れたら、さらに続けて pipenv run python
で、本体とライブラリのバージョンを固定した Python を起動する。 import backtrader
と入力し、エラーが表示されなかったら、正常に backtrader のインストールが完了している。
root@1dcdc85f7015:/app# pipenv run python Python 3.8.6 (default, Oct 13 2020, 20:37:26) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import backtrader >>> # ←「>>>」のみが表示されればOK
これで backtrader を使える状態が整った。次は backtrader の Quickstart Guide を見ながら、実際に backtrader を動かしてみよう。
-
root@ ~~~ cat Pipfile
の部分。↩ -
pipenv sync
だとPipenv.lock
のバージョンから完全一致で再現してくれる。
一方、pipenv install
だと、Pipenv
を満たす条件でインストールするので、Pipenv
でメジャーバージョンの固定を行っていないと、勝手にその時の最新版をインストールしようとするので、本当は固定しておいた方が驚きが少なくて済む。今回は手間省略のために特に指定しなかった。↩ -
Docker のベストプラクティスによると、
ADD
よりCOPY
が望ましいようである。ADD
はtar
ファイルの展開やリモートURLからのダウンロードに対応しているが、COPY
はそうではないようだ。別の記事で修正したい。↩ -
過去の記事 で
Makefile
を作っているため、このコマンドで実行できる。作っていない場合でも、docker build -t タグ名 .
でビルドできる。↩