PYTHON + DOCKER MEMO
Dockerで自作Pythonプログラム(smbus2)を動かす備忘録
Ubuntu環境でDockerを使い、I2Cデバイス(センサー等)を制御するPythonスクリプトを実行する手順
1. 必要なファイル構成
作業用フォルダ(例: ~/pyimg)の中に、以下の3つのファイルを用意する。
pyimg/
┣ Dockerfile
┣ docker-compose.yml
┗ tmpapp.py (自作のPythonプログラム)
2. Dockerfile の書き方
コンテナ内に構築する環境(ベースのPythonと必要なライブラリ)の設計図。
FROM python:3.11-slim
WORKDIR /app
# smbus2 ライブラリをインストールする
RUN pip install --no-cache-dir smbus2
# ホストのファイルをコンテナ内の /app にコピーする
COPY . /app
# コンテナ起動時に実行するコマンド
CMD ["python", "tmpapp.py"]
各行の意味
FROM python:3.11-slim: 軽量なDebianベースのPython 3.11公式イメージを使用。WORKDIR /app: コンテナ内の作業ディレクトリを/appに指定。RUN pip install ...: I2C通信に必要なsmbus2をインストール。COPY . /app: ホスト側のファイルをコンテナ内に持ち込む。CMD [...]: コンテナが起動したときに自動実行するPythonスクリプトを指定。
3. docker-compose.yml の書き方と詳細解説
コンテナの起動オプションや、ハードウェア(I2C)の共有設定を行うファイル。
version: '3.8'
services:
app:
build: .
container_name: python_on_Docker
# 標準入出力(printなど)をリアルタイムでコンソールに出すため
stdin_open: true
tty: true
# ホスト側のI2Cハードウェア(例: /dev/i2c-1)をコンテナ内に共有する
devices:
- "/dev/i2c-1:/dev/i2c-1"
各行・各項目の詳しい説明
-
version: '3.8'
Docker Composeファイルの書式バージョンを指定している。(※近年のDockerでは省略しても動作する) -
services:
これから立ち上げるコンテナ(サービス)群を定義するブロックの始まり。 -
app:
定義するサービスの名前(任意の名前)。ここではappという名前のサービスにしている。 -
build: .
同じフォルダ内(.)にあるDockerfileを読み込んで、自作のイメージをビルドするように指示する。 -
container_name: python_on_Docker
起動するコンテナにpython_on_Dockerという分かりやすい名前を固定でつける。 -
stdin_open: trueとtty: true
プログラム内のprint出力をリアルタイムでコンソール画面に表示させたり、キーボード入力を受け付けたりできるようにするための擬似端末割り当て設定。 -
devices:と- "/dev/i2c-1:/dev/i2c-1"
Dockerコンテナは完全に独立した空間であるため、外にあるセンサーやI2Cデバイスを触るために、ホスト側にあるI2Cデバイス(/dev/i2c-1)をコンテナ内へ直接共有(マウント)する設定。
4. 実行コマンドと「--build」の注意点
初回・プログラム修正時のビルド&起動
docker compose up --build
通常起動(2回目以降)
docker compose up
⚠️ 初回起動時に
もし初回に
対策: 初めて起動するとき、または
--build を付け忘れたらどうなるか?もし初回に
docker compose up(--build なし)を実行してしまうと、Dockerfileに記述した pip install smbus2 や COPY . /app(ファイルの取り込み)が行われないまま、あるいは古いイメージが存在しない場合は No such file or directory などのエラーやファイル不足で起動に失敗します。対策: 初めて起動するとき、または
Dockerfile や tmpapp.py などのファイルを書き換えたときは、必ず docker compose up --build を実行してイメージを作り直してください。
停止とコンテナの削除
docker compose down