概要
以前、pyenv 利用のまとめ という記事を書いたのですが、
今でもたまに参照頂いているようでありがたいことです。
ただ最近 python でスクリプト書く際には pyenv ではなく docker を利用することが多いので、
その方法をメモしておきます
tl;dr
- docker で python 開発環境構築
- ローカルで編集、コンテナで実行・テスト
- (ほぼ)そのままデプロイ
環境
- macOS High Sierra
- Docker CE for Mac
準備
- docker for mac をインストール
- 準備おわり
ディレクトリ構成
以下のようなディレクトリ構成を想定しています
.
├── Dockerfile
└── sample.py # 対象のスクリプト
上記は簡略化して書いていますが、要は普段利用している構成に Dockerfile を追加しただけ
構築と利用
実行環境用 Dockerfile の作成
必要なパッケージをインストールした Dockerfile を作成
FROM python:3
RUN pip install requests==2.18.4 click==6.7
パッケージのバージョン指定の有無はお好みで。
build して、利用する
上記で設定したコンテナを build して、その上で開発していく
$ docker build -t myproject -f /path/to/Dockerfile
$ docker run --rm -it myproject bash
...のですが、これだとろくに設定されていないエディタで作業することになるのでツライ
ローカルとコンテナ内を同期して、書くのはローカルのエディタ、テストや実行はコンテナで行うようにする
$ docker run --rm -it -v $(pwd):/usr/local/src/myproject myproject bash
root@2156ba4f# python sample.py
ただ、毎回 docker コマンドにオプション渡すのも面倒くさいので、
かんたんな wrapper スクリプトを用意
#!/bin/sh
IMAGE_NAME=$1
shift
if [ "${IMAGE_NAME}" = "" ]; then
exit 1
fi
docker run --rm -it \
-v $(pwd):/usr/local/src/${IMAGE_NAME} \
-w /usr/local/src/${IMAGE_NAME} \
${IMAGE_NAME} "$@"
wrapper スクリプト経由で利用
$ ./run.sh myproject python sample.py
直接コマンド実行でも良いんだけど、
コンテナの立ち上げ時間が気になる場合は bash
とかで中に入ってしまう(予めコンテナ起動しておく)と良いと思います。
$ ./run.sh myproject bash
root@2156ba4f# ls
Dockerfile run.sh sample.py
root@2156ba4f# python sample.py
まとめ
この環境で開発するようになってから、
ある程度形になってきたら Dockerfile に スクリプトの COPY とか、
CMDとかENTRYPOINT書くだけで、デプロイできるようになるのでとても楽