Error while proxying quay.io (Error 500, NullPointerException, DockerProxyFacetImpl) OSS 3.19.1-01

Hi,

We’re trying to proxy quay.io but we are running into a NullPointerException when we try to fetch an image. We have Nexus 3.19.1-01 OSS. Here is the stack trace:

docker pull xxx/coreos/clair:v2.1.2
Error response from daemon: received unexpected HTTP status: 500 Server Error

In Nexus logs:

2020-01-20 11:15:08,372+0100 WARN  [qtp851930694-1293890]  anonymous org.sonatype.nexus.repository.docker.internal.V2Handlers - Error: GET /v2/coreos/clair/manifests/v2.1.1
java.lang.NullPointerException: null
	at org.sonatype.nexus.repository.docker.internal.DockerProxyFacetImpl.lambda$7(DockerProxyFacetImpl.java:1116)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
	at org.sonatype.nexus.repository.docker.internal.DockerProxyFacetImpl.identifyForeignLayers(DockerProxyFacetImpl.java:1118)
	at org.sonatype.nexus.repository.docker.internal.DockerProxyFacetImpl.getManifest(DockerProxyFacetImpl.java:922)
	at org.sonatype.nexus.repository.docker.internal.DockerProxyFacetImpl.getCachedContent(DockerProxyFacetImpl.java:310)
	at org.sonatype.nexus.repository.proxy.ProxyFacetSupport.maybeGetCachedContent(ProxyFacetSupport.java:369)
	at org.sonatype.nexus.repository.proxy.ProxyFacetSupport.get(ProxyFacetSupport.java:229)
	at org.sonatype.nexus.repository.proxy.ProxyHandler.handle(ProxyHandler.java:52)
	at org.sonatype.nexus.repository.view.Context.proceed(Context.java:80)
	at org.sonatype.nexus.repository.view.handlers.LastDownloadedHandler.handle(LastDownloadedHandler.java:63)
	at org.sonatype.nexus.repository.view.Context.proceed(Context.java:80)
	at org.sonatype.nexus.repository.storage.UnitOfWorkHandler.handle(UnitOfWorkHandler.java:39)
	at org.sonatype.nexus.repository.view.Context.proceed(Context.java:80)
	at org.sonatype.nexus.repository.view.Context$proceed.call(Unknown Source)
	at org.sonatype.nexus.repository.docker.internal.V2Handlers$_closure16.doCall(V2Handlers.groovy:273)
	at sun.reflect.GeneratedMethodAccessor555.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
	at groovy.lang.Closure.call(Closure.java:418)
	at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:54)
	at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:124)
	at com.sun.proxy.$Proxy179.handle(Unknown Source)
	at org.sonatype.nexus.repository.view.Context.proceed(Context.java:80)
	at org.sonatype.nexus.repository.http.PartialFetchHandler.handle(PartialFetchHandler.java:59)
	at org.sonatype.nexus.repository.view.Context.proceed(Context.java:80)
	at org.sonatype.nexus.repository.view.handlers.ContentHeadersHandler.handle(ContentHeadersHandler.java:46)
	at org.sonatype.nexus.repository.view.Context.proceed(Context.java:80)
	at org.sonatype.nexus.repository.view.handlers.ConditionalRequestHandler.handle(ConditionalRequestHandler.java:72)
	at org.sonatype.nexus.repository.view.Context.proceed(Context.java:80)
	at org.sonatype.nexus.repository.view.Context$proceed.call(Unknown Source)
	at org.sonatype.nexus.repository.docker.internal.V2Handlers$_closure18.doCall(V2Handlers.groovy:298)
	at sun.reflect.GeneratedMethodAccessor530.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

Hi Marc-Aurèle,

I had a chance to look at this, and unfortunately you’ve uncovered a bug in our docker format support. I’ve created a JIRA bug to get this addressed in an upcoming release (https://issues.sonatype.org/browse/NEXUS-22498).

In the meantime I’m afraid the only workaround I can suggest is disabling foreign layer caching on the NXRM proxy repository.

Thanks for the quick check and to open the issue. We should be able to have the caching disabled on that specific repository until it’s fixed.