# Run Streamlit on Firecracker Streamlit is an amazing library that allows one to build rich web applications in Python with a fantastic UI. Check out their website: https://www.streamlit.io. My first attempt was to install `streamlit` dependencies using native alpine packages. These dependencies are pretty heavy, and I increased rootfs size to 3GB. ``` $ apk add python3 python3-dev gfortran build-base py3-numpy $ apk add git libffi-dev zlib-dev libzmq zeromq-dev cmake $ pip3 install numpy>=1.16.4 $ pip3 install streamlit ``` In the very end, I had to compile pyarrow from the source code, which was, to put it lightly, a frustrating experience. I followed instructions from https://gist.github.com/bskaggs/fc3c8d0d553be54e2645616236fdc8c6: ```dockerfile ARROW_SHA1=2ede75769e12df972f0acdfddd53ab15d11e0ac2 ARG ARROW_BUILD_TYPE=release ENV ARROW_HOME=/usr/local \ PARQUET_HOME=/usr/local #Download and build apache-arrow RUN mkdir /arrow \ && apk add --no-cache curl \ && curl -o /tmp/apache-arrow.tar.gz -SL https://github.com/apache/arrow/archive/apache-arrow-${ARROW_VERSION}.tar.gz \ && echo "$ARROW_SHA1 *apache-arrow.tar.gz" | sha1sum /tmp/apache-arrow.tar.gz \ && tar -xvf /tmp/apache-arrow.tar.gz -C /arrow --strip-components 1 \ && mkdir -p /arrow/cpp/build \ && cd /arrow/cpp/build \ && cmake -DCMAKE_BUILD_TYPE=$ARROW_BUILD_TYPE \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_INSTALL_PREFIX=$ARROW_HOME \ -DARROW_PARQUET=on \ -DARROW_PYTHON=on \ -DARROW_PLASMA=on \ -DARROW_BUILD_TESTS=OFF \ .. \ && make -j$(nproc) \ && make install \ && cd /arrow/python \ && python setup.py build_ext --build-type=$ARROW_BUILD_TYPE --with-parquet \ && python setup.py install \ && rm -rf /arrow /tmp/apache-arrow.tar.gz ``` Depending on your environment, it may take some time to build everything, so pour yourself some hot liquid or watch a short YouTube video. However, that’s a lot of libraries to install! I had to manually resolve all dependencies to figure out which packages it requires under the hood. Not fun. It must be an easy way how to do this, right? I know that Conda maintains a solid repository, and thousands of volunteers help with the dependencies. I decided to give it a try. I’m going to use `continuumio/miniconda3` image as a base since it comes with a pre-built conda: ```dockerfile FROM continuumio/miniconda3:4.9.2-alpine RUN apk add openrc RUN apk add util-linux # Set up a login terminal on the serial console (ttyS0): RUN ln -s agetty /etc/init.d/agetty.ttyS0 RUN echo ttyS0 > /etc/securetty RUN rc-update add agetty.ttyS0 default # Make sure special file systems are mounted on boot: RUN rc-update add devfs boot RUN rc-update add procfs boot RUN rc-update add sysfs boot RUN echo 'root:root' | chpasswd # streamlit and dependencies: numpy, pandas, pyarrow, etc RUN apk add python3 py3-pip RUN apk add dbus sudo RUN . /root/.shinit RUN conda install -y pyarrow RUN pip3 install streamlit ``` Once an image is built, I have a lousy 600MB left on the device. Perhaps, later I can remove build dependencies and unneeded tests to reduce the size of the image. The final container is taking 530MiB of virtual memory and 220MiB of resident memory. It’s less than ideal, but knowing what libraries I had to install, it feels reasonable enough. Now, I can run streamlit inside a Firecracker. ``` # streamlit hello Welcome to Streamlit. Check out our demo in your browser. Network URL: http://172.16.0.2:8501 External URL: http://xxx.xxx.xxx.xxx:8501 Ready to create your own Python apps super quickly? Head over to https://docs.streamlit.io May you create awesome apps! ``` ![[streamlit-firecracker.png]]