# Base UBI image for s390x architecture ARG BASE_UBI_IMAGE_TAG=9.5-1736404155 ARG PYTHON_VERSION=3.12 FROM registry.access.redhat.com/ubi9/ubi-minimal:${BASE_UBI_IMAGE_TAG} AS base # Install basic dependencies ARG PYTHON_VERSION ENV PYTHON_VERSION=${PYTHON_VERSION} WORKDIR /workspace ENV LANG=C.UTF-8 \ LC_ALL=C.UTF-8 # Install development utilities RUN microdnf install -y \ which procps findutils tar vim git gcc gcc-gfortran g++ make patch zlib-devel \ libjpeg-turbo-devel libtiff-devel libpng-devel libwebp-devel freetype-devel harfbuzz-devel \ openssl-devel openblas openblas-devel autoconf automake libtool cmake && \ microdnf clean all # Python Installation FROM base AS python-install ARG PYTHON_VERSION ENV VIRTUAL_ENV=/opt/vllm ENV PATH="$VIRTUAL_ENV/bin:$PATH" ENV PYTHON_VERSION=${PYTHON_VERSION} RUN microdnf install -y \ python${PYTHON_VERSION}-devel python${PYTHON_VERSION}-pip python${PYTHON_VERSION}-wheel && \ python${PYTHON_VERSION} -m venv $VIRTUAL_ENV && pip install --no-cache -U pip wheel uv && microdnf clean all FROM python-install AS pyarrow # Build Apache Arrow WORKDIR /tmp RUN --mount=type=cache,target=/root/.cache/uv \ git clone https://github.com/apache/arrow.git && \ cd arrow/cpp && \ mkdir release && cd release && \ cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DARROW_PYTHON=ON \ -DARROW_PARQUET=ON \ -DARROW_ORC=ON \ -DARROW_FILESYSTEM=ON \ -DARROW_WITH_LZ4=ON \ -DARROW_WITH_ZSTD=ON \ -DARROW_WITH_SNAPPY=ON \ -DARROW_JSON=ON \ -DARROW_CSV=ON \ -DARROW_DATASET=ON \ -DPROTOBUF_PROTOC_EXECUTABLE=/usr/bin/protoc \ -DARROW_DEPENDENCY_SOURCE=BUNDLED \ .. && \ make -j$(nproc) && \ make install && \ cd ../../python && \ export PYARROW_PARALLEL=4 && \ export ARROW_BUILD_TYPE=release && \ uv pip install -r requirements/build.txt && \ python setup.py build_ext --build-type=$ARROW_BUILD_TYPE --bundle-arrow-cpp bdist_wheel FROM python-install AS numa-build # Install numactl (needed for numa.h dependency) WORKDIR /tmp RUN curl -LO https://github.com/numactl/numactl/archive/refs/tags/v2.0.16.tar.gz && \ tar -xvzf v2.0.16.tar.gz && \ cd numactl-2.0.16 && \ ./autogen.sh && \ ./configure && \ make # Set include path ENV C_INCLUDE_PATH="/usr/local/include:$C_INCLUDE_PATH" FROM python-install AS rust ENV CARGO_HOME=/root/.cargo ENV RUSTUP_HOME=/root/.rustup ENV PATH="$CARGO_HOME/bin:$RUSTUP_HOME/bin:$PATH" RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ . "$CARGO_HOME/env" && \ rustup default stable && \ rustup show FROM python-install AS torch-vision # Install torchvision ARG TORCH_VERSION=2.7.0.dev20250304 ARG TORCH_VISION_VERSION=v0.20.1 WORKDIR /tmp RUN --mount=type=cache,target=/root/.cache/uv \ git clone https://github.com/pytorch/vision.git && \ cd vision && \ git checkout $TORCH_VISION_VERSION && \ uv pip install -v torch==${TORCH_VERSION} --extra-index-url https://download.pytorch.org/whl/nightly/cpu && \ python setup.py bdist_wheel # Final build stage FROM python-install AS vllm-cpu ARG PYTHON_VERSION # Set correct library path for torch and numactl ENV LD_LIBRARY_PATH="/opt/vllm/lib64/python${PYTHON_VERSION}/site-packages/torch/lib:/usr/local/lib:$LD_LIBRARY_PATH" ENV C_INCLUDE_PATH="/usr/local/include:$C_INCLUDE_PATH" ENV UV_LINK_MODE=copy ENV CARGO_HOME=/root/.cargo ENV RUSTUP_HOME=/root/.rustup ENV PATH="$CARGO_HOME/bin:$RUSTUP_HOME/bin:$PATH" COPY . /workspace/vllm WORKDIR /workspace/vllm RUN --mount=type=bind,from=numa-build,src=/tmp/numactl-2.0.16,target=/numactl \ make -C /numactl install # Install dependencies, including PyTorch and Apache Arrow RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,from=rust,source=/root/.cargo,target=/root/.cargo,rw \ --mount=type=bind,from=rust,source=/root/.rustup,target=/root/.rustup,rw \ --mount=type=bind,from=pyarrow,source=/tmp/arrow/python/dist,target=/tmp/arrow-wheels \ --mount=type=bind,from=torch-vision,source=/tmp/vision/dist,target=/tmp/vision-wheels/ \ sed -i '/^torch/d' requirements/build.txt && \ ARROW_WHL_FILE=$(ls /tmp/arrow-wheels/pyarrow-*.whl | head -n 1) && \ VISION_WHL_FILE=$(ls /tmp/vision-wheels/*.whl | head -n 1) && \ uv pip install -v \ $ARROW_WHL_FILE \ $VISION_WHL_FILE \ --extra-index-url https://download.pytorch.org/whl/nightly/cpu \ --index-strategy unsafe-best-match \ -r requirements/build.txt \ -r requirements/cpu.txt # Build and install vllm RUN --mount=type=cache,target=/root/.cache/uv \ VLLM_TARGET_DEVICE=cpu python setup.py bdist_wheel && \ uv pip install "$(echo dist/*.whl)[tensorizer]" # setup non-root user for vllm RUN umask 002 && \ useradd --uid 2000 --gid 0 vllm && \ mkdir -p /home/vllm && \ chmod g+rwx /home/vllm COPY LICENSE /licenses/vllm.md COPY examples/*.jinja /app/data/template/ USER 2000 WORKDIR /home/vllm # Set the default entrypoint ENTRYPOINT ["python", "-m", "vllm.entrypoints.openai.api_server"]