1
1

More than 1 year has passed since last update.

[Python×Docker×OpenPyXL] Excelファイルを扱うDocker環境構築(Mac)

Last updated at Posted at 2022-05-14

リポジトリ

https://github.com/melumuccu/python-openpyxl

概要

今回のリポジトリを作ろうとしたきっかけ

  • 投資で仮想通貨の取引を行っている
    • 取引記録を取引所からExportしたときに、一つの注文に対してほぼ同時に複数の約定が起こり取引記録が複数に分裂することが多々起こったため、それらの取引履歴を一つにまとめたいと思った
      • 手作業でやるのは流石にしんどいので、Pythonで自動化するか!

って感じです

この記事でやれること

  • Python と OpenPyXL によるExcelファイル操作を行うDockerコンテナを作れる
  • ついでに、VScodeの Remote Containers を使ったローカル環境を一切汚さずデバッグができる環境を作れる

挙動

1コマンドでコンテナ起動〜処理〜コンテナ破棄

demo.gif

  • コンテナ起動(docker run) からのフローは下記となる
    • docker run
      ⇒ 環境変数でExcelファイルのパスを渡したコンテナ内でExcelファイルが処理される
      ⇒ 処理終了後、コンテナが自動で破棄される

この挙動により、一度環境を構築してしまえば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される
  • -v
    • ボリュームを指定するオプション(ローカル:コンテナ)
(より詳しく)この時何が行われているか?
  1. ボリュームの指定により、ローカルの/src と コンテナ環境の /root/src が共有される(他inputなども同様)
  2. docker run に image IDを渡しているので、そのimageでコンテナが作成される
  3. image作成に使用したDockerfileには
    • ENTRYPOINTが指定されてるので、コンテナ作成後ENTRYPOINTのコマンドが起動する
      • ⇒ /root/src/sample.py が Pythonで実行される
      • WORKDIRは /root/src と指定してある
  4. /root/src/sample.py は /root/input 内にあるファイルを1つずつ処理し /root/output に格納していく
  5. /root/src/sample.pyの処理が終わるとコンテナはstopされる
  6. --rm オプションを付けてコンテナを起動していたのでコンテナは破棄される
  7. /root/output はローカルの/outputにマウントされていたので、/root/output に格納されていた 出力ファイルはコンテナが破棄されていてもローカルの /output に残っている

結果

  • input/sample.xlsx のファイルを処理して /output/sample.xlsx が生成される
  • 以降はdocker runコマンドのみで処理を起動できる

この環境を使って異なる処理を実装する場合のデバッグ環境の作り方

今回の/root/src/sample.py の処理は完全に自分用のニッチな処理なので、この環境を使って別の処理を書きたいということがほとんどな気がします。

なので、実際に自分がこの機能を開発したときのデバッグ環境として利用したVScode拡張のRemote Containersの使い方を別記事に書きました!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1