背景
客户环境提供的容器集群全是arm架构,因此打包时要在arm架构的电脑上来制作镜像,本人使用mac m3芯片macbook,但是执行mvn clean package -D maven.test.skip=true docker:build
命令时报错,报错信息如下:
Caused by: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.lang.UnsatisfiedLinkError: could not load FFI provider 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): tried: '/private/var/folders/hz/rgppp8250rsdp86kf_tfjvqw0000gp/T/jffi8502916075702391528.dylib' (fat file, but missing compatible architecture (have 'i386,x86_64', need 'arm64e')), '/usr/lib/jffi8502916075702391528.dylib' (no such file)
原因
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
该插件无法在arm架构的机器上运行
解决方案
1. 插件替换
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
</plugin>
</plugins>
将该插件替换为如下插件
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.38.1</version>
</plugin>
</plugins>
2. 使用socket插件
如果出现连接拒绝的错误时,可能是插件无法和arm机器的docker进程通信导致错误,可以这样尝试解决。
2.1 安装socat
socat 是一个多功能的网络工具,用于在 Linux 和 Unix 系统中进行双向数据传输,它不仅支持 TCP/UDP 流,还支持多种其他类型的连接,如 UNIX 域套接字、管道、文件、命名管道、串行端口、伪终端(pty)、OpenSSL 加密的套接字等。socat 的强大之处在于它能够几乎在任意两个数据流之间创建双向通道,从而提供了极高的灵活性和强大的功能。
brew install socat
2.2 设置端口转发
socat TCP-LISTEN:2375,range=127.0.0.1/32,reuseaddr,fork UNIX-CLIENT:/var/run/docker.sock
2.3 设置环境变量
export DOCKER_HOST=tcp://127.0.0.1:2375