# Copyright (c) 2020 The Rector and Visitors of the University of Virginia
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
# documentation files (the "Software"), to deal in the Software without restriction, including without
# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
# Software, and to permit persons to whom the Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be included in all copies or substantial portions
# of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
# TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
FROM nvidia/cuda:12.9.1-devel-ubuntu24.04 AS build
ARG DEBIAN_FRONTEND=noninteractive
ARG LIGHTGBM_GIT_REF=stable
ARG LIGHTGBM_GIT_URL=https://github.com/lightgbm-org/LightGBM.git
ARG OPENCL_LIBRARIES=/usr/lib/x86_64-linux-gnu
ARG OPENCL_INCLUDE_DIR=/usr/include
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# SYSTEM
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
git \
ca-certificates \
libglib2.0-0 \
libxext6 \
libsm6 \
libxrender1 \
cmake \
libboost-dev \
libboost-system-dev \
libboost-filesystem-dev \
ocl-icd-opencl-dev \
gcc \
g++ && \
rm -rf /var/lib/apt/lists/*
# Add OpenCL ICD file so the OpenCL loader can find the NVIDIA driver
RUN mkdir -p /etc/OpenCL/vendors && \
echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd
# LightGBM
WORKDIR /opt
RUN git clone \
--recursive \
"${LIGHTGBM_GIT_URL}" && \
git -C ./LightGBM checkout "${LIGHTGBM_GIT_REF}" && \
cd LightGBM && \
cmake -B build -S . -DUSE_GPU=1 -DOpenCL_LIBRARY="${OPENCL_LIBRARIES}/libOpenCL.so" -DOpenCL_INCLUDE_DIR="${OPENCL_INCLUDE_DIR}" && \
cmake --build build -j"$(nproc --ignore=1)"
# Collect every shared library LightGBM links against (including glibc), so the
# runtime image uses the same versions it was built against instead of Debian's.
RUN mkdir -p /opt/LightGBM/lib && \
ldd /opt/LightGBM/lightgbm /opt/LightGBM/lib_lightgbm.so \
| awk '/=> \// {print $3}' \
| sort -u \
| xargs -I{} cp -L {} /opt/LightGBM/lib/
FROM gcr.io/distroless/cc-debian12:latest
COPY --from=build \
/opt/LightGBM/lightgbm \
/opt/LightGBM/lib_lightgbm.so \
/opt/LightGBM/
COPY --from=build /opt/LightGBM/lib/ /opt/LightGBM/lib/
COPY --from=build \
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 \
/lib64/
COPY --from=build /etc/OpenCL/vendors/nvidia.icd /etc/OpenCL/vendors/nvidia.icd
ENV PATH=/opt/LightGBM:${PATH}
ENV LD_LIBRARY_PATH=/opt/LightGBM/lib
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
ENTRYPOINT ["lightgbm"]