【问题标题】:Docker image build failed on Mac M1 chipMac M1 芯片上的 Docker 镜像构建失败
【发布时间】:2022-11-29 00:11:17
【问题描述】:

我正在尝试在 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

引起: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' (胖文件,但缺少兼容的体系结构(有'i386,x86_64', 需要 'arm64e')), '/usr/lib/jffi8502916075702391528.dylib' (没有这样的 文件)

我试过的其他图片:

  • openjdk:13-alpine3.9
  • openjdk:8-jre-alpine3.9
  • azul/zulu-openjdk-alpine:17.0.2-17.32.13-arm64

我的java版本: openjdk 版本“11.0.13” 2021-10-19 LTS

我的 Docker 版本: Docker 版本 20.10.11,构建 dea9396

提前致谢。

【问题讨论】:

  • 日志中显示的 Spotify docker 客户端是什么?你在使用某种 Maven/Gradle 插件吗?如果您使用 docker build 命令构建会发生什么?
  • 我正在使用 dockerfile-maven-plugin 并将图像构建作为 mvn 执行的一部分,运行 docker build 命令。

标签: java docker maven


【解决方案1】:

看起来 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> 

【讨论】:

  • 成功了,非常感谢。
【解决方案2】:

我遇到了同样的问题。根据报错信息,应该是与docker daemon的连接错误。看来该插件不支持Arm socket,你可以这样做:

(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

【讨论】:

    【解决方案3】:

    不再维护这两个 spotify docker maven 插件。他们需要将依赖升级到支持 aarch64 的版本。

    在我们的例子中,需要进行大量重构才能转移到 fabric8 的插件或使用 maven exec,因此我们想继续使用 spotify 插件。

    幸运的是,您可以通过向插件部分添加 &lt;dependencies&gt; 部分来强制插件使用特定的依赖项。

                    <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>
    
    

    【讨论】:

      最近更新 更多