我们在 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 映像。 不完全好,但它的工作原理。