spotify / dockerfile-maven

MATURE: A set of Maven tools for dealing with Dockerfiles
Apache License 2.0
2.75k stars 493 forks source link

Plugin fails to run on Apple silicon (M1, M1 Pro, M1 Max) #394

Open davidjayb opened 2 years ago

davidjayb commented 2 years ago

Is this a BUG REPORT or FEATURE REQUEST?:

BUG REPORT

Description

The plugin fails to build the Docker image. This seems to be regardless of the plugin configuration.

How to reproduce

Run the plugin on Apple silicon, such as a MacBook Pro with the M1 Pro chip.

mvn clean install

What do you expect

The plugin should be able to build the docker image.

What happened instead

[Describe the actual results]

Software:

[INFO] --- dockerfile-maven-plugin:1.4.13:build (default) @ my-project ---
[INFO] dockerfile: null
[INFO] contextDirectory: /Users/myuser/app/my-project/docker
[INFO] Building Docker context /Users/myuser/app/my-project/docker
[INFO] Path(dockerfile): null
[INFO] Path(contextDirectory): /Users/myuser/app/my-project/docker
[INFO]
[INFO] Image will be built as my-repo/my-project:0.0.1-SNAPSHOT
[INFO]
[WARNING] An attempt failed, will retry 1 more times
<snip>
[INFO] dockerfile: null
[INFO] contextDirectory: /Users/myuser/app/my-project/docker
[INFO] Building Docker context /Users/myuser/app/my-project/docker
[INFO] Path(dockerfile): null
[INFO] Path(contextDirectory): /Users/myuser/app/my-project/docker
[INFO]
[INFO] Image will be built as my-repo/my-project:0.0.1-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.936 s
[INFO] Finished at: 2022-02-17T13:04:18-07:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project my-project: Could not build image: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.lang.UnsatisfiedLinkError: could not load FFI provider com.spotify.docker.client.shaded.jnr.ffi.provider.jffi.Provider: ExceptionInInitializerError: Can't overwrite cause with java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: /private/var/folders/h8/cj2lhn7n2wx3vd38y5q71fc00000gn/T/jffi14954787931679265064.dylib: dlopen(/private/var/folders/h8/cj2lhn7n2wx3vd38y5q71fc00000gn/T/jffi14954787931679265064.dylib, 0x0001): tried: '/private/var/folders/h8/cj2lhn7n2wx3vd38y5q71fc00000gn/T/jffi14954787931679265064.dylib' (fat file, but missing compatible architecture (have 'i386,x86_64', need 'arm64e')), '/usr/lib/jffi14954787931679265064.dylib' (no such file)
[ERROR]     at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
[ERROR]     at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:384)
[ERROR]     at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:228)
[ERROR]     at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:170)
[ERROR]     at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2389)
[ERROR]     at java.base/java.lang.Runtime.load0(Runtime.java:755)
[ERROR]     at java.base/java.lang.System.load(System.java:1953)
[ERROR]     at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:371)
[ERROR]     at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:258)
[ERROR]     at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:444)
[ERROR]     at java.base/java.lang.Class.forName0(Native Method)
[ERROR]     at java.base/java.lang.Class.forName(Class.java:467)
[ERROR]     at com.kenai.jffi.Init.load(Init.java:68)
[ERROR]     at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49)
[ERROR]     at com.kenai.jffi.Foreign$InstanceHolder.<clinit>(Foreign.java:45)
[ERROR]     at com.kenai.jffi.Foreign.getInstance(Foreign.java:103)
[ERROR]     at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242)
[ERROR]     at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237)
[ERROR]     at com.kenai.jffi.Type.resolveSize(Type.java:155)
[ERROR]     at com.kenai.jffi.Type.size(Type.java:138)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:187)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:66)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:62)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:58)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29)
[ERROR]     at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[ERROR]     at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
[ERROR]     at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[ERROR]     at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
[ERROR]     at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
[ERROR]     at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
[ERROR]     at java.base/java.lang.Class.newInstance(Class.java:645)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35)
[ERROR]     at com.spotify.docker.client.shaded.jnr.ffi.LibraryLoader.create(LibraryLoader.java:73)
[ERROR]     at com.spotify.docker.client.shaded.jnr.unixsocket.Native.<clinit>(Native.java:76)
[ERROR]     at com.spotify.docker.client.shaded.jnr.unixsocket.UnixSocketChannel.<init>(UnixSocketChannel.java:101)
[ERROR]     at com.spotify.docker.client.shaded.jnr.unixsocket.UnixSocketChannel.open(UnixSocketChannel.java:60)
[ERROR]     at com.spotify.docker.client.UnixConnectionSocketFactory.createSocket(UnixConnectionSocketFactory.java:69)
[ERROR]     at com.spotify.docker.client.UnixConnectionSocketFactory.createSocket(UnixConnectionSocketFactory.java:44)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:118)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
[ERROR]     at com.spotify.docker.client.shaded.org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:435)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.apache.connector.ApacheConnector$1.run(ApacheConnector.java:491)
[ERROR]     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
[ERROR]     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[ERROR]     at jersey.repackaged.com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:299)
[ERROR]     at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
[ERROR]     at jersey.repackaged.com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:50)
[ERROR]     at jersey.repackaged.com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:37)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:487)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.client.ClientRuntime$2.run(ClientRuntime.java:178)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.internal.Errors.process(Errors.java:315)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.internal.Errors.process(Errors.java:297)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.internal.Errors.process(Errors.java:267)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:340)
[ERROR]     at com.spotify.docker.client.shaded.org.glassfish.jersey.client.ClientRuntime$3.run(ClientRuntime.java:210)
[ERROR]     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
[ERROR]     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[ERROR]     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
[ERROR]     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[ERROR]     at java.base/java.lang.Thread.run(Thread.java:833)
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

The root cause seems to be (fat file, but missing compatible architecture (have 'i386,x86_64', need 'arm64e'))

jedvardsson commented 2 years ago

This project has been abandoned. The error you came across is from Java Native Runtime used by Spotify docker-client project which has been abandoned too. I think maven-exec-plugin is a safer option.

davidjayb commented 2 years ago

Thank you @jedvardsson . This was actually quite easy to do:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
        <execution>
            <id>docker-build</id>
            <phase>install</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>docker</executable>
                <workingDirectory>${project.basedir}</workingDirectory>
                <arguments>
                    <argument>build</argument>
                    <argument>-f</argument>
                    <argument>docker/Dockerfile</argument>
                    <argument>--build-arg</argument>
                    <argument>JAR_FILE=target/${project.artifactId}-${project.version}-${jar.suffix}.jar</argument>
                    <argument>-t</argument>
                    <argument>${parent.groupId}/${parent.artifactId}/${project.artifactId}:${project.version}</argument>
                    <argument>.</argument>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>