ちょっとしたPython実行環境 on Docker

## Pythonの実行環境が欲しいなあと思った

きっかけは、ULIDの文字列が欲しいのだけど、さくっと出してくれるのが見つからなかった
ならば、作ってしまえば良いってことで

- 参考 ソート可能なUUID互換のulidが便利そう https://qiita.com/kai_kou/items/b4ac2d316920e08ac75a


### 環境
- Docker Desktop が使えること、Windowsであればwsl2が動いていること
- Dockerイメージは alpine で Python のバージョンは3.8以上
- Dockerfile は GitHubにある[docker-library](https://github.com/docker-library/python/tree/fe2130938363f307081496dc5930c29c3ef9ddba)や[docker-hub](https://hub.docker.com/_/python)からもってくる
    - Python3.9でalpineならば、https://github.com/docker-library/python/blob/fe2130938363f307081496dc5930c29c3ef9ddba/3.9/alpine3.14/Dockerfile が`Dockerfile`なのでそれを使う
- VSCodeでRemote Container使う

```Dockerfile

上記のを一部抜粋
FROM alpine:3.14

# ensure local python is preferred over distribution python
ENV PATH /usr/local/bin:$PATH

# http://bugs.python.org/issue19846
# > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK.
ENV LANG C.UTF-8

# runtime dependencies
RUN set -eux; \
	apk add --no-cache \
# install ca-certificates so that HTTPS works consistently
		ca-certificates \
# and tzdata for PEP 615 (https://www.python.org/dev/peps/pep-0615/)
		tzdata \
	;

・・・
・・・
・・・
CMD ["python3"]
```

- Linux Debianで良い場合はお手軽に以下のように記述量は減らせる
 
```Dockerfile
FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "python", "./your-daemon-or-script.py" ]

```


```devcontainer.json
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/docker-existing-dockerfile
{
	"name": "Existing Dockerfile",

	// Sets the run context to one level up instead of the .devcontainer folder.
	"context": "..",

	// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
	"dockerFile": "../Dockerfile",

	"settings": {},
	
	"extensions": [],

	// Use 'forwardPorts' to make a list of ports inside the container available locally.
	// "forwardPorts": [],

	// Uncomment the next line to run commands after the container is created - for example installing curl.
	// "postCreateCommand": "apt-get update && apt-get install -y curl",

	// docker container name (Identify Dev Containers)
	"runArgs": [
		"--name=python3.9-alpine-dev_container"
	]
	
}
```

### コンテナを動かす
1. VSCodeからDockerfileのあるディレクトリを開いて、`Reopen in Container`で開く。参考は、 [公式ドキュメント](https://code.visualstudio.com/docs/remote/containers)
1.  コンテナ初期化が始まる（少し時間かかる、数分
1.  VSCodeのターミナルで接続して、`python --version` 後は、`.py` や pythonコマンドライン使う

```
$ python --version
Python 3.9.6

$ cd /workspaces
$ python -m venv venv
$ . venv/bin/activate
$  pip install ulid-py
```

- pythonコマンドライン使って

```
python
import ulid
id1 = ulid.new()
id1
id1.str
```

## 実行例

```
937f59a63c54:/workspaces/venv# python --version
Python 3.9.6
937f59a63c54:/workspaces/venv# cd ..
937f59a63c54:/workspaces# . venv/bin/activate
(venv) 937f59a63c54:/workspaces# python
Python 3.9.6 (default, Jul 21 2021, 02:01:12) 
[GCC 10.3.1 20210424] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ulid
>>> id1 = ulid.new()
>>> id1
<ULID('01FB4827H7K34PAZ2209M6WBCE')>
>>> id1.str
'01FB4827H7K34PAZ2209M6WBCE'

```

Python環境つくったのは、2019年末以来かな