OpenJDK Java 17 的 Docker 镜像

86
我们正在将Docker中的微服务升级为Java 17,之前我们使用的是基础镜像openjdk:11-jre-slim。那么Java 17的相应镜像是什么?
看起来没有openjdk:17-jre-slim这个镜像?事实上似乎没有任何最近的jre镜像 - 只有jdk镜像。11-jre-slim镜像似乎约为75MB - 是否存在一个合适的大小相似的Java 17镜像?
我们过去也使用过Alpine镜像。

10
请参见此 GitHub 问题:https://github.com/docker-library/openjdk/issues/468 上游不再提供JRE,因此将不会生成官方的JRE镜像。有一个类似的讨论关于Adoptium(曾用名AdoptOpenJDK)不再发布JRE。不管是好是坏,官方的JRE正在逐渐消失。 - Joachim Sauer
1
话虽如此,现在jdk似乎已经配备了工具来生成自定义JRE,因此您应该可以自己创建一个:https://www.baeldung.com/jlink,这里是Eclipse Tamurin的一个示例,用于openjdk 11 JRE:https://hub.docker.com/_/eclipse-temurin https://blog.adoptium.net/2021/08/using-jlink-in-dockerfiles/ - kutschkem
4
@kutschkem:是的,自定义的 jlink 构建基础镜像是另一种选择,但我不会称它们为“JREs”,因为它们并不完全是那样的东西,这样称呼可能会导致错误的假设和混淆。 - Joachim Sauer
你可以使用 Alpine JDK 17 FROM openjdk:17-alpine - CᴴᴀZ
7个回答

59

Java-17中的Oracle镜像可以从openjdk:17-oracle免费获取。

Dockerfile:

FROM openjdk:17-oracle

openjdk:17-jdk-slim 还可以创建轻量级镜像。

Dockerfile:

FROM openjdk:17-jdk-slim

4
17-oracle是17.0.1-jdk-oraclelinux8、jdk-oraclelinux8、17.0.1-jdk-oracle、17-jdk-oracle、17-oracle、jdk-oracle等标签的同义词。基本上它是相同的JDK镜像,而不是JRE。https://github.com/docker-library/docs/blob/master/openjdk/README.md#simple-tags - igor
4
这会不会涉及许可问题呢?我认为大多数人现在都想避免使用Oracle。 - Novaterata
5
从Java 17开始,您可以自由使用它,甚至可用于商业用途。 - Deekshith Anand
@DeekshithAnand - Novaterata
3
正如@DeekshithAnand所说,从Java 17开始,Oracle镜像可以自由使用。如果您正在寻找其他镜像,则“openjdk:17-jdk-slim”也可以很好地创建轻量级镜像。 - Santanu
1
2023年更新:此答案已过时,因为openjdk镜像已被弃用。请参考Paul Verest的答案获取替代方案。 - undefined

23

(截至2023年)请勿使用任何openjdk:17-镜像,因为您可能会得到旧的jdk 17构建版本,存在安全问题!
https://hub.docker.com/_/openjdk上有明确的说明

停用通知

openJDK 17不再构建!
(也不在https://github.com/docker-library/openjdk中维护)


以前使用任何Linux版本都很简单,但现在你需要做出选择,因为不同的openJDK builds Docker镜像将使用不同的Linux版本。

例如,Amazon Corretto - Amazon Linux,Oracle JDK - Oracle Linux等。


不同的来源可能会有不同的建议。
例如,在https://docs.docker.com/language/java/build-images/上使用eclipse-temurin

FROM eclipse-temurin:17-jdk-jammy


14

8

7

在@PaulVerest的优秀回答基础上,为了其他像我一样的新手受益,我在这里发布适用于我的Dockerfile(截至2023年5月,从Windows 10 PC构建和运行):

FROM amazoncorretto:17.0.7-alpine

# Add app user
ARG APPLICATION_USER=appuser
RUN adduser --no-create-home -u 1000 -D $APPLICATION_USER

# Configure working directory
RUN mkdir /app && \
    chown -R $APPLICATION_USER /app

USER 1000

COPY --chown=1000:1000 ./myapp-0.0.1-SNAPSHOT.jar /app/app.jar
WORKDIR /app

EXPOSE 8080
ENTRYPOINT [ "java", "-jar", "/app/app.jar" ]

如果您使用以下方式构建容器:

docker build -t docker_myapp .

然后,使用命令行运行它:

docker run -p 8080:8080 docker_myapp

注意:您无法使用Ctrl+C在同一命令行中停止它。要停止它,您需要打开另一个命令行并执行以下操作:
docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED       STATUS       PORTS                    NAMES
16dad8047672   docker_myapp   "java -jar /app/app.…"   7 hours ago   Up 7 hours   0.0.0.0:8080->8080/tcp   sharp_rode

然后:

docker stop 16dad8047672   

用户1000 这是什么目的? - undefined

3
在你的Dockerfile中,链接中提到:
FROM openjdk:17-alpine

3
针对此事的最新更新是,重新查看上述提到的Eclipse Adoptium问题(https://github.com/adoptium/temurin-build/issues/2683),最近的评论表明他们现在已经开始生产JRE镜像。
我们已经切换到使用 eclipse-temurin:17-jre-focal。还有一个(稍微大一点)的 17-jre-centos7 和一个较小的 17-jre-alpine,但我们现在需要一些不在 alpine 中的库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接