diff --git a/.github/workflows/build-java-base.yml b/.github/workflows/build-java-base.yml new file mode 100644 index 000000000000..9371564216f0 --- /dev/null +++ b/.github/workflows/build-java-base.yml @@ -0,0 +1,57 @@ +name: Build SDKMan Base java image +on: + workflow_dispatch: + inputs: + sdkman_java_version: + description: 'SDKMAN version string run "sdk list java" for options' + required: true + multi_arch: + description: 'Multi-arch flag, true: linux/amd64,linux/arm64 or false: linux/amd64' + type: boolean + required: false + default: true + push: + description: 'Push flag' + type: boolean + required: false + default: true +jobs: + build_image: + name: Build Docker Base Image + runs-on: ubuntu-20.04 + steps: + - name: Checkout core + uses: actions/checkout@v4 + - name: Set Common Vars + run: | + PLATFORMS='linux/amd64' + [[ "${{ github.event.inputs.multi_arch }}" == 'true' ]] && PLATFORMS='linux/amd64,linux/arm64' + + echo "PLATFORMS=${PLATFORMS}" >> $GITHUB_ENV + - name: Set up QEMU + uses: docker/setup-qemu-action@v3.0.0 + with: + platforms: amd64,arm64 + if: github.event.inputs.multi_arch == 'true' + - id: docker-setup-buildx + name: Docker Setup Buildx + uses: docker/setup-buildx-action@v3.0.0 + with: + platforms: ${{ env.PLATFORMS }} + driver-opts: | + image=moby/buildkit:v0.12.2 + if: github.event.inputs.multi_arch == 'true' + - name: Docker Hub login + uses: docker/login-action@v3.0.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5.0.0 + with: + context: ./docker/java-base + push: ${{ github.event.inputs.push }} + tags: ${{ github.event.inputs.tags }} + platforms: ${{ env.PLATFORMS }} + build-args: + SDKMAN_JAVA_VERSION=${{ github.event.inputs.sdkman_java_version }} diff --git a/docker/java-base/Dockerfile b/docker/java-base/Dockerfile index f19eeb5d65a0..104c03cc411e 100644 --- a/docker/java-base/Dockerfile +++ b/docker/java-base/Dockerfile @@ -1,48 +1,47 @@ # ---------------------------------------------- # Stage 1: Minimal java image with sdkman + Ubuntu LTS # ---------------------------------------------- -FROM mcr.microsoft.com/openjdk/jdk:11-ubuntu as base-builder +FROM ubuntu:20.04 AS base-builder WORKDIR /srv -# Defining default Java, can be any java provided by sdkman -ARG JAVA_VERSION="11.0.17-amzn" +# Defining default Java version, can be any java version provided by sdkman +ARG SDKMAN_JAVA_VERSION="11.0.22-ms" ENV JAVA_OUTPUT_DIR="/java" ENV DEBIAN_FRONTEND=noninteractive ENV PATH="$PATH:/java/bin" +ENV SDKMAN_DIR="/root/.sdkman" +ENV PATH="$SDKMAN_DIR/bin:$PATH" -# Installing basic packages +# Installing basic packages and SDKMAN RUN apt update && \ apt upgrade -y && \ - apt install -y --no-install-recommends zip unzip wget libtcnative-1 tzdata tini ca-certificates openssl libapr1 libpq-dev - -# Install curl -RUN wget -O - https://repo.dotcms.com/artifactory/ext-release-local/com/dotcms/curl-static/curl-`uname -m` | install /dev/stdin /usr/bin/curl && \ - chmod a+x /usr/bin/curl + apt install -y --no-install-recommends zip unzip wget libtcnative-1 tzdata tini ca-certificates openssl libapr1 libpq-dev curl gnupg && \ + rm -rf /var/lib/apt/lists/* && \ + wget -O - https://get.sdkman.io | bash && \ + bash -c "source $SDKMAN_DIR/bin/sdkman-init.sh && sdk install java ${SDKMAN_JAVA_VERSION} && sdk flush archives" && \ + apt update && \ + apt install -y --no-install-recommends postgresql-common && \ + /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y && \ + apt install -y --no-install-recommends postgresql-client-16 && \ + apt purge -y postgresql-common gnupg && \ + /usr/bin/pg_dump --version || exit 1 && \ + rm -rf /var/lib/apt/lists/* -RUN jlink \ +# Create a custom JRE using jlink +RUN bash -c "source $SDKMAN_DIR/bin/sdkman-init.sh && jlink \ --verbose \ --add-modules \ java.base,jdk.crypto.ec,jdk.jdwp.agent,jdk.management,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument,jdk.unsupported,java.scripting,java.rmi,jdk.compiler,jdk.zipfs,jdk.naming.dns,jdk.localedata,java.xml,jdk.xml.dom \ --compress 2 \ --no-header-files \ --no-man-pages \ - --output "$JAVA_OUTPUT_DIR" - -# install postgres clients, for pg_dump -ARG PG_BUILD_PACKAGES="postgresql-common gnupg" - -RUN apt install -y --no-install-recommends $PG_BUILD_PACKAGES \ - && /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y \ - && apt install -y postgresql-client-16 \ - && apt purge -y $PG_BUILD_PACKAGES - -RUN /usr/bin/pg_dump --version || exit 1 + --output \"$JAVA_OUTPUT_DIR\"" # Cleanup RUN rm -rf /root/.sdkman && \ - apt purge -y zip unzip wget msopenjdk-11 packages-microsoft-prod fontconfig-config && \ + apt purge -y zip unzip wget curl libpq-dev && \ apt autoremove -y && \ apt clean && \ rm -rf /var/lib/apt/lists/* diff --git a/dotCMS/pom.xml b/dotCMS/pom.xml index 8f0fc7cee2c4..79000856d67f 100644 --- a/dotCMS/pom.xml +++ b/dotCMS/pom.xml @@ -1776,6 +1776,9 @@ original/docker-descriptor.xml /maven + + ${runtime.docker.sdkman.java.version} + diff --git a/dotCMS/src/main/docker/original/Dockerfile b/dotCMS/src/main/docker/original/Dockerfile index ac0ac7e97e5a..3f5521bdee14 100644 --- a/dotCMS/src/main/docker/original/Dockerfile +++ b/dotCMS/src/main/docker/original/Dockerfile @@ -1,68 +1,73 @@ # ---------------------------------------------- -# Stage 2: Construct our container using the minimal-java image -# and copying the prebuilt dotcms +# Stage 1: Construct our container using the minimal-java image and copying the prebuilt dotcms # ---------------------------------------------- -FROM dotcms/java-base:ms-jdk-11 as container-base - +ARG SDKMAN_JAVA_VERSION="11.0.22-ms" +FROM dotcms/java-base:${SDKMAN_JAVA_VERSION} AS container-base WORKDIR /srv ENV DEBIAN_FRONTEND=noninteractive - -# Installing basic packages -RUN apt update \ - && apt upgrade -y - -# Cleanup -RUN apt purge --allow-remove-essential -y \ - && apt autoremove -y \ - && apt clean \ - && rm -rf /var/lib/apt/lists/* - -# Defining default non-root user UID, GID, and name ARG USER_UID="65001" ARG USER_GID="65001" ARG USER_GROUP="dotcms" ARG USER_NAME="dotcms" -RUN groupadd -f -g $USER_GID $USER_GROUP -# Creating default non-user -# the useradd -RUN useradd -l -d /srv -g $USER_GID -u $USER_UID $USER_NAME - -RUN mkdir -p /srv/utils /srv/templates /srv/config /srv/home +# Ensure group and user are created with proper permissions +RUN groupadd -g "$USER_GID" "$USER_GROUP" && \ + useradd -l -d /srv -u "$USER_UID" -g "$USER_GROUP" -s /bin/bash "$USER_NAME" && \ + mkdir -p /srv/utils /srv/templates /srv/config /srv/home /data/shared/assets /data/shared/felix/load /data/shared/felix/undeployed /data/local/dotsecure/license && \ + chown -R "$USER_NAME:$USER_GROUP" /data && \ + chown -R "$USER_NAME:$USER_GROUP" /srv # Copy our build COPY --chown=$USER_NAME:$USER_GROUP maven /srv/ COPY --chown=$USER_NAME:$USER_GROUP ROOT/ / -RUN ln -s $(ls -d /srv/dotserver/tomcat-*) /srv/dotserver/tomcat - -# Make scripts runable -RUN find /srv/ -type f -name "*.sh" -exec chmod a+x {} \; && \ +RUN ln -s $(ls -d /srv/dotserver/tomcat-*) /srv/dotserver/tomcat && \ + # Make scripts runnable + find /srv/ -type f -name "*.sh" -exec chmod a+x {} \; && \ # Make plugin merging directories writable - find /srv/templates -type d -exec chmod 770 {} \; && \ - # Make dotcms user owner - mkdir -p /data/shared/assets && \ - mkdir -p /data/shared/felix/load && \ - mkdir -p /data/shared/felix/undeployed && \ - mkdir -p /data/local/dotsecure/license && \ - chown -R $USER_NAME:$USER_NAME /data + find /srv/templates -type d -exec chmod 770 {} \; # ---------------------------------------------- -# Stage 3: Flatten everything to 1 layer +# Stage 2: Final stage for minimal runtime image # ---------------------------------------------- -FROM scratch - -LABEL com.dotcms.contact "support@dotcms.com" -LABEL com.dotcms.vendor "dotCMS LLC" -LABEL com.dotcms.description "dotCMS Content Management System" +FROM ubuntu:20.04 + +LABEL com.dotcms.contact="support@dotcms.com" \ + com.dotcms.vendor="dotCMS LLC" \ + com.dotcms.description="dotCMS Content Management System" + +# Install basic packages and tini +RUN apt update && \ + apt upgrade -y && \ + apt install -y --no-install-recommends \ + wget \ + gnupg \ + tini && \ + rm -rf /var/lib/apt/lists/* + +# Install PostgreSQL client and pg_dump +RUN apt update && \ + apt install -y --no-install-recommends postgresql-common && \ + /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y && \ + apt install -y --no-install-recommends postgresql-client-16 && \ + apt purge -y postgresql-common gnupg && \ + /usr/bin/pg_dump --version || exit 1 && \ + rm -rf /var/lib/apt/lists/* ARG USER_UID="65001" ARG USER_GID="65001" +ARG USER_GROUP="dotcms" +ARG USER_NAME="dotcms" + +# Ensure the group and user are created in the final image as well +RUN groupadd -g "$USER_GID" "$USER_GROUP" && \ + useradd -l -d /srv -u "$USER_UID" -g "$USER_GROUP" -s /bin/bash "$USER_NAME" -COPY --from=container-base / / +COPY --from=container-base /java /java +COPY --from=container-base /srv /srv +COPY --from=container-base /data /data -# Switching to non-root user to install SDKMAN! USER $USER_UID:$USER_GID ENV JAVA_HOME="/java" ENV PATH=$PATH:/java/bin @@ -82,4 +87,4 @@ EXPOSE 8081 # Connect from proxy, HTTPS/443, secure EXPOSE 8082 # Direct connect for HTTPS, secure -EXPOSE 8443 +EXPOSE 8443 \ No newline at end of file diff --git a/dotCMS/src/main/docker/original/ROOT/srv/entrypoint.sh b/dotCMS/src/main/docker/original/ROOT/srv/entrypoint.sh index ab859333cb87..c4b57857b61f 100644 --- a/dotCMS/src/main/docker/original/ROOT/srv/entrypoint.sh +++ b/dotCMS/src/main/docker/original/ROOT/srv/entrypoint.sh @@ -9,11 +9,17 @@ source /srv/20-copy-overriden-files.sh source /srv/30-override-config-props.sh source /srv/40-custom-starter-zip.sh -echo "" -echo "Starting dotCMS ..." -echo "-------------------" -echo "" [[ -n "${WAIT_FOR_DEPS}" ]] && echo "Waiting ${WAIT_FOR_DEPS} seconds for DotCMS dependencies to load..." && sleep ${WAIT_FOR_DEPS} -exec -- ${TOMCAT_HOME}/bin/catalina.sh run +if [[ "$1" == "dotcms" ]]; then + shift + echo "" + echo "Starting dotCMS ..."s + echo "-------------------" + echo "" + exec -- ${TOMCAT_HOME}/bin/catalina.sh run "$@" +else + echo starting "$@" + exec -- "$@" +fi \ No newline at end of file diff --git a/environments/environment.properties b/environments/environment.properties index 7b421c2adf5a..247488ebe27e 100644 --- a/environments/environment.properties +++ b/environments/environment.properties @@ -5,3 +5,4 @@ docker.image.postgres=ankane/pgvector postman.collections=Maintenance_Resource docker.image.wiremock=wiremock/wiremock:3.5.3 wiremock.api.key=some-api-key-1a2bc3 +java.compat.version=11 diff --git a/independent-projects/core-plugins/pom.xml b/independent-projects/core-plugins/pom.xml index de5963158bf4..474e6be82276 100644 --- a/independent-projects/core-plugins/pom.xml +++ b/independent-projects/core-plugins/pom.xml @@ -16,9 +16,6 @@ false - 11 - 11 - UTF-8 ${project.version} diff --git a/independent-projects/core-plugins/tika-api/pom.xml b/independent-projects/core-plugins/tika-api/pom.xml index b3e7c8520e8b..5933d3b184bd 100644 --- a/independent-projects/core-plugins/tika-api/pom.xml +++ b/independent-projects/core-plugins/tika-api/pom.xml @@ -13,9 +13,6 @@ false - 11 - 11 - UTF-8 diff --git a/independent-projects/pom.xml b/independent-projects/pom.xml index c3d3c6290fc8..8684c3ec932d 100644 --- a/independent-projects/pom.xml +++ b/independent-projects/pom.xml @@ -12,13 +12,9 @@ pom - com.dotcms dotcms-independent-projects - 11 - 11 - UTF-8 ${project.version} diff --git a/osgi-base/system-bundles/pom.xml b/osgi-base/system-bundles/pom.xml index e4dd595bec7a..ecb63b2bd3da 100644 --- a/osgi-base/system-bundles/pom.xml +++ b/osgi-base/system-bundles/pom.xml @@ -13,8 +13,6 @@ false - 11 - 11 1.28.5 1.3.6 9.4 diff --git a/parent/pom.xml b/parent/pom.xml index c8b2c92dc26a..91ce0a9887f5 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -15,11 +15,20 @@ oss false + + + ${ext.java} + + ${sdkman.java.version} - 11 - 11 - 11 - 11 + + + ${ext.java.compat.version} + ${maven.compiler.release} + ${maven.compiler.release} ${maven.compiler.source} ${maven.compiler.target} @@ -645,7 +654,7 @@ ${version.compiler.plugin} true - ${java.version} + ${maven.compiler.release} -Xlint:unchecked @@ -963,6 +972,7 @@ true ${environment.properties.defaults} + ${maven.multiModuleProjectDirectory}/.sdkmanrc ext.