Вот собрали мы какое-то API, скажем. Завернули в docker. И нужно к нему сделать простенький визуальный клиент. И всё это в один docker-compose собрать. Для таких случаев и подходит этот образ.
Здесь взят python (3.7-slim), установлен Streamlit и еще пара пакетов. В т.ч. requests, что делает возможной удобную работу с API. Что еще - см. в requirements.txt.
Предположим, имеется такая структура директорий:
my_project
├── streamlit_app
│ ├── main.py
│ └── ...
└── ...
Тогда нужно просто сделать так:
docker run -p 8501:8501 -v ./streamlit_app:/app bubulmet/streamlit-frontend
Или в docker-compose.yml:
services:
streamlit_app:
image: bubulmet/streamlit-frontend
volumes:
- ./streamlit_app:/app
ports:
- 8501:8501
Принципиальные моменты:
- ожидает, что основной Streamlit-скрипт будет называться
main.py. Именно его запускает. - ищет
main.pyв директории/app, поэтому именно к ней mount'им локальную директорию с проектом.
Если Streamlit-скрипту нужно передать какие-то параметры, можно это делать через переменные среды. Например, при локальной отладке (без докера) я хочу, чтобы скрипт обращался к API по адресу localhost; а когда будет собран docker-compose, нужно будет обращаться к сервису my_api. Тогда можно поступить так:
- в Streamlit-скрипте:
import os
API_HOST = os.getenv('STREAMLIT_API_HOST')
- при разработке (без docker) (в bash):
export STREAMLIT_API_HOST=localhost
- в
docker-compose.yml:
services:
my_api:
...
streamlit_app:
image: bubulmet/streamlit-frontend
volumes:
- ./streamlit_app:/app
ports:
- 8501:8501
environment:
- STREAMLIT_API_HOST=my_api
API здорово писать на FastAPI, и потом полное приложение завернуть в Traefik. И в итоге у нас есть полноценное веб-приложение.
docker build --tag streamlit-frontend .docker tag streamlit-frontend bubulmet/streamlit-frontenddocker logoutdocker logindocker push bubulmet/streamlit-frontend
А там можно подключить автобилд! Так что более вручную это делать не требуется: после коммита в ветку main на GitHub, на DockerHub автоматом новая версия сбилдится.