Open5

mac OSにPython Streamlit Dockerコンテナをインストールしてみた

Teru roomTeru room

作業環境

  • Mac Book Pro 2017 Intel Core i5デュアルコア3.1GHz
  • macOS Ventura

Docker Desktopをインストール

Dockerコンテナの動作を確認します

  • hello-worldコンテナを起動します
(base) macpro:~ sharland$
sudo docker run hello-world
Password:
password
実行結果 `Hello from Docker!` と表示されます
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
  • Dockerイメージを確認します
(base) macpro:~ sharland$
docker images
EPOSITORY          TAG          IMAGE ID       CREATED          SIZE           
hello-world         latest       feb5d9fea6a5   17 months ago    13.3kB
  • Dockerイメージを削除します
(base) macpro:~ sharland$
docker rmi feb5d9fea6a5
実行結果 コンテナプロセスが動いているのでエラーが表示されます
コンテナプロセスが動いているのでエラーが表示されます
Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 41649c895cdb
(base) macpro:app sharland$ コンテナプロセスを削除します
docker rm 41649c895cdb
実行結果 コンテナプロセスのコンテナIDが表示されれば成功です
実行結果 コンテナプロセスのコンテナIDが表示されれば成功です
41649c895cdb
  • 再度Dockerイメージを削除します
(base) macpro:~ sharland$
docker rmi feb5d9fea6a5
実行結果 `Deleted`と表示されます
Deletedと表示されます
Untagged: hello-world:latest
Untagged: hello-world@sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
Teru roomTeru room

Dockerfileを作成します

  • 作業用のディレクトリを作成します
(base) macpro:~ sharland$
mkdir -p ./dev/streamlit/sample && cd ./dev/streamlit/sample 
  • Streamlit公式のサンプルのDockerfileを作成します
(base) macpro:sample sharland$
mkdir app && cd app && vim Dockerfile
  • Streamlit公式のgitHubからサンプルをクローンするDockerfileです
    • ローカルからサンプルをコピーする場合にはRUN git clone の行をCOPY . .に置き換えます
app/Dockerfile
# app/Dockerfile

FROM python:3.9-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    software-properties-common \
    git \
    && rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/streamlit/streamlit-example.git .

RUN pip3 install -r requirements.txt

EXPOSE 8501

HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health

ENTRYPOINT ["streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
Teru roomTeru room

Dockerイメージをビルドします

docker build -t sample-app .
実行結果 `FINISHED`と表示されます
[+] Building 122.7s (9/9) FINISHED                                              
 => [internal] load build definition from Dockerfile                       0.1s
 => => transferring dockerfile: 540B                                       0.0s
 => [internal] load .dockerignore                                          0.1s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/python:3.9-slim         3.0s
 => [1/5] FROM docker.io/library/python:3.9-slim@sha256:3bab254e90bb0986e  9.1s
 => => resolve docker.io/library/python:3.9-slim@sha256:3bab254e90bb0986e  0.0s
 => => sha256:3bab254e90bb0986ead59a3d415e719439e629d0ff3 1.86kB / 1.86kB  0.0s
 => => sha256:3b84e2bcb3ecfd58ccf82cc7fb582b68097cf8296f2 1.37kB / 1.37kB  0.0s
 => => sha256:2f89942f8067165e3b02aaea7991c058c70651d790c 7.78kB / 7.78kB  0.0s
 => => sha256:bb263680fed18eecdc67f885094df6f589bafc190 31.41MB / 31.41MB  4.2s
 => => sha256:43900b2bbd7f3a41cc0b3afe622d03b882980d3997c 1.08MB / 1.08MB  1.2s
 => => sha256:0c132e701ca658c9a0648f434189e8650a3744ab4 11.16MB / 11.16MB  5.4s
 => => sha256:69deeac200aa4d5b49bacf7b79f3fc80aa7be2d4c109c93 233B / 233B  1.5s
 => => sha256:8d65da2efb8d3d4ea6a1fee2b4b6592e75d9d8907df 3.17MB / 3.17MB  3.8s
 => => extracting sha256:bb263680fed18eecdc67f885094df6f589bafc19004839d7  2.5s
 => => extracting sha256:43900b2bbd7f3a41cc0b3afe622d03b882980d3997c006ab  0.3s
 => => extracting sha256:0c132e701ca658c9a0648f434189e8650a3744ab408bc5c4  1.0s
 => => extracting sha256:69deeac200aa4d5b49bacf7b79f3fc80aa7be2d4c109c933  0.0s
 => => extracting sha256:8d65da2efb8d3d4ea6a1fee2b4b6592e75d9d8907dfbcf9f  0.4s
 => [2/5] WORKDIR /app                                                     0.2s
 => [3/5] RUN apt-get update && apt-get install -y     build-essential    58.2s
 => [4/5] RUN git clone https://github.com/streamlit/streamlit-example.gi  1.4s
 => [5/5] RUN pip3 install -r requirements.txt                            40.2s 
 => exporting to image                                                    10.5s 
 => => exporting layers                                                   10.4s 
 => => writing image sha256:a6d87a0a5a186afccf4479bdc91240595ad74440a5d8f  0.0s 
 => => naming to docker.io/library/sample-app                              0.0s 
  • Dockerイメージが出来ているかを確認します
(base) macpro:app sharland$
docker images
実行結果 REPOSITORY や IMAGE ID が表示されます
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
sample-app   latest    a6d87a0a5a18   About an hour ago   971MB
Teru roomTeru room

Dockerコンテナを起動します

  • コンテナとホストのポート8051でDockerイメージsample-appを実行します
docker run -p 8501:8501 sample-app
実行結果`You can now view your Streamlit app in your browser. `と表示されれば正常に動作しています
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.

  You can now view your Streamlit app in your browser.

  URL: http://0.0.0.0:8501
  • ctrl+Cでコンテナの動作を停止することができます
  • ターミナルウィンドウを閉じてもコンテナはそのまま動作し続けます

公式サンプルStreamlitアプリの動作を確認します

  • Webブラウザで以下のURLを表示させます
  • 以下のようにアプリが表示されます
Teru roomTeru room

Docker Desktopアプリを使ってコンテナを起動してみます

  • Docker Desktopアプリを起動します
  • コンテナレポジトリ名sample-app行の右端のRUN▶︎ボタンをクリックします
  • New ContainerダイアログでRUNボタンをクリックします