リポジトリ
https://github.com/melumuccu/python-openpyxl
概要
今回のリポジトリを作ろうとしたきっかけ
- 投資で仮想通貨の取引を行っている
- 取引記録を取引所からExportしたときに、一つの注文に対してほぼ同時に複数の約定が起こり取引記録が複数に分裂することが多々起こったため、それらの取引履歴を一つにまとめたいと思った
- 手作業でやるのは流石にしんどいので、Pythonで自動化するか!
- 取引記録を取引所からExportしたときに、一つの注文に対してほぼ同時に複数の約定が起こり取引記録が複数に分裂することが多々起こったため、それらの取引履歴を一つにまとめたいと思った
って感じです
この記事でやれること
- Python と OpenPyXL によるExcelファイル操作を行うDockerコンテナを作れる
- ついでに、VScodeの
Remote Containers
を使ったローカル環境を一切汚さずデバッグができる環境を作れる
挙動
1コマンドでコンテナ起動〜処理〜コンテナ破棄
- コンテナ起動(docker run) からのフローは下記となる
- docker run
⇒ 環境変数でExcelファイルのパスを渡したコンテナ内でExcelファイルが処理される
⇒ 処理終了後、コンテナが自動で破棄される
- docker run
この挙動により、一度環境を構築してしまえば1コマンドでExcelファイルが処理され、無駄にコンテナが残ることもありません
環境
バージョン | memo | |
---|---|---|
Python | 3.10.4 | |
OpenPyXL | 3.0.9 | Excel ファイルを Python で扱うためのパッケージ |
Docker | 20.10.11 | |
Remote Containers | 0.234.0 | VScode 拡張。コンテナ内で VScode を動作させる(?)。デバッグなどの目的で導入。 |
環境構築
前提
- ここでは”src/sample.py”を利用している想定とします
手順
clone
- リポジトリから任意のディレクトリにclone
$ git clone ~~~
※以降、このcloneしたディレクトリでコマンドを実行するものとしてます
image をビルドする
$ docker build --tag py-file-io .
※imageが作成されたことを確認し、image id をコピーしておく
$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
py-file-io latest 8027ef8d5630 About an hour ago 1.03GB
コンテナ起動=>処理実行=>コンテナ破棄
$ docker run -it --rm \
-v $(pwd)/src:/root/src \
-v $(pwd)/input:/root/input \
-v $(pwd)/output:/root/output \
[py-file-ioのimage ID]
オプションについて
- --rm
- コンテナがstopされた時にコンテナを破棄するオプション
- コンテナ起動時にDockerfileのENTRYPOINTにかかれているコマンドが実行され、そのコマンドの処理が終了した時点でコンテナはstopされる
- コンテナがstopされた時にコンテナを破棄するオプション
- -v
- ボリュームを指定するオプション(ローカル:コンテナ)
(より詳しく)この時何が行われているか?
- ボリュームの指定により、ローカルの/src と コンテナ環境の /root/src が共有される(他inputなども同様)
- docker run に image IDを渡しているので、そのimageでコンテナが作成される
- image作成に使用したDockerfileには
- ENTRYPOINTが指定されてるので、コンテナ作成後ENTRYPOINTのコマンドが起動する
- ⇒ /root/src/sample.py が Pythonで実行される
- WORKDIRは /root/src と指定してある
- ENTRYPOINTが指定されてるので、コンテナ作成後ENTRYPOINTのコマンドが起動する
- /root/src/sample.py は /root/input 内にあるファイルを1つずつ処理し /root/output に格納していく
- /root/src/sample.pyの処理が終わるとコンテナはstopされる
- --rm オプションを付けてコンテナを起動していたのでコンテナは破棄される
- /root/output はローカルの/outputにマウントされていたので、/root/output に格納されていた 出力ファイルはコンテナが破棄されていてもローカルの /output に残っている
結果
- input/sample.xlsx のファイルを処理して /output/sample.xlsx が生成される
- 以降はdocker runコマンドのみで処理を起動できる
この環境を使って異なる処理を実装する場合のデバッグ環境の作り方
今回の/root/src/sample.py の処理は完全に自分用のニッチな処理なので、この環境を使って別の処理を書きたいということがほとんどな気がします。
なので、実際に自分がこの機能を開発したときのデバッグ環境として利用したVScode拡張のRemote Containersの使い方を別記事に書きました!