openjdk
(非 production-ready,並且已經 deprecated)azul/zulu-openjdk
(Azul Zulu OpenJDK)amazoncorretto
(Amazon Corretto OpenJDK)openjdk
之外,呢啲 OpenJDK 既 distributions 應該都有提供 JRE 既 image tags(實際情況要逐個 distribution、逐個 Java 版本咁去 check)。理論上 JRE 版本裡面唔會包含 JDK 既執行檔,例如 javac
。否則,如果喺生產環境度部署左基於完整 JDK Docker image 既 Java web apps,就有可能構成安全問題。jlink
CLI 工具。jlink
客製化 JRE Docker imageDockerfile
既內容參考左 Microsoft 官方教學:1FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu as runtime-build 2 3RUN $JAVA_HOME/bin/jlink \ 4--add-modules \ 5java.base,\ 6<other module 1>,\ 7<other module 2> \ 8--strip-debug \ 9--no-man-pages \ 10--no-header-files \ 11--compress=2 \ 12--output /javaruntime 13 14FROM ubuntu 15ENV LANG C.UTF-8 16ENV JAVA_HOME /usr/lib/jvm/msopenjdk-17-amd64 17ENV PATH "${JAVA_HOME}/bin:${PATH}" 18COPY --from=runtime-build /javaruntime $JAVA_HOME 19 20EXPOSE 8080 21 22RUN mkdir /opt/app 23COPY app.jar /opt/app 24CMD ["java", "-jar", "/opt/app/app.jar"]
jlink
果句 command 度。jlink
command 既 --add-modules
option,我地可以加減 JRE 既 Java modules,從而喺 build time 控制 Docker image 裡面包含既執行檔。
--add-modules
option 既 value 係我地想個 JRE 需要包含既 Java modules。
,
分隔,唔可以有任何空格。java.base
,所以一個 JRE 至少一定會有 java
以及 keytool
既執行檔。lib/modules
檔案內容唔同。java --list-modules
先可以知道個 JRE 裡面實際包含既所有 Java modules。Dockerfile
放入個 folder 度。app.jar
。docker image build -t myapp .
。
myapp
,而完整 tag 名係 myapp:latest
。docker image list
就會見到個 myapp
Docker image。docker container run -d --rm --name myapp -p 8080:8080 myapp
。docker container list
就會見到個叫 myapp
既 container 行緊。java --list-modules
command:docker container run --rm openjdk:17 java --list-modules docker container run --rm mcr.microsoft.com/openjdk/jdk:17-ubuntu java --list-modules
70
個):java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.smartcardio
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto
jdk.accessibility
jdk.attach
jdk.charsets
jdk.compiler
jdk.crypto.cryptoki
jdk.crypto.ec
jdk.dynalink
jdk.editpad
jdk.hotspot.agent
jdk.httpserver
jdk.incubator.foreign
jdk.incubator.vector
jdk.internal.ed
jdk.internal.jvmstat
jdk.internal.le
jdk.internal.opt
jdk.internal.vm.ci
jdk.internal.vm.compiler
jdk.internal.vm.compiler.management
jdk.jartool
jdk.javadoc
jdk.jcmd
jdk.jconsole
jdk.jdeps
jdk.jdi
jdk.jdwp.agent
jdk.jfr
jdk.jlink
jdk.jpackage
jdk.jshell
jdk.jsobject
jdk.jstatd
jdk.localedata
jdk.management
jdk.management.agent
jdk.management.jfr
jdk.naming.dns
jdk.naming.rmi
jdk.net
jdk.nio.mapmode
jdk.random
jdk.sctp
jdk.security.auth
jdk.security.jgss
jdk.unsupported
jdk.unsupported.desktop
jdk.xml.dom
jdk.zipfs
ls <JAVA_HOME>/bin
command:docker container run --rm openjdk:17 ls /usr/java/openjdk-17/bin docker container run --rm mcr.microsoft.com/openjdk/jdk:17-ubuntu ls /usr/lib/jvm/msopenjdk-17-amd64/bin
28
個):jar
jarsigner
java
javac
javadoc
javap
jcmd
jconsole
jdb
jdeprscan
jdeps
jfr
jhsdb
jimage
jinfo
jlink
jmap
jmod
jpackage
jps
jrunscript
jshell
jstack
jstat
jstatd
keytool
rmiregistry
serialver
/bin
folder 裡面既執行檔。以下列出 JDK 17 提供既所有 modules 以及執行檔之間既關係。# | Java module | 執行檔 |
---|---|---|
1 | java.base | java 、keytool |
2 | java.compiler | java 、keytool |
3 | java.datatransfer | java 、keytool |
4 | java.desktop | java 、keytool |
5 | java.instrument | java 、keytool |
6 | java.logging | java 、keytool |
7 | java.management | java 、keytool |
8 | java.management.rmi | java 、keytool 、rmiregistry |
9 | java.naming | java 、keytool |
10 | java.net.http | java 、keytool |
11 | java.prefs | java 、keytool |
12 | java.rmi | java 、keytool 、rmiregistry |
13 | java.scripting | java 、jrunscript 、keytool |
14 | java.se | java 、jrunscript 、keytool 、rmiregistry |
15 | java.security.jgss | java 、keytool |
16 | java.security.sasl | java 、keytool |
17 | java.smartcardio | java 、keytool |
18 | java.sql | java 、keytool |
19 | java.sql.rowset | java 、keytool |
20 | java.transaction.xa | java 、keytool |
21 | java.xml | java 、keytool |
22 | java.xml.crypto | java 、keytool |
23 | jdk.accessibility | java 、keytool |
24 | jdk.attach | java 、keytool |
25 | jdk.charsets | java 、keytool |
26 | jdk.compiler | java 、javac 、keytool 、serialver |
27 | jdk.crypto.cryptoki | java 、keytool |
28 | jdk.crypto.ec | java 、keytool |
29 | jdk.dynalink | java 、keytool |
30 | jdk.editpad | java 、keytool |
31 | jdk.hotspot.agent | java 、jhsdb 、jrunscript 、keytool 、rmiregistry |
32 | jdk.httpserver | java 、keytool |
33 | jdk.incubator.foreign | java 、keytool |
34 | jdk.incubator.vector | java 、keytool |
35 | jdk.internal.ed | java 、keytool |
36 | jdk.internal.jvmstat | java 、keytool |
37 | jdk.internal.le | java 、keytool |
38 | jdk.internal.opt | java 、keytool |
39 | jdk.internal.vm.ci | java 、keytool |
40 | jdk.internal.vm.compiler | java 、keytool |
41 | jdk.internal.vm.compiler.management | java 、keytool |
42 | jdk.jartool | jar 、jarsigner 、java 、keytool |
43 | jdk.javadoc | java 、javac 、javadoc 、keytool 、serialver |
44 | jdk.jcmd | java 、jcmd 、jinfo 、jmap 、jps 、jstack 、jstat 、keytool |
45 | jdk.jconsole | java 、jconsole 、keytool 、rmiregistry |
46 | jdk.jdeps | java 、javac 、javap 、jdeprscan 、jdeps 、keytool 、serialver |
47 | jdk.jdi | java 、jdb 、keytool |
48 | jdk.jdwp.agent | java 、keytool |
49 | jdk.jfr | java 、jfr 、keytool |
50 | jdk.jlink | java 、javac 、javap 、jdeprscan 、jdeps 、jimage 、jlink 、jmod 、keytool 、serialver |
51 | jdk.jpackage | java 、javac 、javap 、jdeprscan 、jdeps 、jimage 、jlink 、jmod 、jpackage 、keytool 、serialver |
52 | jdk.jshell | java 、javac 、jdb 、jshell 、keytool 、serialver |
53 | jdk.jsobject | java 、keytool |
54 | jdk.jstatd | java 、jstatd 、keytool 、rmiregistry |
55 | jdk.localedata | java 、keytool |
56 | jdk.management | java 、keytool |
57 | jdk.management.agent | java 、keytool 、rmiregistry |
58 | jdk.management.jfr | java 、jfr 、keytool |
59 | jdk.naming.dns | java 、keytool |
60 | jdk.naming.rmi | java 、keytool 、rmiregistry |
61 | jdk.net | java 、keytool |
62 | jdk.nio.mapmode | java 、keytool |
63 | jdk.random | java 、keytool |
64 | jdk.sctp | java 、keytool |
65 | jdk.security.auth | java 、keytool |
66 | jdk.security.jgss | java 、keytool |
67 | jdk.unsupported | java 、keytool |
68 | jdk.unsupported.desktop | java 、keytool |
69 | jdk.xml.dom | java 、keytool |
70 | jdk.zipfs | java 、keytool |
# | 執行檔 | Java modules |
---|---|---|
1 | jar | jdk.jartool |
2 | jarsigner | jdk.jartool |
3 | java | 全部 |
4 | javac | jdk.compiler 、jdk.javadoc 、jdk.jdeps 、jdk.jlink 、jdk.jpackage 、jdk.jshell |
5 | javadoc | jdk.javadoc |
6 | javap | jdk.jdeps 、jdk.jlink 、jdk.jpackage |
7 | jcmd | jdk.jcmd |
8 | jconsole | jdk.jconsole |
9 | jdb | jdk.jdi 、jdk.jshell |
10 | jdeprscan | jdk.jdeps 、jdk.jlink 、jdk.jpackage |
11 | jdeps | jdk.jdeps 、jdk.jlink 、jdk.jpackage |
12 | jfr | jdk.jfr 、jdk.management.jfr |
13 | jhsdb | jdk.hotspot.agent |
14 | jimage | jdk.jlink 、jdk.jpackage |
15 | jinfo | jdk.jcmd |
16 | jlink | jdk.jlink 、jdk.jpackage |
17 | jmap | jdk.jcmd |
18 | jmod | jdk.jlink 、jdk.jpackage |
19 | jpackage | jdk.jpackage |
20 | jps | jdk.jcmd |
21 | jrunscript | java.scripting 、java.se 、jdk.hotspot.agent |
22 | jshell | jdk.jshell |
23 | jstack | jdk.jcmd |
24 | jstat | jdk.jcmd |
25 | jstatd | jdk.jstatd |
26 | keytool | 全部 |
27 | rmiregistry | java.management.rmi 、java.rmi 、java.se 、jdk.hotspot.agent 、jdk.jconsole 、jdk.jstatd 、jdk.management.agent 、jdk.naming.rmi |
28 | serialver | jdk.compiler 、jdk.javadoc 、jdk.jdeps 、jdk.jlink 、jdk.jpackage 、jdk.jshell |
java --list-modules
command:docker container run --rm openjdk:21 java --list-modules docker container run --rm mcr.microsoft.com/openjdk/jdk:21-ubuntu java --list-modules
69
個):java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.smartcardio
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto
jdk.accessibility
jdk.attach
jdk.charsets
jdk.compiler
jdk.crypto.cryptoki
jdk.crypto.ec
jdk.dynalink
jdk.editpad
jdk.hotspot.agent
jdk.httpserver
jdk.incubator.vector
jdk.internal.ed
jdk.internal.jvmstat
jdk.internal.le
jdk.internal.opt
jdk.internal.vm.ci
jdk.internal.vm.compiler
jdk.internal.vm.compiler.management
jdk.jartool
jdk.javadoc
jdk.jcmd
jdk.jconsole
jdk.jdeps
jdk.jdi
jdk.jdwp.agent
jdk.jfr
jdk.jlink
jdk.jpackage
jdk.jshell
jdk.jsobject
jdk.jstatd
jdk.localedata
jdk.management
jdk.management.agent
jdk.management.jfr
jdk.naming.dns
jdk.naming.rmi
jdk.net
jdk.nio.mapmode
jdk.random
jdk.sctp
jdk.security.auth
jdk.security.jgss
jdk.unsupported
jdk.unsupported.desktop
jdk.xml.dom
jdk.zipfs
ls <JAVA_HOME>/bin
command:docker container run --rm openjdk:21 ls /usr/java/openjdk-21/bin docker container run --rm mcr.microsoft.com/openjdk/jdk:21-ubuntu ls /usr/lib/jvm/msopenjdk-21-amd64/bin
29
個):jar
jarsigner
java
javac
javadoc
javap
jcmd
jconsole
jdb
jdeprscan
jdeps
jfr
jhsdb
jimage
jinfo
jlink
jmap
jmod
jpackage
jps
jrunscript
jshell
jstack
jstat
jstatd
jwebserver
keytool
rmiregistry
serialver
/bin
folder 裡面既執行檔。以下列出 JDK 21 提供既所有 modules 以及執行檔之間既關係。# | Java module | 執行檔 |
---|---|---|
1 | java.base | java 、keytool |
2 | java.compiler | java 、keytool |
3 | java.datatransfer | java 、keytool |
4 | java.desktop | java 、keytool |
5 | java.instrument | java 、keytool |
6 | java.logging | java 、keytool |
7 | java.management | java 、keytool |
8 | java.management.rmi | java 、keytool 、rmiregistry |
9 | java.naming | java 、keytool |
10 | java.net.http | java 、keytool |
11 | java.prefs | java 、keytool |
12 | java.rmi | java 、keytool 、rmiregistry |
13 | java.scripting | java 、jrunscript 、keytool |
14 | java.se | java 、jrunscript 、keytool 、rmiregistry |
15 | java.security.jgss | java 、keytool |
16 | java.security.sasl | java 、keytool |
17 | java.smartcardio | java 、keytool |
18 | java.sql | java 、keytool |
19 | java.sql.rowset | java 、keytool |
20 | java.transaction.xa | java 、keytool |
21 | java.xml | java 、keytool |
22 | java.xml.crypto | java 、keytool |
23 | jdk.accessibility | java 、keytool |
24 | jdk.attach | java 、keytool |
25 | jdk.charsets | java 、keytool |
26 | jdk.compiler | java 、javac 、keytool 、serialver |
27 | jdk.crypto.cryptoki | java 、keytool |
28 | jdk.crypto.ec | java 、keytool |
29 | jdk.dynalink | java 、keytool |
30 | jdk.editpad | java 、keytool |
31 | jdk.hotspot.agent | java 、jhsdb 、jrunscript 、keytool 、rmiregistry |
32 | jdk.httpserver | java 、jwebserver 、keytool |
33 | jdk.incubator.vector | java 、keytool |
34 | jdk.internal.ed | java 、keytool |
35 | jdk.internal.jvmstat | java 、keytool |
36 | jdk.internal.le | java 、keytool |
37 | jdk.internal.opt | java 、keytool |
38 | jdk.internal.vm.ci | java 、keytool |
39 | jdk.internal.vm.compiler | java 、keytool |
40 | jdk.internal.vm.compiler.management | java 、keytool |
41 | jdk.jartool | jar 、jarsigner 、java 、keytool |
42 | jdk.javadoc | java 、javac 、javadoc 、keytool 、serialver |
43 | jdk.jcmd | java 、jcmd 、jinfo 、jmap 、jps 、jstack 、jstat 、keytool |
44 | jdk.jconsole | java 、jconsole 、keytool 、rmiregistry |
45 | jdk.jdeps | java 、javac 、javap 、jdeprscan 、jdeps 、keytool 、serialver |
46 | jdk.jdi | java 、jdb 、keytool |
47 | jdk.jdwp.agent | java 、keytool |
48 | jdk.jfr | java 、jfr 、keytool |
49 | jdk.jlink | java 、javac 、javap 、jdeprscan 、jdeps 、jimage 、jlink 、jmod 、keytool 、serialver |
50 | jdk.jpackage | java 、javac 、javap 、jdeprscan 、jdeps 、jimage 、jlink 、jmod 、jpackage 、keytool 、serialver |
51 | jdk.jshell | java 、javac 、jdb 、jshell 、keytool 、serialver |
52 | jdk.jsobject | java 、keytool |
53 | jdk.jstatd | java 、jstatd 、keytool 、rmiregistry |
54 | jdk.localedata | java 、keytool |
55 | jdk.management | java 、keytool |
56 | jdk.management.agent | java 、keytool 、rmiregistry |
57 | jdk.management.jfr | java 、jfr 、keytool |
58 | jdk.naming.dns | java 、keytool |
59 | jdk.naming.rmi | java 、keytool 、rmiregistry |
60 | jdk.net | java 、keytool |
61 | jdk.nio.mapmode | java 、keytool |
62 | jdk.random | java 、keytool |
63 | jdk.sctp | java 、keytool |
64 | jdk.security.auth | java 、keytool |
65 | jdk.security.jgss | java 、keytool |
66 | jdk.unsupported | java 、keytool |
67 | jdk.unsupported.desktop | java 、keytool |
68 | jdk.xml.dom | java 、keytool |
69 | jdk.zipfs | java 、keytool |
# | 執行檔 | Java modules |
---|---|---|
1 | jar | jdk.jartool |
2 | jarsigner | jdk.jartool |
3 | java | 全部 |
4 | javac | jdk.compiler 、jdk.javadoc 、jdk.jdeps 、jdk.jlink 、jdk.jpackage 、jdk.jshell |
5 | javadoc | jdk.javadoc |
6 | javap | jdk.jdeps 、jdk.jlink 、jdk.jpackage |
7 | jcmd | jdk.jcmd |
8 | jconsole | jdk.jconsole |
9 | jdb | jdk.jdi 、jdk.jshell |
10 | jdeprscan | jdk.jdeps 、jdk.jlink 、jdk.jpackage |
11 | jdeps | jdk.jdeps 、jdk.jlink 、jdk.jpackage |
12 | jfr | jdk.jfr 、jdk.management.jfr |
13 | jhsdb | jdk.hotspot.agent |
14 | jimage | jdk.jlink 、jdk.jpackage |
15 | jinfo | jdk.jcmd |
16 | jlink | jdk.jlink 、jdk.jpackage |
17 | jmap | jdk.jcmd |
18 | jmod | jdk.jlink 、jdk.jpackage |
19 | jpackage | jdk.jpackage |
20 | jps | jdk.jcmd |
21 | jrunscript | java.scripting 、java.se 、jdk.hotspot.agent |
22 | jshell | jdk.jshell |
23 | jstack | jdk.jcmd |
24 | jstat | jdk.jcmd |
25 | jstatd | jdk.jstatd |
26 | jwebserver | jdk.httpserver |
27 | keytool | 全部 |
28 | rmiregistry | java.management.rmi 、java.rmi 、java.se 、jdk.hotspot.agent 、jdk.jconsole 、jdk.jstatd 、jdk.management.agent 、jdk.naming.rmi |
29 | serialver | jdk.compiler 、jdk.javadoc 、jdk.jdeps 、jdk.jlink 、jdk.jpackage 、jdk.jshell |