Python環境つくるならDocker for Windows（ただしCPUのみ）

# condaとpipは混ぜないはなし
- [Docker for WindowsでGUI](/kfjt/items/369c48686c849c0042a9)
 - [condaとpipは混在させてはいけない](http://onoz000.hatenablog.com/entry/2018/02/11/142347)
 - なるべくピュアでシンプルな環境にしたい
- [Docker for WindowsでJupyter](/kfjt/items/0fc10aa317e296ecd8c1)
 - Python公式のイメージが700MBでだるい
 - Jupyter公式のイメージが700MBでだるい
 - Ubuntu公式(80MB)からスタートしたら340MBくらいになった

# もっとdockerイメージ軽くしたい
- baseをalpineにしたら軽くなった~~、Jupyterとか入れてないけど、いっそ必要と感じなくなった~~
- 【悲報】やっぱりJupyter入りも作ってみたらubuntuと容量が変わんない（2018/6/15追記）

|#|base|size|memo|
|--:|:--|--:|:--|
|1|ubuntu|340MB|python3,pip,wheel,jupyter,matplotlib,numpy,chainer＝以前絶望したとき|
|2|alpine|4MB|なにもないとき|
|3|alpine|56MB|python,pip|
|4|alpine|112MB|python,pip,numpy,chainer|
|5|alpine|119MB|python,pip,numpy,chainer,PIL＝[NDLのtrainがうごく](/kfjt/items/d90dced6d5cf36f6b669)|
|6|alpine|308MB|python,pip,jupyter|

# 用途に合わせて素のalpineから育てると安心
## はじめに表３のイメージを作る
- `docker build -f ./Dockerfile -t alpine-python .`

```dockerfile:Dockerfile
FROM alpine

RUN apk --no-cache add \
    python3 \
    py3-pip \
  && pip3 install --upgrade pip

ENTRYPOINT [ "python3" ]
```

## 表４は表３から育てる
- `docker build -f ./Dockerfile -t alpine-chainer .`

```dockerfile:Dockerfile
FROM alpine-python

RUN apk --no-cache add \
    py3-numpy \
  && pip3 install chainer

ENTRYPOINT [ "python3" ]
```

## 表５は表４から育てる
- `docker build -f ./Dockerfile -t alpine-ndl .`

```dockerfile:Dockerfile
FROM alpine-chainer

RUN apk update \
    && apk --no-cache add \
    py3-pillow

ENTRYPOINT [ "python3" ]
```

## 表６は表３から育てる
- `docker build -f ./Dockerfile -t alpine-chainer .`

```dockerfile:Dockerfile
FROM alpine-python

RUN apk --no-cache add \
    build-base \
    python3-dev \
    && pip3 install jupyter

EXPOSE 8888

ENTRYPOINT [ "jupyter" ]
CMD [ "notebook", "--ip=*", "--no-browser", "--allow-root" ]
```

## 改善
- pipてインストール後にキャッシュ消せますかね？
 - キャッシュを無視してインストールするのでは無くdockerイメージを小さくする目的です
- 多分まだ良いけど、10や20も段階重ねて育てるより一遍にビルドしたほうが軽いイメージになると思う
 - タイミングは使いまわす基点が定まってきたり、誰かに公開するとき？
 - 例：最後のndl向け

```dockerfile:Dockerfile
FROM alpine

RUN apk update \
  && apk --no-cache add \
    python3 \
    py3-pip \
    py3-numpy \
    py3-pillow \
  && pip3 install --upgrade pip \
  && pip3 install chainer

ENTRYPOINT [ "python3" ]
```

# 育てたpythonをホストマシンから使う
## pythonの例
- 実行準備：パスを通したところにpython.batを作る

```sh:python.bat
# 実行フォルダを/mnt/hostにマウント
# usage: python /mnt/host/[スクリプトファイルパス]
docker run --rm -it -v %CD%:/mnt/host alpine-python %*
```

```console:実行イメージ
C:\Users\kfjt\test>dir /b
hoge.py

C:\Users\kfjt\test>python /mnt/host/hoge.py
hoge!!!
```

```console:引数渡さないとpythonコンソールに入ります
C:\Users\kfjt\test>python
Python 3.6.3 (default, Nov 21 2017, 14:55:19)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 + 1
2
>>> exit()
```

## chainerの例
- 割愛
- 同様です、chainer.batを作っとくと幸せになります

## Jupyterの使い方

```sh:jupyter.bat
: ポート8888開放
docker run --rm -v %CD%:/mnt/host -p 8888:8888 -d --name ajupyter alpine-jupyter
: 起動待ち 
2>&1 1>nul timeout 1
: トークン確認
docker exec ajupyter jupyter notebook list
```
```console:実行イメージ
C:\Users\kfjt\test>jupyter
924a2c4a9de02ca9d47b3eec7e706e55ed532fc6a69e93811561b7b959411795
Currently running servers:
http://localhost:8888/?token=db4e8c277d9d2dced545db0d708d0353229a92296f8c7bf2 :: /
```
- ブラウザで`http://localhost:8888/?token=db4e8c277d9d2dced545db0d708d0353229a92296f8c7bf2`を開いてください

# Dockerfileを育てるとき
- `apk`や`pip`を試してDockerfileに追記したいはず

```console:endpointオプションを付ければよい
docker run --rm -it --entrypoint="sh" alpine-python
```

以上