Skip to content

Commit 05fc1ac

Browse files
authored
Merge pull request #188 from xdev-software/develop
Release
2 parents 97d84dc + 0a519aa commit 05fc1ac

4 files changed

Lines changed: 113 additions & 25 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
# 1.0.14
2+
* Remove not needed alpine packages from (Docker) image
3+
* This get's rid of CVE-2024-8176
4+
* Overall image is now ~15MB smaller
5+
* Use [CDS](https://docs.oracle.com/en/java/javase/17/vm/class-data-sharing.html) to speed up boot
6+
17
# 1.0.13
2-
* Rebuild to get rid of CVE-2024-8176
8+
* ~~Rebuild to get rid of CVE-2024-8176~~
39

410
# 1.0.12
511
* Updated dependencies

server/Dockerfile

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,39 @@
1-
FROM eclipse-temurin:21-jre-alpine
1+
FROM eclipse-temurin:21-jre-alpine AS jre-base
2+
3+
4+
# Build the JRE ourself and exclude stuff from Eclipse-Temurin that we don't need
5+
#
6+
# Derived from https://github.com/adoptium/containers/blob/91ea190c462741d2c64ed2f8f0a0efdb3e77c49d/21/jre/alpine/3.21/Dockerfile
7+
FROM alpine:3 AS jre-minimized
8+
9+
ENV JAVA_HOME=/opt/java/openjdk
10+
ENV PATH=$JAVA_HOME/bin:$PATH
11+
12+
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
13+
14+
RUN set -eux; \
15+
# DO NOT INSTALL:
16+
# gunpg - only required to verify download of jre from eclipse-temurin
17+
# fontconfig ttf-dejavu - No fonts are needed as nothing is rendered/using AWT
18+
apk add --no-cache \
19+
ca-certificates p11-kit-trust coreutils openssl \
20+
musl-locales musl-locales-lang \
21+
tzdata
22+
23+
COPY --from=jre-base /opt/java/openjdk /opt/java/openjdk
24+
25+
RUN set -eux; \
26+
echo "Verifying install ..."; \
27+
echo "java --version"; java --version; \
28+
echo "Complete."
29+
30+
# Renamed as cacerts functionality is disabled
31+
COPY --from=jre-base /__cacert_entrypoint.sh /entrypoint.sh
32+
RUN chmod 775 /entrypoint.sh
33+
ENTRYPOINT ["/entrypoint.sh"]
34+
35+
36+
FROM jre-minimized
237

338
ARG user=app
439
ARG group=app
@@ -12,16 +47,22 @@ RUN mkdir -p ${APP_DIR} \
1247
&& addgroup -g ${gid} ${group} \
1348
&& adduser -h "$APP_DIR" -u ${uid} -G ${group} -s /bin/sh -D ${user}
1449

15-
EXPOSE 1080
50+
WORKDIR ${APP_DIR}
1651

1752
USER ${user}
1853

19-
COPY --chown=${user}:${group} target/server-standalone.jar ${APP_DIR}/server-standalone.jar
54+
COPY --chown=${user}:${group} target/server-standalone.jar ${APP_DIR}/app.jar
55+
56+
# CDS
57+
RUN java -XX:ArchiveClassesAtExit=app.jsa -Dexit-immediately-after-start=1 -jar app.jar -serverPort 1080
2058

2159
# MaxRAMPercentage: Default value is 25% -> we want to use available memory optimal -> increased, but enough is left for other RAM usages like e.g. Metaspace
2260
# Min/MaxHeapFreeRatio: Default values cause container reserved memory not to shrink properly/waste memory -> decreased
2361
# https://stackoverflow.com/questions/16058250/what-is-the-purpose-of-xxminheapfreeratio-and-xxmaxheapfreeratio
24-
ENV JAVA_OPTS "-XX:MaxRAMPercentage=75 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 -Djava.awt.headless=true"
25-
ENV ARGS "-serverPort 1080"
62+
ENV JAVA_OPTS="-XX:MaxRAMPercentage=75 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 -Djava.awt.headless=true"
63+
ENV JAVA_CDS_OPTS="-XX:SharedArchiveFile=app.jsa"
64+
ENV ARGS="-serverPort 1080"
65+
66+
EXPOSE 1080
2667

27-
CMD java ${JAVA_OPTS} -jar /opt/app/server-standalone.jar ${ARGS}
68+
CMD [ "/bin/sh", "-c", "java $JAVA_OPTS $JAVA_CDS_OPTS -jar app.jar ${ARGS}" ]

server/src/main/java/software/xdev/mockserver/cli/Main.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import software.xdev.mockserver.netty.MockServer;
4545

4646

47+
@SuppressWarnings("PMD.GodClass")
4748
public final class Main
4849
{
4950
private static final Logger LOG = LoggerFactory.getLogger(Main.class);
@@ -127,7 +128,7 @@ public final class Main
127128
* mode, - "-proxyRemoteHost" followed by the optional proxyRemoteHost port (ignored unless
128129
* proxyRemotePort is specified) - "-logLevel" followed by the log level
129130
*/
130-
@SuppressWarnings({"PMD.CognitiveComplexity", "PMD.NPathComplexity"})
131+
@SuppressWarnings({"PMD.CognitiveComplexity", "PMD.NPathComplexity", "resource"})
131132
public static void main(final String... arguments)
132133
{
133134
try
@@ -218,8 +219,14 @@ else if(isNotBlank(System.getenv(parsedArgument.shortEnvironmentVariableName()))
218219
}
219220
MockServerLoggerConfiguration.configureLogger();
220221
final Integer[] localPorts = INTEGER_STRING_LIST_PARSER.toArray(parsedArgs.get(serverPort.name()));
221-
launchMockServer(parsedArgs, localPorts);
222+
223+
final MockServer mockServer = launchMockServer(parsedArgs, localPorts);
222224
setPort(localPorts);
225+
226+
if(System.getProperty("exit-immediately-after-start") != null)
227+
{
228+
mockServer.stop();
229+
}
223230
}
224231
else
225232
{
@@ -237,8 +244,7 @@ else if(isNotBlank(System.getenv(parsedArgument.shortEnvironmentVariableName()))
237244
}
238245
}
239246

240-
@SuppressWarnings("resource") // Launch
241-
private static void launchMockServer(final Map<String, String> parsedArgs, final Integer[] localPorts)
247+
private static MockServer launchMockServer(final Map<String, String> parsedArgs, final Integer[] localPorts)
242248
{
243249
if(parsedArgs.containsKey(proxyRemotePort.name()))
244250
{
@@ -247,12 +253,9 @@ private static void launchMockServer(final Map<String, String> parsedArgs, final
247253
{
248254
remoteHost = "localhost";
249255
}
250-
new MockServer(Integer.parseInt(parsedArgs.get(proxyRemotePort.name())), remoteHost, localPorts);
251-
}
252-
else
253-
{
254-
new MockServer(localPorts);
256+
return new MockServer(Integer.parseInt(parsedArgs.get(proxyRemotePort.name())), remoteHost, localPorts);
255257
}
258+
return new MockServer(localPorts);
256259
}
257260

258261
static String formatArgsForLog(final Map<String, String> args)

testcontainers/Standalone.Dockerfile

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,39 @@
1-
# Stage 1: Build the app
2-
FROM eclipse-temurin:21-jdk-alpine AS builder
1+
ARG JAVA_VERSION=21
2+
FROM eclipse-temurin:${JAVA_VERSION}-jre-alpine AS jre-base
3+
4+
# Build the JRE ourself and exclude stuff from Eclipse-Temurin that we don't need
5+
#
6+
# Derived from https://github.com/adoptium/containers/blob/91ea190c462741d2c64ed2f8f0a0efdb3e77c49d/21/jre/alpine/3.21/Dockerfile
7+
FROM alpine:3 AS jre-minimized
8+
9+
ENV JAVA_HOME=/opt/java/openjdk
10+
ENV PATH=$JAVA_HOME/bin:$PATH
11+
12+
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
13+
14+
RUN set -eux; \
15+
# DO NOT INSTALL:
16+
# gunpg - only required to verify download of jre from eclipse-temurin
17+
# fontconfig ttf-dejavu - No fonts are needed as nothing is rendered/using AWT
18+
apk add --no-cache \
19+
ca-certificates p11-kit-trust coreutils openssl \
20+
musl-locales musl-locales-lang \
21+
tzdata
22+
23+
COPY --from=jre-base /opt/java/openjdk /opt/java/openjdk
24+
25+
RUN set -eux; \
26+
echo "Verifying install ..."; \
27+
echo "java --version"; java --version; \
28+
echo "Complete."
29+
30+
# Renamed as cacerts functionality is disabled
31+
COPY --from=jre-base /__cacert_entrypoint.sh /entrypoint.sh
32+
RUN chmod 775 /entrypoint.sh
33+
ENTRYPOINT ["/entrypoint.sh"]
34+
35+
36+
FROM eclipse-temurin:${JAVA_VERSION}-jdk-alpine AS builder
337

438
RUN apk add --no-cache git bash
539

@@ -14,8 +48,8 @@ RUN echo "Executing '$mvncmd'"
1448
RUN chmod +x ./mvnw \
1549
&& ./mvnw -B ${mvncmd}
1650

17-
# Stage 2: Build the executable image
18-
FROM eclipse-temurin:21-jre-alpine
51+
52+
FROM jre-minimized
1953

2054
ARG user=app
2155
ARG group=app
@@ -29,16 +63,20 @@ RUN mkdir -p ${APP_DIR} \
2963
&& addgroup -g ${gid} ${group} \
3064
&& adduser -h "$APP_DIR" -u ${uid} -G ${group} -s /bin/sh -D ${user}
3165

32-
EXPOSE 1080
66+
WORKDIR ${APP_DIR}
3367

3468
USER ${user}
3569

36-
COPY --from=builder --chown=${user}:${group} builder/server/target/server-standalone.jar ${APP_DIR}/server-standalone.jar
70+
COPY --from=builder --chown=${user}:${group} builder/server/target/server-standalone.jar ${APP_DIR}/app.jar
71+
72+
# CDS
73+
RUN java -XX:ArchiveClassesAtExit=app.jsa -Dexit-immediately-after-start=1 -jar app.jar -serverPort 1080
3774

3875
# MaxRAMPercentage: Default value is 25% -> we want to use available memory optimal -> increased, but enough is left for other RAM usages like e.g. Metaspace
3976
# Min/MaxHeapFreeRatio: Default values cause container reserved memory not to shrink properly/waste memory -> decreased
4077
# https://stackoverflow.com/questions/16058250/what-is-the-purpose-of-xxminheapfreeratio-and-xxmaxheapfreeratio
41-
ENV JAVA_OPTS "-XX:MaxRAMPercentage=75 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 -Djava.awt.headless=true"
42-
ENV ARGS "-serverPort 1080"
78+
ENV JAVA_OPTS="-XX:MaxRAMPercentage=75 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 -Djava.awt.headless=true"
79+
ENV JAVA_CDS_OPTS="-XX:SharedArchiveFile=app.jsa"
80+
ENV ARGS="-serverPort 1080"
4381

44-
CMD java ${JAVA_OPTS} -jar /opt/app/server-standalone.jar ${ARGS}
82+
CMD [ "/bin/sh", "-c", "java $JAVA_OPTS $JAVA_CDS_OPTS -jar app.jar ${ARGS}" ]

0 commit comments

Comments
 (0)