本シリーズのトップページ |
---|
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 コードを実行するようにした.
今後もこの環境構築は頻発すると思うので書き残しておく.
今回は「ビルドコンテナ」を作成する場合についてである.
構築後のファイル構成
.
|-- PV ......................... 永続ボリューム
| `-- py
| `-- app ................ この直下に *.py を配置する
| `-- a.py ........... サンプルコード
|-- assets
| `-- py
| |-- Dockerfile
| `-- requirements.txt ... 導入したい Python パッケージを記述しておく
`-- docker-compose.yml
手順
1. 永続ボリュームを作成する
コードやデータを配置するために使用する.
$ mkdir -p PV/py/app
2. Dockerfile を作成する
独自拡張するために使用する.
$ mkdir -p assets/py/
$ vim assets/py/Dockerfile
assets/py/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
version: '3.7'
services:
py:
build: ./assets/py
image: mypy0394
container_name: mypy0394
volumes:
- ./PV/py/app/:/usr/src/app/
5. イメージビルドをする
次のコマンドによって、Dockerイメージ「mypy0394
」が作られる
$ docker-compose build --no-cache
6. 常駐型コンテナを起動させる
次のコマンドによって、Dockerコンテナ「mypy0394
」が作られる
$ docker-compose up -d
$ docker-compose ps
Name Command State Ports
----------------------------------
mypy0394 python3 Up
7. 所望のバージョンであることを確認する
デフォルトで使用される Python が 3.9.4 であることを確認する.
$ 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
として見えている.
#!/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 のため)
$ 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
) は残るので問題ない
$ docker-compose down --rmi all --volumes --remove-orphans