FROM node:22.17.0-alpine3.22 AS base
WORKDIR /usr/src/app

RUN npm install -g pnpm@10.27.0
RUN apk add --no-cache libc6-compat gcompat libaio libnsl
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"

# Install oracle client
FROM base AS build
RUN apk add --update --no-cache build-base g++ make python3 unzip
RUN mkdir -p /opt/oracle/instantclient && mkdir -p /etc/ld.so.conf.d \
    && cd /opt/oracle \
    && wget -q https://images.apimaker.dev/prod/am-cloud/binaries/oracle-clients/23.26.1/instantclient-basic-linuxx64.zip \
    && unzip instantclient-basic-linuxx64.zip \
    && sh -c "echo /opt/oracle/instantclient > /etc/ld.so.conf.d/oracle-instantclient.conf" \
    && ldconfig /etc/ld.so.conf.d/oracle-instantclient.conf

# install custom packages here like below
# RUN apk add g++ make python3

ARG A_DOCKERFILE_HASH
ENV A_DOCKERFILE_HASH=${A_DOCKERFILE_HASH}

ARG A_PACKAGE_JSON_HASH
ENV A_PACKAGE_JSON_HASH=${A_PACKAGE_JSON_HASH}
COPY package*.json pnpm*.yaml yarn*.lock ./
RUN pnpm install --dangerously-allow-all-builds


FROM base AS runtime
COPY --from=build /opt/oracle/instantclient /opt/oracle/instantclient
COPY --from=build /etc/ld.so.conf.d /etc/ld.so.conf.d
COPY --from=build /usr/src/app ./
ENV PATH="/opt/oracle/instantclient:${PATH}"

ARG A_CODE_HASH
ENV A_CODE_HASH=${A_CODE_HASH}

ARG NODE_OPTIONS
ENV NODE_OPTIONS=${NODE_OPTIONS}

COPY . .

# So, if we add new package, we won't have to build above base things.
ARG A_NEW_PACKAGES_INSTALL_CMD
ENV A_NEW_PACKAGES_INSTALL_CMD=${A_NEW_PACKAGES_INSTALL_CMD}
RUN $A_NEW_PACKAGES_INSTALL_CMD

EXPOSE 4631 4632 9229
CMD [ "npm", "run", "start" ]
