在上一篇文章中,我一直在讨论如何使用Java 10来构建和运行Spring Boot应用程序。现在是时候讨论如何将它放入Docker容器中了。更好地支持容器化是Java 10发行版的主要特性之一。所以,让我们开始吧!
这是一个非常简单的过程,因此,请看以下代码片段:
FROM debian:9-slim AS builder
RUN set -ex && \
apt-get update && apt-get install -y wget unzip && \
wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz -nv -O jdk.tar.gz -nv && \
mkdir -p /opt/jdk && \
tar zxvf jdk.tar.gz -C /opt/jdk --strip-components=1 && \
rm jdk.tar.gz && \
rm /opt/jdk/lib/src.zip
RUN /opt/jdk/bin/jlink \
--module-path /opt/jdk/jmods \
--verbose \
--add-modules java.base,java.logging,java.xml,jdk.unsupported,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
--output /opt/jdk-minimal \
--compress 2 \
--no-header-files
# Second stage, add only our custom jdk9 distro and our app
FROM debian:9-slim
COPY --from=builder /opt/jdk-minimal /opt/jdk-minimal
ENV JAVA_HOME=/opt/jdk-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"
ENV APP_TIMEZONE=UTC
EXPOSE 8080
ENTRYPOINT ["/launch.sh"]
COPY launch.sh /
RUN chmod +x /launch.sh
COPY build/libs/you-app.jar /app.jar
正如您所看到的,在这里我使用了多阶段Docker构建文件。 快速说明:支持多阶段构建Docker 17.05或更高,但结果图像向后兼容(至少从我的经验来看)。 在第一个阶段中,它从Oracle下载JDK,但是将自己的副本存储在离构建服务器更近的地方是有意义的,因为它不是那么小——比200mb小一点点。因此,它被下载、解压缩并准备好使用。但没那么快。
您可能还记得,Java 9给了我们模块系统JDK本身也是模块化的。 这意味着我们不必携带全部JDK投入生产,但我们可以根据我们的应用程序的需求专门构建自己的条带化版本。 为此提供了jlink工具。 只是看看它在构建过程中是如何使用的。 列出的模块应该足以运行典型的spring boot应用。 在生产案例中,我还必须将java.scripting、jdk.scripting.nashorn放在列表中。
在第二阶段,它复制上一个的结果,定义一些环境变量和公开端口,复制launch.sh和应用程序的工件。 根本不是火箭科学。
这是我刚才提到的launch.sh脚本:
#!/bin/bash
check_var(){
if [ -z "$1" ]; then
>&2 echo "error: missing environmental variable $2. exit"
exit 1
fi
}
check_var "${JAVA_XMS}" "JAVA_XMS"
check_var "${JAVA_XMX}" "JAVA_XMX"
check_var "${APP_TIMEZONE}" "APP_TIMEZONE"
XMS=${JAVA_XMS:-none}
XMX=${JAVA_XMX:-none}
TIMEZONE=${APP_TIMEZONE:-none}
JAVA_OPTS="-Xmx${XMX} -Xms${XMS} -Duser.timezone=${TIMEZONE} -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} ${OPTIONS}"
java ${JAVA_OPTS} -jar /app.jar
那只是确保提供所有重要内容的小帮手等等。但是,可以肯定的是,它是可选的。
这应该足以让你的应用程序投入生产。请写下你的意见,如果你有一些想法如何使它更好!