# Build wymaga submodułu vendor/Rex-EMoolator — composite build kompiluje :core # ze źródeł. Jeśli katalog jest pusty, settings.gradle przerwie z komunikatem. FROM eclipse-temurin:21-jdk AS build WORKDIR /src # najpierw sam opis buildu: zmiana w kodzie nie unieważnia pobranych zależności COPY gradlew settings.gradle build.gradle gradle.properties ./ COPY gradle ./gradle COPY vendor ./vendor RUN ./gradlew --no-daemon dependencies --configuration runtimeClasspath > /dev/null 2>&1 || true COPY src ./src # installDist zamiast build: pomija check, a więc i verifyCoreVersion, które # potrzebowałoby gita w obrazie. Wersję i tak przypina submoduł. RUN ./gradlew --no-daemon installDist \ && grep '^coreVersion=' gradle.properties | cut -d= -f2 > /src/core-version FROM eclipse-temurin:21-jre WORKDIR /app # obrazy płyt montowane z zewnątrz, tylko do odczytu; katalog danych to wolumen VOLUME ["/data"] # Transkrypcji mowy w obrazie nie ma i nie będzie: whisper.cpp plus model to # kilka gigabajtów, a katalog jest w pełni użyteczny bez nich — mówcę i kontekst # kwestii bierzemy z dialogi.dta. Front powie wprost, że narzędzia brakuje. # Kto chce transkrybować, robi to na hoście: rex-catalog transcribe. # file.encoding ustawia entrypoint przez JAVA_OPTS; JAVA_TOOL_OPTIONS robiłoby # to samo, ale JVM wypisuje wtedy "Picked up..." przy każdym uruchomieniu ENV CATALOG_DATA=/data COPY --from=build /src/build/install/rex-catalog /app COPY --from=build /src/core-version /app/core-version COPY docker-entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh \ && useradd --uid 10001 --create-home katalog \ && mkdir -p /data /media \ && chown katalog:katalog /data USER katalog EXPOSE 8765 ENTRYPOINT ["/app/entrypoint.sh"] # domyślnie wstajemy jako serwer; front i MCP dzielą port CMD ["serve", "--host", "0.0.0.0"]