[01] docker-composeを活用して即座にPython 3.9.4 を立てる ... ビルドコンテナを作る


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/eebd8068a0533ba49bea|

# はじめに

限られた物理PC の中で、次の Python バージョン
・Python 3.6.8
・Python 3.7.3
・Python 3.8.3
・Python 3.9.4 
をインストールしてプログラムを作成することになった.

ただし、物理PC を汚染させるわけにもいかないので Docker を活用した.
(操作しやすいように docker-compose を導入した)

また、物理ホスト側からバッチを使って、極力コンテナに「手動で」ログインせずに 
Python コードを実行するようにした.

今後もこの環境構築は頻発すると思うので書き残しておく.

今回は「**ビルドコンテナ**」を作成する場合についてである.

　

# 構築後のファイル構成

```bash
.
|-- PV ......................... 永続ボリューム
|   `-- py
|       `-- app ................ この直下に *.py を配置する
|           `-- a.py ........... サンプルコード
|-- assets
|   `-- py
|       |-- Dockerfile
|       `-- requirements.txt ... 導入したい Python パッケージを記述しておく
`-- docker-compose.yml
```


# 手順

## 1. 永続ボリュームを作成する

コードやデータを配置するために使用する.

```bash
$ mkdir -p PV/py/app
```

## 2. Dockerfile を作成する

独自拡張するために使用する.

```bash
$ mkdir -p assets/py/
$ vim assets/py/Dockerfile
```

### assets/py/Dockerfile

```dockerfile
FROM python:3.9.4-buster
 
## プロキシサーバを使う場合
# ENV http_proxy="http://proxy.co.jp:8080"  
# ENV https_proxy="http://proxy.co.jp:8080"
 
# コンテナ内での作業場所を /usr/src/app とする
WORKDIR /usr/src/app
 
# Python に関する環境変数
# pyc を作成しない
ENV PYTHONDONTWRITEBYTECODE 1
# python -u 相当. バッファリングしない. 
ENV PYTHONUNBUFFERED 1
 
# 日本環境に合わせる
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANGUAGE ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
 
# pip を更新したうえで必要なパッケージをインストールする
RUN python -m pip install --upgrade pip==21.0.1
COPY requirements.txt .
RUN pip install -r requirements.txt

```

## 3. requirements.txt を作成する

ここでは `assets/py/requirements.txt` に定義する

### assets/py/requirements.txt

以下は例である.

```
requests==2.23.0
sh==1.13.1
urllib3==1.25.9
```

## 4. docker-compose.yml を作成する

### docker-compose.yml

```yaml
version: '3.7'
 
services:
  py:
    build: ./assets/py
    image: mypy0394
    container_name: mypy0394
    volumes:
      - ./PV/py/app/:/usr/src/app/
```

## 5. イメージビルドをする

次のコマンドによって、Dockerイメージ「`mypy0394`」が作られる

```bash
$ docker-compose build --no-cache
```

## 6. 常駐型コンテナを起動させる

次のコマンドによって、Dockerコンテナ「`mypy0394`」が作られる

```bash
$ docker-compose up -d
```

```bash
$ docker-compose ps
  Name     Command   State   Ports
----------------------------------
mypy0394   python3   Up    
```

## 7. 所望のバージョンであることを確認する

デフォルトで使用される Python が 3.9.4 であることを確認する.

```bash
$ docker-compose exec py bash -c 'which python' 
/usr/local/bin/python

$ docker-compose exec py bash -c 'python --version' 
Python 3.9.4
```

## 8. サンプルコードが動作するか確認をする

### ./PV/pv/app/a.py

物理ホストで次の `./PV/pv/app/a.py` を作成する. 

コンテナ内からは `/usr/src/app/a.py` として見えている.

```python
#!/usr/bin/env python
import requests
import urllib3
import sh
import sys

print("Hello Python 0394")

for a in sys.argv[1:]:
  print(a)

```

## 9. 実行する

コンテナログイン時のパスは `/usr/src/app` である. (∵ Dockerfile の WORKDIR のため)

```bash
$ docker-compose exec py bash -c 'python a.py' 
Hello Python 0394

```

　

# 補足

## コンテナ内には python 2.7.16 と 3.7.3 も存在している

ちなみに次のように異なる Python が存在している模様. 
ただし、3.9.4 以外は使ったことは無いので、動作するかは不明.

| Python バージョン | コンテナ内パス |
|:--|:--|
| /usr/bin/python | 2.7.16 |
| /usr/bin/python3 | 3.7.3 |
| /usr/local/bin/python | 3.9.4 |


## 実行環境 (イメージとコンテナ) を一掃する

永続ボリューム (ここでは `./PV`) は残るので問題ない

```bash
$ docker-compose down --rmi all  --volumes --remove-orphans
```