FROM ubuntu:oracular AS ze-monitor # From https://github.com/jketreno/ze-monitor RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ build-essential \ debhelper \ devscripts \ cmake \ git \ libfmt-dev \ libncurses-dev \ rpm \ rpm2cpio \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} RUN apt-get install -y \ software-properties-common \ && add-apt-repository -y ppa:kobuk-team/intel-graphics \ && apt-get update \ && apt-get install -y \ libze-dev \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} RUN git clone --depth 1 --branch v0.3.0-1 https://github.com/jketreno/ze-monitor /opt/ze-monitor WORKDIR /opt/ze-monitor/build RUN cmake .. \ && make \ && cpack FROM ubuntu:oracular AS airc # Get a couple prerequisites RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ gpg \ python3 \ python3-pip \ python3-venv \ wget \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} # Install Intel graphics runtimes RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y software-properties-common \ && add-apt-repository -y ppa:kobuk-team/intel-graphics \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ libze-intel-gpu1 \ libze1 \ intel-ocloc \ intel-opencl-icd \ xpu-smi \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} WORKDIR /opt/airc # Setup the ollama python virtual environment RUN python3 -m venv --system-site-packages /opt/airc/venv # Setup the docker pip shell RUN { \ echo '#!/bin/bash' ; \ echo 'source /opt/airc/venv/bin/activate' ; \ echo 'bash -c "${@}"' ; \ } > /opt/airc/shell ; \ chmod +x /opt/airc/shell # Activate the pip environment on all shell calls SHELL [ "/opt/airc/shell" ] # Install ollama python module RUN pip3 install ollama # pydle does not work with newer asyncio due to coroutine # being deprecated. Patch to work. COPY /src/pydle.patch /opt/pydle.patch RUN pip3 install pydle \ && patch -d /opt/airc/venv/lib/python3*/site-packages/pydle \ -p1 < /opt/pydle.patch \ && rm /opt/pydle.patch RUN pip install setuptools --upgrade RUN pip install ollama RUN pip install feedparser bs4 chromadb RUN pip install tiktoken SHELL [ "/bin/bash", "-c" ] RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ libncurses6 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} COPY --from=ze-monitor /opt/ze-monitor/build/ze-monitor-*deb /opt/ RUN dpkg -i /opt/ze-monitor-*deb && rm /opt/ze-monitor-*deb COPY /src/ /opt/airc/src/ SHELL [ "/bin/bash", "-c" ] RUN { \ echo '#!/bin/bash'; \ echo 'echo "Container: airc"'; \ echo 'set -e'; \ echo 'echo "Setting pip environment to /opt/airc"'; \ echo 'source /opt/airc/venv/bin/activate'; \ echo ''; \ echo 'if [[ "${1}" == "/bin/bash" ]] || [[ "${1}" =~ ^(/opt/airc/)?shell$ ]]; then'; \ echo ' echo "Dropping to shell"'; \ echo ' shift' ; \ echo ' echo "Running: ${@}"' ; \ echo ' if [[ "${1}" != "" ]]; then' ; \ echo ' exec ${@}'; \ echo ' else' ; \ echo ' exec /bin/bash'; \ echo ' fi' ; \ echo 'else'; \ echo ' echo "Launching AIRC chat server..."'; \ echo ' python src/airc.py "${@}"' ; \ echo 'fi'; \ } > /entrypoint.sh \ && chmod +x /entrypoint.sh ENTRYPOINT [ "/entrypoint.sh" ] FROM ubuntu:oracular AS ollama # Get a couple prerequisites RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ gpg \ wget \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} # Install Intel graphics runtimes RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y software-properties-common \ && add-apt-repository -y ppa:kobuk-team/intel-graphics \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ libze-intel-gpu1 \ libze1 \ intel-ocloc \ intel-opencl-icd \ xpu-smi \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} WORKDIR /opt/ollama # Download the nightly ollama release from ipex-llm RUN wget -qO - https://github.com/intel/ipex-llm/releases/download/v2.2.0-nightly/ollama-0.5.4-ipex-llm-2.2.0b20250226-ubuntu.tgz | \ tar --strip-components=1 -C . -xzv # Install Python from Oracular (ollama works with 3.12) RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ gpg \ python3 \ python3-pip \ python3-venv \ wget \ && apt-get clean \ && rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} # Setup the ollama python virtual environment RUN python3 -m venv --system-site-packages /opt/ollama/venv # Setup the docker pip shell RUN { \ echo '#!/bin/bash' ; \ update-alternatives --set python3 /opt/python/bin/python3.11 ; \ echo 'source /opt/ollama/venv/bin/activate' ; \ echo 'bash -c "${@}"' ; \ } > /opt/ollama/shell ; \ chmod +x /opt/ollama/shell # Activate the pip environment on all shell calls SHELL [ "/opt/ollama/shell" ] # Install ollama python module RUN pip3 install ollama SHELL [ "/bin/bash", "-c" ] RUN { \ echo '#!/bin/bash'; \ echo 'echo "Container: ollama"'; \ echo 'set -e'; \ echo 'echo "Setting pip environment to /opt/ollama"'; \ echo 'source /opt/ollama/venv/bin/activate'; \ echo 'export OLLAMA_NUM_GPU=999'; \ echo 'export ZES_ENABLE_SYSMAN=1'; \ echo 'export SYCL_CACHE_PERSISTENT=1'; \ echo 'export OLLAMA_KEEP_ALIVE=-1'; \ echo 'export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1'; \ echo ''; \ echo 'if [[ "${1}" == "/bin/bash" ]] || [[ "${1}" =~ ^(/opt/ollama/)?shell$ ]]; then'; \ echo ' echo "Dropping to shell"'; \ echo ' exec /bin/bash'; \ echo 'else'; \ echo ' echo "Launching Ollama server..."'; \ echo ' exec ./ollama serve'; \ echo 'fi'; \ } > /entrypoint.sh \ && chmod +x /entrypoint.sh RUN { \ echo '#!/bin/bash'; \ echo 'echo "Container: ollama"'; \ echo 'set -e'; \ echo 'echo "Setting pip environment to /opt/ollama"'; \ echo 'source /opt/ollama/venv/bin/activate'; \ echo './ollama pull mxbai-embed-large' ; \ echo './ollama pull deepseek-r1:7b' ; \ } > /fetch-models.sh \ && chmod +x /fetch-models.sh ENV PYTHONUNBUFFERED=1 VOLUME [" /root/.ollama" ] ENTRYPOINT [ "/entrypoint.sh" ] FROM airc AS jupyter SHELL [ "/opt/airc/shell" ] # BEGIN setup Jupyter RUN pip install jupyter \ jupyterlab==4.3.0a0 \ jupyterhub==5.0.0 \ notebook==7.3.0a0 \ "jupyter-server-proxy>=4.1.2" # END setup Jupyter SHELL [ "/bin/bash", "-c" ] RUN { \ echo '#!/bin/bash' ; \ echo 'echo "Container: airc jupyter"' ; \ echo 'if [[ ! -e "/root/.cache/hub/token" ]]; then' ; \ echo ' if [[ "${HF_ACCESS_TOKEN}" == "" ]]; then' ; \ echo ' echo "Set your HF access token in .env as: HF_ACCESS_TOKEN=" >&2' ; \ echo ' exit 1' ; \ echo ' else' ; \ echo ' if [[ ! -d '/root/.cache/hub' ]]; then mkdir -p /root/.cache/hub; fi' ; \ echo ' echo "${HF_ACCESS_TOKEN}" > /root/.cache/hub/token' ; \ echo ' fi' ; \ echo 'fi' ; \ echo 'update-alternatives --set python3 /opt/python/bin/python3.11' ; \ echo 'if [[ -e /opt/intel/oneapi/setvars.sh ]]; then source /opt/intel/oneapi/setvars.sh; fi' ; \ echo 'source /opt/airc/venv/bin/activate' ; \ echo 'if [[ "${1}" == "shell" ]]; then echo "Dropping to shell"; /bin/bash; exit $?; fi' ; \ echo 'while true; do' ; \ echo ' echo "Launching jupyter notebook"' ; \ echo ' jupyter notebook \' ; \ echo ' --notebook-dir=/opt/jupyter \' ; \ echo ' --port 8888 \' ; \ echo ' --ip 0.0.0.0 \' ; \ echo ' --no-browser \' ; \ echo ' --allow-root \' ; \ echo ' --ServerApp.token= \' ; \ echo ' --ServerApp.password= \' ; \ echo ' --ServerApp.allow_origin=* \' ; \ echo ' --ServerApp.base_url="/jupyter" \' ; \ echo ' "${@}" \' ; \ echo ' 2>&1 | tee -a "/root/.cache/jupyter.log"' ; \ echo ' echo "jupyter notebook died ($?). Restarting."' ; \ echo ' sleep 5' ; \ echo 'done' ; \ } > /entrypoint-jupyter.sh \ && chmod +x /entrypoint-jupyter.sh ENTRYPOINT [ "/entrypoint-jupyter.sh" ]