CODE $\Sigma$

2023/02/24
Dockerを用いたStreamlitの環境構築

Streamlitの実行環境をDockerを使って作成した。MySQLとも接続し、phpmyadminにてデータベースの内容を確認できるようにしている。

Dockerのコード

docker-compose.yaml

version: '3'

networks: 
  python_network:
    driver: bridge
    ipam:
      driver: default
      config:
       - subnet: 192.168.2.0/24
         gateway: 192.168.2.1

services:
  db:

    image: mysql:8.0
    # コンテナ名
    container_name: "db"
    # コンテナの作成に使用するDockerfileのパス
    # ホスト側のポート:コンテナ側のポートを指定
    expose:
      - "3306"
    ports:
      - "3306:3306"
    # 環境変数の指定
    environment:
      - "MYSQL_ROOT_PASSWORD=password"
      - "MYSQL_DATABASE=streamlit_database"
      - "MYSQL_USER=wander"
      - "MYSQL_PASSWORD=password"
    volumes:
      - "../db:/var/lib/mysql"
    networks:
      python_network:
        ipv4_address: 192.168.2.2    

  asdf:
    hostname: wander-server
    container_name: asdf
    build:
      dockerfile: "Dockerfile"
    volumes: 
      - ../:/root/ws # app.pyがあるフォルダをマウントしています
    expose:
      - "8501"
    ports:
      - "8888:8501"
    links:
      - db
    depends_on:
      - db
    working_dir: "/root/ws"
    tty: true
    restart: always
    networks:
      - python_network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db #mysqlサービス名を指定
      - PMA_USER=wander
      - PMA_PASSWORD=password
    links:
      - db
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
    tty: true
    restart: always
    networks:
     - python_network

Dockerfile

FROM python:3.10
RUN apt-get update && apt-get install -y --no-install-recommends \
    apt-utils git curl vim unzip openssh-client wget \
    build-essential cmake \
    libopenblas-dev \
    libglib2.0-0 \
    libsm6 \
    libxext6 \
    libxrender-dev \
    sudo

RUN sudo apt-get upgrade -y && sudo apt-get update
RUN pip install --upgrade pip
RUN pip install streamlit mysql-connector-python

build

buildするには、以下のコマンドでできる。

docker compose build

Streamlitのコード

下記のように書くことで、データベースにつなげることができる。ほぼ公式のチュートリアルと同じです。
app.py

import streamlit as st
import mysql.connector
import time

# mysqlとの接続
@st.cache_resource
def init_connection():
    return mysql.connector.connect(**st.secrets["mysql"])
conn = init_connection()

@st.cache_data(ttl=600)
def run_query(query):
    with conn.cursor() as cur:
        cur.execute(query)
        return cur.fetchall()

rows = run_query("SELECT * from pets;")

データベースとの接続情報が書かれたsecrets.tomlは下記のようである。hostのip addressはdocker-compose.yamlに書いてあるものに合わせてある。

[mysql]
host = "192.168.2.2"
port = 3306
database = "streamlit_database"
user = "wander"
password = "password"

実行

下記のコマンドでコンテナを作成する。

docker compose up -d # コンテナ作成
docker compose exec asdf bash # streamlitのコンテナに入る

# コンテナ内
cd /path/to/app.py
streamlit run app.py

localhost:4040にアクセスすると、phpmyadminのページに移動する。そこでpets tableを作成し、データを入れておくこと。
localhost:8888にアクセスすると、streamlitのページが開く。

参考文献

下記のサイトが非常に参考になった。

https://qiita.com/harissa/items/117931ed3b15c8e6ad3b