docker コンテナで python 開発

More than 1 year has passed since last update.


概要

以前、pyenv 利用のまとめ という記事を書いたのですが、

今でもたまに参照頂いているようでありがたいことです。

ただ最近 python でスクリプト書く際には pyenv ではなく docker を利用することが多いので、

その方法をメモしておきます


tl;dr


  • docker で python 開発環境構築

  • ローカルで編集、コンテナで実行・テスト

  • (ほぼ)そのままデプロイ


環境


  • macOS High Sierra

  • Docker CE for Mac


準備


ディレクトリ構成

以下のようなディレクトリ構成を想定しています

.

├── Dockerfile
└── sample.py # 対象のスクリプト

上記は簡略化して書いていますが、要は普段利用している構成に Dockerfile を追加しただけ


構築と利用


実行環境用 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 スクリプトを用意


run.sh

#!/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書くだけで、デプロイできるようになるのでとても楽