diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..ef7d639ea --- /dev/null +++ b/Dockerfile @@ -0,0 +1,68 @@ +# syntax=docker/dockerfile:1 + +# Base build stage +FROM gradle:7.4.1-jdk11 AS build +WORKDIR /opt/moqui +LABEL org.opencontainers.image.authors="moqui@googlegroups.com" + +# Arguments +ARG GRADLE_COMMAND="" +ARG GRADLE_ARGS="--info --no-daemon --parallel" +ARG COMPONENT="" +ARG COMPONENT_SET="" +ARG RUN_LOCAL_SEARCH="true" +# create user for search and chown corresponding files +ARG search_name=opensearch + +# Copy source code +COPY . ./ + +# Build and unzip application +RUN sh start.sh && unzip -q -o moqui-plus-runtime.war + +# Copied from docker/simple/Dockerfile +# Builds a minimal docker image with openjdk and moqui with various volumes for configuration and persisted data outside the container +# NOTE: add components, build and if needed load data before building a docker image with this +FROM eclipse-temurin:11-jre +WORKDIR /opt/moqui +ARG search_name=opensearch + +COPY --from=build /opt/moqui/WEB-INF WEB-INF +COPY --from=build /opt/moqui/META-INF META-INF +COPY --from=build /opt/moqui/*.class ./ +COPY --from=build /opt/moqui/execlib execlib +COPY --from=build /opt/moqui/runtime runtime + +RUN if [ "$RUN_LOCAL_SEARCH" == "true" ]; then \ + if [ -d runtime/opensearch/bin ]; then \ + echo "Installing OpenSearch User"; \ + search_name=opensearch; \ + groupadd -g 1000 opensearch 2>/dev/null || echo "group 1000 already exists" && \ + useradd -u 1000 -g 1000 -G 0 -d /opt/moqui/runtime/opensearch opensearch 2>/dev/null || echo "user 1000 already exists" && \ + chmod 0775 /opt/moqui/runtime/opensearch && \ + chown -R 1000:0 /opt/moqui/runtime/opensearch; \ + fi; \ + if [ -d runtime/elasticsearch/bin ]; then \ + echo "Installing ElasticSearch User"; \ + search_name=elasticsearch; \ + groupadd -r elasticsearch && \ + useradd --no-log-init -r -g elasticsearch -d /opt/moqui/runtime/elasticsearch elasticsearch && \ + chown -R elasticsearch:elasticsearch runtime/elasticsearch; \ + fi; \ + fi + +# exposed as volumes for configuration purposes +VOLUME ["/opt/moqui/runtime/conf", "/opt/moqui/runtime/lib", "/opt/moqui/runtime/classes", "/opt/moqui/runtime/ecomponent"] +# exposed as volumes to persist data outside the container, recommended +VOLUME ["/opt/moqui/runtime/log", "/opt/moqui/runtime/txlog", "/opt/moqui/runtime/sessions", "/opt/moqui/runtime/db", "/opt/moqui/runtime/$search_name"] + +# Main Servlet Container Port, Search HTTP Port, Search Cluster (TCP Transport) Port, Hazelcast Cluster Port +EXPOSE 80 9200 9300 5701 + +# this is to run from the war file directly, preferred approach unzips war file in advance +# ENTRYPOINT ["java", "-jar", "moqui.war"] +ENTRYPOINT ["java", "-cp", ".", "MoquiStart", "port=80"] + +HEALTHCHECK --interval=15s --timeout=600ms --start-period=15s CMD curl -f -H "X-Forwarded-Proto: https" -H "X-Forwarded-Ssl: on" http://localhost/status || exit 1 +# specify this as a default parameter if none are specified with docker exec/run, ie run production by default +CMD ["conf=conf/MoquiProductionConf.xml"] diff --git a/docker/simple/Dockerfile b/docker/simple/Dockerfile index 3ca576a5a..d260dc0c5 100644 --- a/docker/simple/Dockerfile +++ b/docker/simple/Dockerfile @@ -2,7 +2,7 @@ # NOTE: add components, build and if needed load data before building a docker image with this ARG RUNTIME_IMAGE=eclipse-temurin:11-jdk FROM ${RUNTIME_IMAGE} -MAINTAINER Moqui Framework +LABEL org.opencontainers.image.authors="moqui@googlegroups.com" WORKDIR /opt/moqui diff --git a/start.sh b/start.sh new file mode 100644 index 000000000..8c3a7d617 --- /dev/null +++ b/start.sh @@ -0,0 +1,41 @@ +#! /bin/bash + +echo "Usage: start.sh []"; echo + +MOQUI_HOME="${1:-.}" + +GRADLE_COMMAND=${GRADLE_COMMAND:=""} +GRADLE_ARGS=${GRADLE_ARGS:="--info --no-daemon --parallel"} + +COMPONENT=${COMPONENT:=""} +COMPONENT_SET=${COMPONENT_SET:=""} + +RUN_LOCAL_SEARCH=${RUN_LOCAL_SEARCH:="true"} +search_name=${search_name:="opensearch"} +get_hazelcast () { if [ $USE_HAZELCAST = "true" ]; then echo "Getting moqui-hazelcast"; gradle $GRADLE_ARGS getComponent -Pcomponent=moqui-hazelcast; fi } +get_component () { if [ -n "$COMPONENT" ]; then echo "Getting $COMPONENT"; gradle $GRADLE_ARGS getComponent -Pcomponent=$COMPONENT; fi } +get_component_set () { if [ -n "$COMPONENT_SET" ]; then echo "Getting $COMPONENT_SET"; gradle $GRADLE_ARGS getComponentSet -PcomponentSet=$COMPONENT_SET; fi } + +if [ -f $MOQUI_HOME/moqui-plus-runtime.war ]; then echo "Using already built moqui-plus-runtime.war" +else + echo "cd into the $MOQUI_HOME directory"; START_PATH=$(pwd); cd $MOQUI_HOME + + if [ ! -d $MOQUI_HOME/runtime ]; then echo "Getting runtime"; gradle $GRADLE_ARGS getRuntime; fi + if [ "$RUN_LOCAL_SEARCH" == "true" ]; then + if [ "$search_name" != "elasticsearch" ]; then \ + if [ ! -d $MOQUI_HOME/runtime/opensearch/bin ]; then echo "Installing OpenSearch"; gradle $GRADLE_ARGS downloadOpenSearch; fi + elif [ -d runtime/elasticsearch/bin ]; then \ + if [ ! -d $MOQUI_HOME/runtime/elasticsearch/bin ]; then echo "Installing ElasticSearch"; gradle $GRADLE_ARGS downloadElasticSearch; fi + fi; + fi + + if [ -n "$GRADLE_COMMAND" ]; then echo "Running gradle $GRADLE_ARGS $GRADLE_COMMAND"; gradle $GRADLE_ARGS "$GRADLE_COMMAND"; fi + + get_hazelcast + get_component + get_component_set + + echo "Getting Dependencies"; gradle $GRADLE_ARGS getDepends + echo "Add runtime"; gradle $GRADLE_ARGS addRuntime + echo "Done"; cd $START_PATH +fi