DockerでStreamlitを起動するポイント
この投稿では、Python 3.11 を使った Streamlit アプリを Docker および Docker Compose で起動する方法をまとめます。よくあるエラーとその対処法も解説しています。
1. Dockerfile の例
FROM python:3.11
USER root
COPY requirements.txt .
RUN python3.11 -m pip install -r requirements.txt
WORKDIR /app
COPY ./app/car_color_category.py .
CMD ["streamlit", "run", "car_color_category.py", "--server.port=8501", "--server.address=0.0.0.0"]
ポイント:
-
WORKDIR /app:コンテナ内の作業ディレクトリを /app に設定 -
CMD:コンテナ起動時に Streamlit アプリを CLI 経由で実行 -
--server.address=0.0.0.0:コンテナ外からブラウザでアクセス可能にする
CMD の各要素の解説
-
"streamlit":実行するプログラム名。Streamlit の CLI を呼び出す -
"run":Streamlit にアプリを起動する指示を出すサブコマンド -
"car_color_category.py":起動する Python スクリプト -
"--server.port=8501":サーバーポートを指定(デフォルト 8501) -
"--server.address=0.0.0.0":コンテナ外からのアクセスを許可
2. docker-compose.yml の例
services:
python:
build:
context: .
dockerfile: Dockerfile
container_name: car_color_category_app
volumes:
- ./app:/app
- ./dataset_split:/app/dataset_split
stdin_open: true
tty: true
ports:
- "8501:8501"
command: streamlit run car_color_category.py --server.address=0.0.0.0 --server.port=8501
ポイント:
-
volumes:ローカルのファイルをコンテナにマウント。編集が即反映される -
./app:/app:アプリのソースコードをコンテナ内にマウント -
./dataset_split:/app/dataset_split:データセットを別ディレクトリにマウントし、コードとデータを分離 -
ports:ホストのポートとコンテナのポートを紐付け、ブラウザでアクセス可能にする -
command:Dockerfile の CMD を上書きし、起動オプションを柔軟に設定可能
3. 起動手順
docker compose down # 前のコンテナ停止
docker compose up --build
起動後、ブラウザで以下にアクセス:
http://localhost:85014. よくあるエラーと対処法
1. コンテナがすぐ終了する
症状:
- docker compose up するとすぐに exited with code 0 となる
原因:
- WORKDIR に合わせたファイルパスが間違っている
- volumes でローカルのディレクトリがコンテナ内のファイルを上書きしている
対処:
- docker-compose.yml の
commandはcar_color_category.pyだけで指定 - ローカルの
./app/car_color_category.pyが存在するか確認 - OneDrive 配下の場合、同期の影響でファイルが見えないことがあるので、通常フォルダに移動する
2. Python で直接実行してもアプリが起動しない
症状:
- ENTRYPOINT ["python3.12", "index.py"] のようにしたが、コンテナがすぐ終了
原因:
- Streamlit は CLI 経由で実行する必要がある
- Python で直接実行するとサーバは起動せず、スクリプトが終了するだけ
対処:
- CMD または docker-compose.yml の command で
streamlit run index.pyを指定
3. ホストからアクセスできない
原因:
- --server.address=0.0.0.0 を指定していない
- ports でホストとコンテナのポートが紐付いていない
対処:
- CMD または command に
--server.address=0.0.0.0を追加 - docker-compose.yml の ports を設定
"8501:8501"
4. No such file or directory (Trainフォルダが見つからない)
症状:
- コンテナ内でdataset_split/trainが見つからないというエラーが発生する。
原因:
- docker-compose.ymlでdataset_splitディレクトリがコンテナに正しくマウントされていない。
対処:
- docker-compose.ymlのvolumesセクションに- ./dataset_split:/app/dataset_splitの行を追加してください。
まとめ
- Streamlit は CLI で起動する必要がある
- CMD はデフォルト起動コマンド、Compose の command で上書き可能
- volumes と ports の設定でホットリロードとブラウザアクセスが可能
- コンテナがすぐ終了する場合はファイルパスやボリュームを確認
これらを押さえれば、Docker + Streamlit で効率よく開発・デプロイできます。