FROM almalinux:10.1-minimal@sha256:7e4fd6b1a34ef63762ff03a48cefad1e5ca8660c18d1dc850023d44fde73587c

LABEL maintainer="cyclonedx" \
      org.opencontainers.image.authors="Prabhu Subramanian <prabhu@appthreat.com>" \
      org.opencontainers.image.source="https://github.com/cdxgen/cdxgen" \
      org.opencontainers.image.url="https://github.com/cdxgen/cdxgen" \
      org.opencontainers.image.version="12.1.x" \
      org.opencontainers.image.vendor="cyclonedx" \
      org.opencontainers.image.licenses="Apache-2.0" \
      org.opencontainers.image.title="cdxgen" \
      org.opencontainers.image.description="Container image for cdxgen SBOM generator" \
      org.opencontainers.docker.cmd="docker run --rm -v /tmp:/tmp -p 9090:9090 -v $(pwd):/app:rw -t ghcr.io/cyclonedx/cdxgen-ppc64 -r /app --server"

ARG SBT_VERSION=1.12.1
# renovate: datasource=maven lookupName=org.apache.maven:maven
ARG MAVEN_VERSION=3.9.12
# renovate: datasource=gradle-version depName=gradle
ARG GRADLE_VERSION=9.4.0
# renovate: datasource=golang-version depName=golang
ARG GO_VERSION=1.26.1
ARG PYTHON_VERSION=3.12

ENV GOPATH=/opt/app-root/go \
    SBT_VERSION=$SBT_VERSION \
    MAVEN_VERSION=$MAVEN_VERSION \
    GRADLE_VERSION=$GRADLE_VERSION \
    GRADLE_OPTS="-Dorg.gradle.daemon=false" \
    MAVEN_HOME="/root/.sdkman/candidates/maven/${MAVEN_VERSION}" \
    GRADLE_HOME="/root/.sdkman/candidates/gradle/${GRADLE_VERSION}" \
    SBT_HOME="/root/.sdkman/candidates/sbt/${SBT_VERSION}" \
    PYTHON_VERSION=3.12 \
    PYTHON_CMD=/usr/bin/python3.12 \
    PYTHONUNBUFFERED=1 \
    PYTHONIOENCODING="utf-8" \
    COMPOSER_ALLOW_SUPERUSER=1 \
    CDXGEN_IN_CONTAINER=true \
    SDKMAN_DIR=/root/.sdkman \
    DOTNET_CLI_TELEMETRY_OPTOUT=1 \
    SDKMAN_CANDIDATES_DIR=/root/.sdkman/candidates \
    PYTHONPATH=/opt/pypi
ENV PATH=${PATH}:${JAVA_HOME}/bin:${MAVEN_HOME}/bin:${GRADLE_HOME}/bin:${SBT_HOME}/bin:${GOPATH}/bin:/usr/local/go/bin:/usr/local/bin/:/root/.local/bin:/${HOME}/.cargo/bin:${PYTHONPATH}/bin

RUN set -e; \
    ARCH_NAME="$(rpm --eval '%{_arch}')"; \
    url=; \
    case "${ARCH_NAME##*-}" in \
        'x86_64') \
            OS_ARCH_SUFFIX=''; \
            GOBIN_VERSION='amd64'; \
            ;; \
        'aarch64') \
            OS_ARCH_SUFFIX='-aarch64'; \
            GOBIN_VERSION='arm64'; \
            ;; \
        'ppc64le') \
            OS_ARCH_SUFFIX='-ppc64le'; \
            GOBIN_VERSION='ppc64le'; \
            ;; \
        *) echo >&2 "error: unsupported architecture: '$ARCH_NAME'"; exit 1 ;; \
    esac; \
    echo -e "[nodejs]\nname=nodejs\nstream=20\nprofiles=\nstate=enabled\n" > /etc/dnf/modules.d/nodejs.module \
    && microdnf install --nodocs -y php php-curl php-zip php-bcmath php-json php-pear php-mbstring php-devel make gcc git-core \
        python${PYTHON_VERSION} python${PYTHON_VERSION}-devel python${PYTHON_VERSION}-pip ruby ruby-devel java-21-openjdk-headless \
        pcre2 which tar gzip zip unzip bzip2 sudo nodejs ncurses gnupg2 sqlite-devel \
    && alternatives --install /usr/bin/python3 python /usr/bin/python${PYTHON_VERSION} 10 \
    && alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 10 \
    && python${PYTHON_VERSION} --version \
    && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
    && source "$HOME/.cargo/env" \
    && cargo --version \
    && rustc --version \
    && python${PYTHON_VERSION} -m pip install --no-cache-dir --upgrade pip virtualenv \
    && python${PYTHON_VERSION} -m pip install --no-cache-dir --upgrade pipenv poetry uv --target /opt/pypi \
    && curl -s "https://get.sdkman.io" | bash \
    && echo -e "sdkman_auto_answer=true\nsdkman_selfupdate_feature=false\nsdkman_auto_env=true" >> $HOME/.sdkman/etc/config \
    && source "$HOME/.sdkman/bin/sdkman-init.sh" \
    && sdk install maven $MAVEN_VERSION \
    && sdk install gradle $GRADLE_VERSION \
    && sdk install sbt $SBT_VERSION \
    && microdnf install -y epel-release \
    && curl -LO "https://dl.google.com/go/go${GO_VERSION}.linux-${GOBIN_VERSION}.tar.gz" \
    && tar -C /usr/local -xzf go${GO_VERSION}.linux-${GOBIN_VERSION}.tar.gz \
    && rm go${GO_VERSION}.linux-${GOBIN_VERSION}.tar.gz \
    && go telemetry off \
    && curl -LO "https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein" \
    && chmod +x lein \
    && mv lein /usr/local/bin/ \
    && /usr/local/bin/lein \
    && curl -L -O https://github.com/clojure/brew-install/releases/latest/download/linux-install.sh \
    && chmod +x linux-install.sh \
    && ./linux-install.sh && rm linux-install.sh \
    && useradd -ms /bin/bash cyclonedx \
    && npm install -g corepack \
    && npm install -g @microsoft/rush --omit=dev \
    && pecl channel-update pecl.php.net \
    && pecl install timezonedb \
    && echo 'extension=timezonedb.so' >> /etc/php.ini \
    && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php \
    && mv composer.phar /usr/local/bin/composer \
    && gem install bundler cocoapods \
    && gem --version \
    && bundler --version
COPY . /opt/cdxgen
RUN cd /opt/cdxgen && corepack enable && corepack pnpm install:prod && corepack pnpm cache delete \
    && chown -R cyclonedx:cyclonedx /opt/cdxgen \
    && chmod a-w -R /opt \
    && rm -rf /root/.cache /var/cache/yum /root/.cargo \
    && microdnf clean all
WORKDIR /app
ENTRYPOINT ["node", "/opt/cdxgen/bin/cdxgen.js"]