使用 Docker 部署 Streamlit

使用 Docker 部署 Streamlit

之所以写这篇文章,是因为昨晚在使用 Docker 部署使用 Streamlit 开发的小工具时遇到了一个问题。

安装使用过 Streamlit 的小伙伴都知道,首次使用 streamlit run app.py 的时候会要求输入邮箱,下图:

👋 Welcome to Streamlit!

If you’d like to receive helpful onboarding emails, news, offers, promotions, and the occasional swag, please enter your email address below. Otherwise, leave this field blank.

Email:

Docker 在构建镜像的时候是无交互的,所以构建镜像启动容器的时候,这一步就走不下去了,造成容器停止运行。

所以这里附上一个 Dockerfile 内容,希望能给遇到类似问题的小伙伴提供一些参考:

# 使用官方 Python 镜像作为基础镜像
FROM python:3.10.13

# 复制应用目录下的所有文件到容器中的工作目录
COPY ./app /app

# 设置工作目录
WORKDIR /app

# 使用阿里云 pip 镜像安装必要依赖,并授予 start.sh 脚本运行权限
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
    pip install -r requirements.txt && \
    chmod +x start.sh

# 暴露端口,如果使用 Docker Compose 这里不需要注明
EXPOSE 8501

# 运行启动脚本文件
CMD ["/start.sh"]

这个是 start.sh 中的代码:

#!/bin/bash
echo | streamlit run app.py

核心在 start.sh 脚本文件中,详细说明一下 echo | streamlit run app.py

  • echo: 是一个命令,用于在命令行中输出文本。在这个脚本中,它后面没有跟任何文本,所以实际上没有输出任何内容。
  • |: 是一个管道符号,它的作用是将左边命令的输出作为右边命令的输入。在这个脚本中,由于 echo 没有输出任何内容,所以实际上没有什么被传递给右边的命令。
  • streamlit run app.py: 就不多说了,运行 Streamlit 应用的命令。

这段脚本命令模拟了在执行 streamlit run app.py 后执行回车的操作,因为首次运行要求输入邮箱是一个可选操作,所以这样做变相的跳过了输入。


以上。