镜像构建历史
# 2025-11-06 23:40:55 0.00B 配置容器启动时运行的命令
ENTRYPOINT ["sh" "-c" "java -Dreactor.schedulers.defaultBoundedElasticOnVirtualThreads=true ${JVM_OPTS} org.springframework.boot.loader.launch.JarLauncher ${0} ${@}"]
# 2025-11-06 23:40:55 0.00B 声明容器运行时监听的端口
EXPOSE [8090/tcp]
# 2025-11-06 23:40:55 47.00B 执行命令并创建新的镜像层
RUN /bin/sh -c ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # buildkit
# 2025-11-06 23:40:55 0.00B 设置环境变量 JVM_OPTS HALO_WORK_DIR SPRING_CONFIG_LOCATION TZ
ENV JVM_OPTS=-Xmx256m -Xms256m HALO_WORK_DIR=/root/.halo2 SPRING_CONFIG_LOCATION=optional:classpath:/;optional:file:/root/.halo2/ TZ=Asia/Shanghai
# 2025-11-06 23:40:55 25.50MB 复制新文件或目录到容器中
COPY application/application/ ./ # buildkit
# 2025-11-06 23:40:55 0.00B 复制新文件或目录到容器中
COPY application/snapshot-dependencies/ ./ # buildkit
# 2025-11-06 23:40:55 399.36KB 复制新文件或目录到容器中
COPY application/spring-boot-loader/ ./ # buildkit
# 2025-11-06 23:40:54 93.70MB 复制新文件或目录到容器中
COPY application/dependencies/ ./ # buildkit
# 2025-11-06 23:40:48 0.00B 设置工作目录为/application
WORKDIR /application
# 2025-11-06 23:40:48 0.00B 添加元数据标签
LABEL maintainer=johnniang <johnniang@foxmail.com>
# 2025-11-05 03:13:00 17.83MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; unset OPENJ9_JAVA_OPTIONS; SCC_SIZE="50m"; DOWNLOAD_PATH_TOMCAT=/tmp/tomcat; INSTALL_PATH_TOMCAT=/opt/tomcat-home; TOMCAT_CHECKSUM="2a955d97c6ed7d01fbf0392f3e2920129bcd541b259e894f441e411bac3bbe65576bcb3a314f06d624c9d70040828d26aa8a2c4f39d225d73f6a3db7523aa3ba"; TOMCAT_VERSION="9.0.111"; TOMCAT_FILENAME="apache-tomcat-${TOMCAT_VERSION}.tar.gz"; SUCCESS=; mkdir -p "${DOWNLOAD_PATH_TOMCAT}" "${INSTALL_PATH_TOMCAT}"; for baseUrl in https://dlcdn.apache.org/tomcat/tomcat-9/v${TOMCAT_VERSION}/bin https://archive.apache.org/dist/tomcat/tomcat-9/v${TOMCAT_VERSION}/bin ; do if curl -LfsSo "${DOWNLOAD_PATH_TOMCAT}"/tomcat.tar.gz "${baseUrl}/${TOMCAT_FILENAME}" && [ -s "${DOWNLOAD_PATH_TOMCAT}"/tomcat.tar.gz ]; then SUCCESS=1; break; fi; done; [ -n "$SUCCESS" ]; echo "${TOMCAT_CHECKSUM} ${DOWNLOAD_PATH_TOMCAT}/tomcat.tar.gz" | sha512sum -c -; tar -xf "${DOWNLOAD_PATH_TOMCAT}"/tomcat.tar.gz -C "${INSTALL_PATH_TOMCAT}" --strip-components=1; rm -rf "${DOWNLOAD_PATH_TOMCAT}"; java -Xshareclasses:name=dry_run_scc,cacheDir=/opt/java/.scc,bootClassesOnly,nonFatal,createLayer -Xscmx$SCC_SIZE -version; export OPENJ9_JAVA_OPTIONS="-XX:+IProfileDuringStartupPhase -Xshareclasses:name=dry_run_scc,cacheDir=/opt/java/.scc,bootClassesOnly,nonFatal"; "${INSTALL_PATH_TOMCAT}"/bin/startup.sh; sleep 5; "${INSTALL_PATH_TOMCAT}"/bin/shutdown.sh -force; sleep 15; FULL=$( (java -Xshareclasses:name=dry_run_scc,cacheDir=/opt/java/.scc,printallStats 2>&1 || true) | awk '/^Cache is [0-9.]*% .*full/ {print substr($3, 1, length($3)-1)}'); DST_CACHE=$(java -Xshareclasses:name=dry_run_scc,cacheDir=/opt/java/.scc,destroy 2>&1 || true); SCC_SIZE=$(echo $SCC_SIZE | sed 's/.$//'); SCC_SIZE=$(awk "BEGIN {print int($SCC_SIZE * $FULL / 100.0)}"); [ "${SCC_SIZE}" -eq 0 ] && SCC_SIZE=1; SCC_SIZE="${SCC_SIZE}m"; java -Xshareclasses:name=openj9_system_scc,cacheDir=/opt/java/.scc,bootClassesOnly,nonFatal,createLayer -Xscmx$SCC_SIZE -version; unset OPENJ9_JAVA_OPTIONS; export OPENJ9_JAVA_OPTIONS="-XX:+IProfileDuringStartupPhase -Xshareclasses:name=openj9_system_scc,cacheDir=/opt/java/.scc,bootClassesOnly,nonFatal"; "${INSTALL_PATH_TOMCAT}"/bin/startup.sh; sleep 5; "${INSTALL_PATH_TOMCAT}"/bin/shutdown.sh -force; sleep 5; FULL=$( (java -Xshareclasses:name=openj9_system_scc,cacheDir=/opt/java/.scc,printallStats 2>&1 || true) | awk '/^Cache is [0-9.]*% .*full/ {print substr($3, 1, length($3)-1)}'); echo "SCC layer is $FULL% full."; rm -rf "${INSTALL_PATH_TOMCAT}"; if [ -d "/opt/java/.scc" ]; then chmod -R 0777 /opt/java/.scc; fi; echo "SCC generation phase completed"; # buildkit
# 2025-11-05 03:12:29 0.00B 设置环境变量 JAVA_TOOL_OPTIONS -Xshareclasses:name
ENV JAVA_TOOL_OPTIONS=-XX:+IgnoreUnrecognizedVMOptions -XX:+PortableSharedCache -XX:+IdleTuningGcOnIdle -Xshareclasses:name=openj9_system_scc,cacheDir=/opt/java/.scc,readonly,nonFatal
# 2025-11-05 03:12:29 0.00B 设置环境变量 JAVA_HOME PATH
ENV JAVA_HOME=/opt/java/openjdk PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2025-11-05 03:12:29 183.28MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; ARCH="$(dpkg --print-architecture)"; case "${ARCH}" in aarch64|arm64) ESUM='ac8c6c5aa3c345e14e82966972040b479d672c12e5cd0eaa52d8b38e6bdea40c'; BINARY_URL='https://github.com/ibmruntimes/semeru21-binaries/releases/download/jdk-21.0.9%2B10_openj9-0.56.0/ibm-semeru-open-jre_aarch64_linux_21.0.9_10_openj9-0.56.0.tar.gz'; ;; amd64|x86_64) ESUM='6b3022f3d286b2fde9a964028da637a5ad9a93b1028741dcb72aa3bca49c83d2'; BINARY_URL='https://github.com/ibmruntimes/semeru21-binaries/releases/download/jdk-21.0.9%2B10_openj9-0.56.0/ibm-semeru-open-jre_x64_linux_21.0.9_10_openj9-0.56.0.tar.gz'; ;; ppc64el|ppc64le) ESUM='876af8243616745796762539816cdb37c194e4b5942398277d6ccd35e96e3dcc'; BINARY_URL='https://github.com/ibmruntimes/semeru21-binaries/releases/download/jdk-21.0.9%2B10_openj9-0.56.0/ibm-semeru-open-jre_ppc64le_linux_21.0.9_10_openj9-0.56.0.tar.gz'; ;; s390x) ESUM='e7828369bf76eb25426b807c039974f067888e1f67e9e461274407675946738e'; BINARY_URL='https://github.com/ibmruntimes/semeru21-binaries/releases/download/jdk-21.0.9%2B10_openj9-0.56.0/ibm-semeru-open-jre_s390x_linux_21.0.9_10_openj9-0.56.0.tar.gz'; ;; *) echo "Unsupported arch: ${ARCH}"; exit 1; ;; esac; curl -LfsSo /tmp/openjdk.tar.gz ${BINARY_URL}; echo "${ESUM} */tmp/openjdk.tar.gz" | sha256sum -c -; mkdir -p /opt/java/openjdk; cd /opt/java/openjdk; tar -xf /tmp/openjdk.tar.gz --strip-components=1; rm -rf /tmp/openjdk.tar.gz; # buildkit
# 2025-11-05 03:12:27 0.00B 设置环境变量 JAVA_VERSION
ENV JAVA_VERSION=jdk-21.0.9+10_openj9-0.56.0
# 2025-11-05 03:12:27 34.69MB 执行命令并创建新的镜像层
RUN /bin/sh -c apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata curl ca-certificates fontconfig locales && echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && locale-gen en_US.UTF-8 && rm -rf /var/lib/apt/lists/* # buildkit
# 2025-11-05 03:12:27 0.00B 设置环境变量 LANG LANGUAGE LC_ALL
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
# 2025-10-01 21:01:37 0.00B
/bin/sh -c #(nop) CMD ["/bin/bash"]
# 2025-10-01 21:01:37 78.12MB
/bin/sh -c #(nop) ADD file:249778a1782b02a1c2bcf9f292f5778d81442a53c3de1958d712f10baf7e0b60 in /
# 2025-10-01 21:01:35 0.00B
/bin/sh -c #(nop) LABEL org.opencontainers.image.version=24.04
# 2025-10-01 21:01:35 0.00B
/bin/sh -c #(nop) LABEL org.opencontainers.image.ref.name=ubuntu
# 2025-10-01 21:01:35 0.00B
/bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH
# 2025-10-01 21:01:35 0.00B
/bin/sh -c #(nop) ARG RELEASE
镜像信息
{
"Id": "sha256:4ff2b2b66ca40ee4d4169ae0a0046ee83f5e6d08bcceaedf4d3673d1e8975239",
"RepoTags": [
"halohub/halo:2.21.10",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/halohub/halo:2.21.10"
],
"RepoDigests": [
"halohub/halo@sha256:11072358e90805562285e92001133e161f64f84d5840d67d72d6819b3dfb112c",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/halohub/halo@sha256:5aba9bbe109d59c4c770b843c81a2f3e130f14e39d887cb29b2198ee9700e1cf"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2025-11-06T15:40:55.564823033Z",
"Container": "",
"ContainerConfig": null,
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8090/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=en_US.UTF-8",
"LANGUAGE=en_US:en",
"LC_ALL=en_US.UTF-8",
"JAVA_VERSION=jdk-21.0.9+10_openj9-0.56.0",
"JAVA_HOME=/opt/java/openjdk",
"JAVA_TOOL_OPTIONS=-XX:+IgnoreUnrecognizedVMOptions -XX:+PortableSharedCache -XX:+IdleTuningGcOnIdle -Xshareclasses:name=openj9_system_scc,cacheDir=/opt/java/.scc,readonly,nonFatal",
"JVM_OPTS=-Xmx256m -Xms256m",
"HALO_WORK_DIR=/root/.halo2",
"SPRING_CONFIG_LOCATION=optional:classpath:/;optional:file:/root/.halo2/",
"TZ=Asia/Shanghai"
],
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "/application",
"Entrypoint": [
"sh",
"-c",
"java -Dreactor.schedulers.defaultBoundedElasticOnVirtualThreads=true ${JVM_OPTS} org.springframework.boot.loader.launch.JarLauncher ${0} ${@}"
],
"OnBuild": null,
"Labels": {
"maintainer": "johnniang \u003cjohnniang@foxmail.com\u003e",
"org.opencontainers.image.created": "2025-11-06T15:40:17.997Z",
"org.opencontainers.image.description": "强大易用的开源建站工具。",
"org.opencontainers.image.licenses": "GPL-3.0",
"org.opencontainers.image.ref.name": "ubuntu",
"org.opencontainers.image.revision": "d57c4d8070de0972d2e5a8cb3c37889e99b51a03",
"org.opencontainers.image.source": "https://github.com/halo-dev/halo",
"org.opencontainers.image.title": "halo",
"org.opencontainers.image.url": "https://github.com/halo-dev/halo",
"org.opencontainers.image.version": "2"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 433507851,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/6ac6de5988af6189a71986025a9daf13ae54c6d03caec7477f93c859b4dda6dc/diff:/var/lib/docker/overlay2/1a4db96a58722d1f09de0dd0a9b31802aeeaac5d88b71aea7c376e52ef4cd81d/diff:/var/lib/docker/overlay2/ed074f2b9682e66b76dcdceae2a2f6e58ea62273282d8af0d76517863191bfcb/diff:/var/lib/docker/overlay2/18d5b57c6d0e42a9b5ac216bc5d4a17cfe33a71c8f2a8bc026dcde9b8d58202d/diff:/var/lib/docker/overlay2/1f6891475fe963865d8a597c9cdea30505043ac2bac884ecc63c393ec8655dc0/diff:/var/lib/docker/overlay2/bf091217b77714765a4b15142cf00aab9ad8e577284e1682ff61f5ba8f9d684b/diff:/var/lib/docker/overlay2/9d652a1dd9b1b5c0d2be6bda0d5a476b1fa9c0013f6ef75527fda056f6306a59/diff:/var/lib/docker/overlay2/4c71ce518b9499a63e8f15835fd914170683584c86f3a401f73ba55ef454c3c2/diff:/var/lib/docker/overlay2/a02d007916e6bb54eaae16fa57a5272d8a5cb220a5c6fad9575b922183dc0478/diff",
"MergedDir": "/var/lib/docker/overlay2/5053ceee6f329d4e86f0bace10f6eb20a98ec768ff9f89398c8a0b8d816e39a2/merged",
"UpperDir": "/var/lib/docker/overlay2/5053ceee6f329d4e86f0bace10f6eb20a98ec768ff9f89398c8a0b8d816e39a2/diff",
"WorkDir": "/var/lib/docker/overlay2/5053ceee6f329d4e86f0bace10f6eb20a98ec768ff9f89398c8a0b8d816e39a2/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc",
"sha256:d812601b81a379dda64ee7e5193a0fa625353e77025d9af8b5a9f686302d3707",
"sha256:e89eba526da8c187b09acec1a2aa8c5a6991fe5ea3dffbb861e0e5f3a4e81a83",
"sha256:8344e1b1ecf62e6c2aca273aa45ec5e675c67c3f8dc9032a04d955b8cf5dc527",
"sha256:38e6e2c3ce8bb964a4490d327e694e5ab9da0779071f5c9051072c0340f37f69",
"sha256:fab8590012ded11517adf5059c45169000e94cbc503d11a2f4e010c9b981f6d1",
"sha256:1eb74e00aa0dbc820a46009b51ae334fc36978ec6c09e6bd02de859427b47c72",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:19ab955de4133e9a0cd3360ac6680cdc69aab4278c7cee74618aa5614e564280",
"sha256:8a4429a6b1d6562a2874340b2c5a72b43c5523b6abf7e6e012cfe71af6659b07"
]
},
"Metadata": {
"LastTagTime": "2026-07-21T11:11:08.5504103+08:00"
}
}