构建多平台 JDK/Tomcat docker 图像,以便能够 运行 在 Apple Silicon 上
Build a multiplatform JDK/Tomcat docker image to be able to run on Apple Silicon
我们在 CI 中使用 tomcat 服务构建 docker 图像,如下所示:
- PLATFORMS: linux/amd64,linux/arm64/v8
- gradle build …
# Switch to use different docker driver which supports multiplatform builds
- docker buildx create --use
- docker buildx build --push --platform=$PLATFORMS -t $image -f infra/Dockerfile .
这有效并推送可以在 linux/amd64 平台上轻松 运行 的图像。
然而,当 运行在 Apple Silicon 上使用此图像时,它失败了:
org.apache.catalina.startup.ContextConfig
Failed to detect ServletContainerInitializers for context with name [] service
java.net.MalformedURLException: no !/ found in url spec:file:/usr/local/tomcat/lib/tomcat-websocket.jar!/META-INF/services/javax.servlet.ServletContainerInitializer
这里有完整的堆栈跟踪:https://gist.github.com/knyttl/c8f2c24ac3d94a91911ca08f08eff668
让我有点意外的是:
org.apache.catalina.startup.VersionLoggerListener Architecture: amd64
我猜架构应该是linux/arm64/v8
,为什么运行错了?
最后,我放弃了CI构建M1图像的方式。
相反,我编写了一个 bash 脚本(在 M1 本地 运行)提取 CI-built 图像并使用 CI-built 重建 M1 图像图片内容。不太好,但它有效。
我们在 CI 中使用 tomcat 服务构建 docker 图像,如下所示:
- PLATFORMS: linux/amd64,linux/arm64/v8
- gradle build …
# Switch to use different docker driver which supports multiplatform builds
- docker buildx create --use
- docker buildx build --push --platform=$PLATFORMS -t $image -f infra/Dockerfile .
这有效并推送可以在 linux/amd64 平台上轻松 运行 的图像。
然而,当 运行在 Apple Silicon 上使用此图像时,它失败了:
org.apache.catalina.startup.ContextConfig
Failed to detect ServletContainerInitializers for context with name [] service
java.net.MalformedURLException: no !/ found in url spec:file:/usr/local/tomcat/lib/tomcat-websocket.jar!/META-INF/services/javax.servlet.ServletContainerInitializer
这里有完整的堆栈跟踪:https://gist.github.com/knyttl/c8f2c24ac3d94a91911ca08f08eff668
让我有点意外的是:
org.apache.catalina.startup.VersionLoggerListener Architecture: amd64
我猜架构应该是linux/arm64/v8
,为什么运行错了?
最后,我放弃了CI构建M1图像的方式。
相反,我编写了一个 bash 脚本(在 M1 本地 运行)提取 CI-built 图像并使用 CI-built 重建 M1 图像图片内容。不太好,但它有效。