构建一个能够在 Apple Silicon 上运行的多平台 JDK/Tomcat docker 映像

我们在 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 构建的映像并使用 CI 构建的映像内容重建 M1 映像。 不完全好,但它的工作原理。

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据