本日の差分
いつものように、GitHub上に差分PRを作っておくので、参考にしてほしい。
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 について詳しく知りたい人は、公式サイトで一番正確な情報を入手できるので参考にされたい。
-
引用:Docker, “Docker Compose 概要 — Docker-docs-ja 17.06 ドキュメント”, https://docs.docker.jp/compose/overview.html, アクセス日:2020年10月26日↩