【Mac】Docker を使って最速で Python 3.x 環境を構築する

Mac は標準で Python 2.7 がインストールされていますので、Python 3.x の環境が必要な場合は、[Pipenv](https://pipenv-ja.readthedocs.io/ja/translate-ja/) や [pyenv](https://github.com/pyenv/pyenv) を使って環境構築することが多いと思います。

しかし、インストールに失敗したり、設定に手間取ったりすることが多かったので、Docker を使った Python 3.x 環境の構築方法をまとめておきます。

## 動作環境
- Mac OS X 10.14.6

## Docker を使って Python 3.x 環境を構築

以下の URL から「Docker Desktop for Mac」をダウンロードし、インストールします。
https://hub.docker.com/editions/community/docker-ce-desktop-mac

Docker のインストールが完了したら、「docker version」コマンドを実行し、正しくインストールされているか確認してみましょう。

```console
$ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:22:34 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:29:19 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

任意のフォルダを Python のプロジェクトフォルダとして作成し、そのフォルダ内に Python のソースファイルを配置します。
※この記事では、「/Users/username/work/python/helloworld」をプロジェクトフォルダとして使用します。

```console
$ cd /Users/username/work/python/helloworld
$ echo 'print("Hello World!")' > helloworld.py
```

「docker run」コマンドを実行し、Python の実行環境となるコンテナを起動します。

以下のオプションを指定します。

- -i (--interactive) ： コンテナの標準入力にアタッチします。
- -t (--tty) ： 疑似ターミナル (pseudo-TTY) を割り当てます。
- --rm ： コンテナ終了時に、自動的にコンテナを削除します。
- -v (--volume) ： ローカルのフォルダをコンテナ上にマウントします。（<ローカル上のフォルダ>:<コンテナ上のフォルダ>）

Docker イメージは、[Docker Hub](https://hub.docker.com/) で公開されている「[python:3.7-alpine](https://hub.docker.com/_/python)」を使用します。

コマンド末尾の「/bin/sh」は、コンテナ起動時に実行されるコマンドです。

```console
$ docker run -it --rm -v /Users/username/work/python/helloworld:/helloworld python:3.7-alpine /bin/sh
```

コンテナが起動したら、以下のコマンドを実行して、正しく動作しているか確認してみましょう。

```console
/ # ls
bin         etc         home        media       opt         root        sbin        sys         usr
dev         helloworld  lib         mnt         proc        run         srv         tmp         var
/ # python --version
Python 3.7.5
```

プロジェクトフォルダに移動し、Python ファイルを実行します。

```console
/ # cd helloworld/
/helloworld # python helloworld.py 
Hello World!
```

「exit」コマンドを実行すると、コンテナを終了します。

```console
/helloworld # exit
```

## コンテナ起動時にパッケージをインストール

コンテナは起動時に初期化されるので、起動毎に必要なパッケージをインストールする必要があります。

それでは面倒なので、新しい Docker イメージを作成し、コンテナ起動時に必要なパッケージがインストールされるようにします。

プロジェクトフォルダ内に Dockerfile を作成します。

```Dockerfile:Dockerfile
# ベースとなる Docker イメージを指定
FROM python:3.7.5-alpine

# プロジェクトフォルダを指定
ARG project_dir=/helloworld/

# requirements.txt をコンテナにコピー
ADD requirements.txt $project_dir

# requirements.txt に書かれたパッケージをインストール
WORKDIR $project_dir
RUN pip install -r requirements.txt
```

「docker build」コマンドを実行し、新しい Docker イメージ「helloworld」を作成します。

```console
$ docker build -t helloworld .
```

新しく作成した Docker イメージ「helloworld」を指定して「docker run」コマンドを実行すると、コンテナ起動時に requirements.txt に書かれたパッケージがインストールされます。

```console
$ docker run -it --rm -v /Users/username/work/python/helloworld:/helloworld helloworld /bin/sh
```