[英]Docker image build failed on Mac M1 chip
我正在嘗試在 maven 項目中構建一個簡單的 docker 圖像,將圖像構建添加為 maven 構建過程的一部分:
<build>
<finalName>my-api</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.6</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<!-- <goal>push</goal> -->
</goals>
</execution>
</executions>
<configuration>
<repository>reponame/${project.name}</repository>
<tag>${project.version}</tag>
<skipDockerInfo>true</skipDockerInfo>
</configuration>
</plugin>
</plugins>
</build>
FROM openjdk:8-jdk-alpine
VOLUME /tmp
EXPOSE 8080
ADD target/*.jar app.jar
ENTRYPOINT [ "sh", "-c", "java -jar /app.jar" ]
但是它失敗了,總是得到相同的錯誤跟蹤,無論我使用哪個圖像,錯誤仍然存在。
錯誤:
引起:com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException:java.lang.UnsatisfiedLinkError:無法加載 FFI 提供程序 jnr.ffi.provider.jffi.Provider
Caused by: java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: /private/var/folders/hz/rgppp8250rsdp86kf_tfjvqw0000gp/T/jffi8502916075702391528.dylib: dlopen(/private/var/folders/hz/rgppp8250rsdp86kf_tfjvqw0000gp/T/jffi8502916075702391528.dylib , 0x0001): 試過: '/private/var/folders/hz/rgppp8250rsdp86kf_tfjvqw0000gp/T/jffi8502916075702391528.dylib' (fat 文件, 但缺少兼容架構 (有 'i386,x86_64', 需要 'arm64e')), '/usr /lib/jffi8502916075702391528.dylib'(沒有這樣的文件)
我試過的其他圖片:
我的 java 版本:openjdk 版本“11.0.13” 2021-10-19 LTS
我的 Docker 版本:Docker 版本 20.10.11,build dea9396
提前致謝。
看起來dockerfile-maven-plugin
使用基於 x86 架構的運行時,並且無法在 Apple M1 (Arm) 上運行。
該插件現在處於非活動狀態,因此您應該嘗試其他方法,例如fabric8-maven-plugin
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.38.1</version>
<executions>
<execution>
<id>build</id>
<phase>pre-integration-test</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
不再維護 spotify docker maven 插件。 他們需要將依賴升級到支持 aarch64 的版本。
在我們的例子中,需要進行大量重構才能移動到 fabric8 的插件或使用 maven exec,因此我們想繼續使用 spotify 插件。
幸運的是,您可以通過向插件部分添加<dependencies>
部分來強制插件使用特定的依賴項。
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.6</version>
<dependencies>
<dependency>
<groupId>com.github.jnr</groupId>
<artifactId>jnr-unixsocket</artifactId>
<version>0.38.14</version>
</dependency>
</dependencies>
</plugin>
我遇到了同樣的問題。根據錯誤消息,應該是與 docker 守護程序的連接錯誤。似乎該插件不支持 Arm 套接字,您可以這樣做:
(1) 安裝socat
brew install socat
(2)設置端口轉發
socat TCP-LISTEN:2375,range=127.0.0.1/32,reuseaddr,fork UNIX-CLIENT:/var/run/docker.sock
(3) 設置環境變量
export DOCKER_HOST=tcp://127.0.0.1:2375
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.