株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

Docker Composeの利用

f:id:dogwood008:20201019002141p:plain
Docker

本日の差分

いつものように、GitHub上に差分PRを作っておくので、参考にしてほしい。

github.com

Docker Compose とは

下記の過去の記事で docker のイメージをビルドするために Makefile を作成したが、実はこれとよく似た機能を Docker 公式が Docker Compose という名前でツールとして提供している。

how-to-make-stock-trading-system.dogwood008.com

Docker Compose 自体は、「Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです」1と紹介されているが、単一のコンテナでも使用できる。

Makefile との違い

単一のコンテナを動かす場合は、 Makefile を使った場合とできることは大きく変わらないが、 Docker Compose の利用を推奨する。理由は、ビルドと実行のコマンドが自明だからだ。

Makefile の場合、ファイルの中身を確認しないとどのような名前のターゲットが用意されているかわからないのに対し、 docker-compose.yml が存在するプロジェクトは必ず docker-compose build でコンテナをビルドでき、 docker-compose up でコンテナを立ち上げることができる。

また、設定を構造的に指定し、更にそれを別のファイルで上書きすることができる。例えば、設定値だけまとめた項目 environments や ビルド時引数 args をデプロイ先に応じて変更するといったことが可能である。

docker-compose.yml の作成とビルド、実行

今回作成した Makefile を Docker Compose で使用する docker-compose.yml に置換すると、下記のようになる。

# docker-compose.yml
version: '3.8'
services:
  app:
    build: .  # ←「カレントにある Dockerfile をビルドする」という意味(厳密に言うとやや違うが、今は困らないので解説しない)
    volumes:
      - .:/app  # ←「カレントにあるファイルを全部 Docker のコンテナ内の /app ディレクトリ内に突っ込む」

このファイルを作った後、 docker-compose up を実行すると、下記のようにビルドが始まる。

$ docker-compose build
Building app
Step 1/10 : FROM python:3.8.6
3.8.6: Pulling from library/python
e4c3d3e4f7b0: Already exists
101c41d0463b: Already exists
8275efcd805f: Already exists
751620502a7a: Already exists
0a5e725150a2: Already exists
397dba5694db: Already exists
b453803265bc: Already exists
a49354af7e01: Already exists
7f7c8879a275: Already exists
Digest: sha256:0d3333986c2684c699fefa9f39767bd185980ac6fe4ddc942967dd55fa5c344a
Status: Downloaded newer image for python:3.8.6
 ---> f5e423f5ce1f
Step 2/10 : LABEL maintainer="dogwood008"
 ---> Running in 472ec4344063
Removing intermediate container 472ec4344063
 ---> df2b6d12b672
Step 3/10 : ARG workdir=/app
 ---> Running in 692cb19f9844
Removing intermediate container 692cb19f9844
 ---> 8cca155930c6
Step 4/10 : RUN mkdir $workdir
 ---> Running in 10f34140056c
Removing intermediate container 10f34140056c
 ---> 1de31544df73
Step 5/10 : WORKDIR $workdir
 ---> Running in fc55f30905c3
Removing intermediate container fc55f30905c3
 ---> c76ba8b3a334
Step 6/10 : COPY Pipfile $workdir
 ---> 29918ddca392
Step 7/10 : COPY Pipfile.lock $workdir
 ---> 9041ac1cb8c0
Step 8/10 : COPY main.py $workdir
 ---> ec62234801a5
Step 9/10 : RUN pip install --upgrade pip &&     pip install pipenv &&     pipenv sync
 ---> Running in 7224ae24f498
Requirement already up-to-date: pip in /usr/local/lib/python3.8/site-packages (20.2.4)
Collecting pipenv
  Downloading pipenv-2020.8.13-py2.py3-none-any.whl (3.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.2)
Collecting certifi
  Downloading certifi-2020.6.20-py2.py3-none-any.whl (156 kB)
Requirement already satisfied: pip>=18.0 in /usr/local/lib/python3.8/site-packages (from pipenv) (20.2.4)
Collecting virtualenv
  Downloading virtualenv-20.1.0-py2.py3-none-any.whl (4.9 MB)
Collecting distlib<1,>=0.3.1
  Downloading distlib-0.3.1-py2.py3-none-any.whl (335 kB)
Collecting six<2,>=1.9.0
  Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting appdirs<2,>=1.4.3
  Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
Collecting filelock<4,>=3.0.0
  Downloading filelock-3.0.12-py3-none-any.whl (7.6 kB)
Installing collected packages: virtualenv-clone, certifi, distlib, six, appdirs, filelock, virtualenv, 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.1.0 virtualenv-clone-0.5.4
Creating a virtualenv for this project…
Pipfile: /app/Pipfile
Using /usr/local/bin/python3.8 (3.8.6) to create virtualenv…
⠸ Creating virtual environment...created virtual environment CPython3.8.6.final.0-64 in 1570ms
  creator CPython3Posix(dest=/root/.local/share/virtualenvs/app-4PlAip0Q, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
    added seed packages: pip==20.2.4, setuptools==50.3.2, wheel==0.35.1
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

✔ Successfully created virtual environment!
Virtualenv location: /root/.local/share/virtualenvs/app-4PlAip0Q
Installing dependencies from Pipfile.lock (1be2ab)…
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
All dependencies are now up-to-date!
Removing intermediate container 7224ae24f498
 ---> ee3620e32c25
Step 10/10 : CMD ["pipenv", "run", "python", "main.py"]
 ---> Running in e8e3f3d8e364
Removing intermediate container e8e3f3d8e364
 ---> 5b1e720f78e8

Successfully built 5b1e720f78e8
Successfully tagged stock-trading-system_app:latest

ビルドが正常に完了したら、 docker-compose up で、コンテナを実行できる。 なお、 docker-compose.yml 内で ./app へマウントしているので、 Dockerfile 内の COPY main.py $workdir は不要になった。また、ファイルへの変更は自動的に反映されるので、 main.py の変更の度に再ビルドをしなくて良い。

$ docker-compose up
Creating network "stock-trading-system_default" with the default driver
Creating stock-trading-system_app_1 ... done
Attaching to stock-trading-system_app_1
app_1  | Starting Portfolio Value: 10000.00
app_1  | Final Portfolio Value: 10000.00
stock-trading-system_app_1 exited with code 0

なお、 Docker Compose について詳しく知りたい人は、公式サイトで一番正確な情報を入手できるので参考にされたい。

docs.docker.com


  1. 引用:Docker, “Docker Compose 概要 — Docker-docs-ja 17.06 ドキュメント”, https://docs.docker.jp/compose/overview.html, アクセス日:2020年10月26日

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.