使用 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
后执行回车的操作,因为首次运行要求输入邮箱是一个可选操作,所以这样做变相的跳过了输入。
以上。