I’m a relatively novice ShinyProxy user who helped a research group deploy a shiny app on shared infrastructure. We recently did a system update and this appears to have caused ShinyProxy to fail despite the Docker configuration not changing. The app used to load, and does not following the upgrade. I have tried with ShinyProxy v3.0.2 and 3.1.1 with no luck. Any help is welcome, as I have not worked with Shiny apps or ShinyProxy in the past.
The ShinyProxy is exposed via a Traefik reverse proxy.
I’m confused by the logging line that says “Caused by: com.spotify.docker.client.exceptions.DockerRequestException: Request error: GET unix://localhost:80/images/whtns/seurattools/json: 200”, as this address does not look correctly formatted since unix sockets aren’t accesed by hostname:port, but I don’t see anywhere to configure how that URL is being constructed.
Application.yml
server:
servlet:
context-path: /cobrinik
proxy:
title: Open Analytics Shiny Proxy
logo-url: https://www.openanalytics.eu/shinyproxy/logo.png
landing-page: /app/seuratApp
port: 8080
container-wait-time: 90000
authentication: none
hide-navbar: true
container-log-path: /etc/shinyproxy/container-logs
admin-groups: admins
users:
- name: jack
password: password
groups: admins
- name: jeff
password: password
docker:
internal-networking: true
specs:
- id: euler
container-cmd: ["R", "-e", "shiny::runApp('/root/euler')"]
container-image: whtns/seurattools
access-groups: admins
container-volumes: ["cobrinik_seuratApp_dockerdata:/root/dockerdata"]
container-network: traefik_proxy
- id: seuratApp
container-cmd: ["R", "-e", "shiny::runApp('/root/dockerapp')"]
container-image: whtns/seurattools
access-groups: admins
container-volumes: ["cobrinik_seuratApp_dockerdata:/root/dockerdata"]
container-network: traefik_proxy
logging:
file:
name: shinyproxy.log
Logs from latest attempt to start a shiny app:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.6)
2025-06-03 18:41:10.955 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
2025-06-03 18:41:10.961 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2025-06-03 18:41:11.017 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 41 ms. Found 0 Redis repository interfaces.
2025-06-03 18:41:11.144 INFO 1 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2025-06-03 18:41:11.157 INFO 1 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2025-06-03 18:41:11.764 INFO 1 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-06-03 18:41:11.777 INFO 1 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'integrationChannelResolver' of type [org.springframework.integration.support.channel.BeanFactoryChannelResolver] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-06-03 18:41:12.268 WARN 1 --- [ main] io.undertow.websockets.jsr : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2025-06-03 18:41:12.321 INFO 1 --- [ main] io.undertow.servlet : Initializing Spring embedded WebApplicationContext
2025-06-03 18:41:12.322 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2995 ms
2025-06-03 18:41:12.401 INFO 1 --- [ main] e.o.c.service.IdentifierService : ShinyProxy runtimeId: fd75d413-6eef-44bd-a1be-ad28b68a6b43
2025-06-03 18:41:12.510 INFO 1 --- [ main] e.o.c.service.IdentifierService : ShinyProxy instanceID (hash of config): 40f2fd96c7cbe59e31639f56ed30837ee79c2bbf
2025-06-03 18:41:13.450 INFO 1 --- [ main] o.s.boot.web.servlet.RegistrationBean : Filter orderedFormContentFilter was not registered (disabled)
2025-06-03 18:41:13.586 INFO 1 --- [ main] e.o.containerproxy.service.LogService : Container logging enabled. Log files will be saved to /opt/shinyproxy/container-logs
2025-06-03 18:41:13.894 INFO 1 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@2d6aca33, org.springframework.security.web.session.ForceEagerSessionCreationFilter@21ab988f, org.springframework.security.web.session.ForceEagerSessionCreationFilter@22fba58c, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@29314cc9, org.springframework.security.web.context.SecurityContextPersistenceFilter@7e8a46b7, org.springframework.security.web.header.HeaderWriterFilter@21f9277b, org.springframework.security.web.csrf.CsrfFilter@47b2e9e1, org.springframework.security.web.authentication.logout.LogoutFilter@1440c311, eu.openanalytics.containerproxy.util.AppRecoveryFilter@3e681bc, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1917d90f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@21fff664, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4e38d975, org.springframework.security.web.session.SessionManagementFilter@54da32dc, org.springframework.security.web.access.ExceptionTranslationFilter@bdecc21, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@62ddd21b]
2025-06-03 18:41:13.922 WARN 1 --- [ main] org.thymeleaf.templatemode.TemplateMode : [THYMELEAF][main] Template Mode 'HTML5' is deprecated. Using Template Mode 'HTML' instead.
2025-06-03 18:41:14.387 INFO 1 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2025-06-03 18:41:16.147 INFO 1 --- [ main] o.s.l.c.support.AbstractContextSource : Property 'userDn' not set - anonymous context will be used for read-write operations
2025-06-03 18:41:16.525 INFO 1 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2025-06-03 18:41:16.525 INFO 1 --- [ main] o.s.i.channel.PublishSubscribeChannel : Channel 'ContainerProxy.errorChannel' has 1 subscriber(s).
2025-06-03 18:41:16.526 INFO 1 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started bean '_org.springframework.integration.errorLogger'
2025-06-03 18:41:16.540 INFO 1 --- [ main] io.undertow : starting server: Undertow - 2.2.21.Final
2025-06-03 18:41:16.562 INFO 1 --- [ main] org.xnio : XNIO version 3.8.8.Final
2025-06-03 18:41:16.585 INFO 1 --- [ main] org.xnio.nio : XNIO NIO Implementation Version 3.8.8.Final
2025-06-03 18:41:16.694 INFO 1 --- [ main] org.jboss.threads : JBoss Threads version 3.1.0.Final
2025-06-03 18:41:16.770 INFO 1 --- [ main] o.s.b.w.e.undertow.UndertowWebServer : Undertow started on port(s) 8080 (http) with context path '/cobrinik'
2025-06-03 18:41:16.883 INFO 1 --- [ main] io.undertow.servlet : Initializing Spring embedded WebApplicationContext
2025-06-03 18:41:16.884 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 106 ms
2025-06-03 18:41:16.901 INFO 1 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
2025-06-03 18:41:17.489 INFO 1 --- [ main] io.undertow : starting server: Undertow - 2.2.21.Final
2025-06-03 18:41:17.512 INFO 1 --- [ main] o.s.b.w.e.undertow.UndertowWebServer : Undertow started on port(s) 9090 (http)
2025-06-03 18:41:17.547 INFO 1 --- [ main] e.o.c.util.StartupEventListener : Started ShinyProxy 3.0.2 (ContainerProxy 1.0.2)
2025-06-03 18:41:17.547 INFO 1 --- [ main] e.o.c.service.AppRecoveryService : Recovery of running apps disabled
2025-06-03 18:41:33.042 INFO 1 --- [ XNIO-1 task-1] io.undertow.servlet : Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-06-03 18:41:33.043 INFO 1 --- [ XNIO-1 task-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2025-06-03 18:41:33.044 INFO 1 --- [ XNIO-1 task-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2025-06-03 18:41:33.063 INFO 1 --- [ XNIO-1 task-1] e.o.containerproxy.service.UserService : Anonymous user logged in [user: de586bc01099d7f2c58447b656fe66854d2c3e3a8fede214ebfb4e3a68d5ea69]
2025-06-03 18:41:34.482 INFO 1 --- [pool-1-thread-1] e.o.containerproxy.service.ProxyService : [user=de586bc01099d7f2c58447b656fe66854d2c3e3a8fede214ebfb4e3a68d5ea69 proxyId=62627797-0d20-4671-80d6-8c84c55c6e7a specId=seuratApp] Starting proxy
2025-06-03 18:41:35.476 WARN 1 --- [pool-1-thread-1] e.o.containerproxy.service.ProxyService : [user=de586bc01099d7f2c58447b656fe66854d2c3e3a8fede214ebfb4e3a68d5ea69 proxyId=62627797-0d20-4671-80d6-8c84c55c6e7a specId=seuratApp] Proxy failed to start
eu.openanalytics.containerproxy.ProxyFailedToStartException: Container with index 0 failed to start
at eu.openanalytics.containerproxy.backend.AbstractContainerBackend.startProxy(AbstractContainerBackend.java:116) ~[containerproxy-1.0.2.jar!/:1.0.2]
at eu.openanalytics.containerproxy.service.ProxyService.startOrResumeProxy(ProxyService.java:455) ~[containerproxy-1.0.2.jar!/:1.0.2]
at eu.openanalytics.containerproxy.service.ProxyService.lambda$startProxy$4(ProxyService.java:279) ~[containerproxy-1.0.2.jar!/:1.0.2]
at eu.openanalytics.containerproxy.service.ProxyService.lambda$action$11(ProxyService.java:599) ~[containerproxy-1.0.2.jar!/:1.0.2]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Caused by: eu.openanalytics.containerproxy.ContainerFailedToStartException: Docker container failed to start
at eu.openanalytics.containerproxy.backend.docker.DockerEngineBackend.startContainer(DockerEngineBackend.java:153) ~[containerproxy-1.0.2.jar!/:1.0.2]
at eu.openanalytics.containerproxy.backend.AbstractContainerBackend.startProxy(AbstractContainerBackend.java:108) ~[containerproxy-1.0.2.jar!/:1.0.2]
... 8 common frames omitted
Caused by: com.spotify.docker.client.exceptions.DockerRequestException: Request error: GET unix://localhost:80/images/whtns/seurattools/json: 200
at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:2840) ~[docker-client-8.16.0.jar!/:8.16.0]
at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:2712) ~[docker-client-8.16.0.jar!/:8.16.0]
at com.spotify.docker.client.DefaultDockerClient.inspectImage(DefaultDockerClient.java:1509) ~[docker-client-8.16.0.jar!/:8.16.0]
at eu.openanalytics.containerproxy.backend.docker.DockerEngineBackend.isImagePresent(DockerEngineBackend.java:243) ~[containerproxy-1.0.2.jar!/:1.0.2]
at eu.openanalytics.containerproxy.backend.docker.DockerEngineBackend.startContainer(DockerEngineBackend.java:81) ~[containerproxy-1.0.2.jar!/:1.0.2]
... 9 common frames omitted
Caused by: javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of `com.spotify.docker.client.messages.ImageInfo`, problem: Null container
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 8312]
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:884) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:98) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.JerseyInvocation$5.completed(JerseyInvocation.java:851) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.ClientRuntime.processResponse(ClientRuntime.java:197) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.ClientRuntime.access$300(ClientRuntime.java:74) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.ClientRuntime$2$1$1.run(ClientRuntime.java:167) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:267) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:303) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.ClientRuntime$2$1.response(ClientRuntime.java:165) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.apache.connector.ApacheConnector$1.run(ApacheConnector.java:498) ~[jersey-apache-connector-2.26-b03.jar!/:na]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at jersey.repackaged.com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:299) ~[jersey-guava-2.26-b03.jar!/:na]
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123) ~[na:na]
at jersey.repackaged.com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:50) ~[jersey-guava-2.26-b03.jar!/:na]
at jersey.repackaged.com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:37) ~[jersey-guava-2.26-b03.jar!/:na]
at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:494) ~[jersey-apache-connector-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.ClientRuntime$2.run(ClientRuntime.java:181) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.internal.Errors.process(Errors.java:267) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:303) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.ClientRuntime$3.run(ClientRuntime.java:209) ~[jersey-client-2.26-b03.jar!/:na]
... 5 common frames omitted
Caused by: com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of `com.spotify.docker.client.messages.ImageInfo`, problem: Null container
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 8312]
at com.fasterxml.jackson.databind.exc.ValueInstantiationException.from(ValueInstantiationException.java:47) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:2047) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.wrapAsJsonMappingException(StdValueInstantiator.java:587) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.rewrapCtorProblem(StdValueInstantiator.java:610) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:293) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.ValueInstantiator.createFromObjectWith(ValueInstantiator.java:288) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:202) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:519) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1405) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:2025) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1175) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:803) ~[jackson-jaxrs-base-2.13.4.jar!/:2.13.4]
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1082) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808) ~[jersey-common-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:326) ~[jersey-client-2.26-b03.jar!/:na]
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:881) ~[jersey-client-2.26-b03.jar!/:na]
... 33 common frames omitted
Caused by: java.lang.NullPointerException: Null container
at com.spotify.docker.client.messages.AutoValue_ImageInfo.<init>(AutoValue_ImageInfo.java:59) ~[docker-client-8.16.0.jar!/:8.16.0]
at com.spotify.docker.client.messages.ImageInfo.create(ImageInfo.java:97) ~[docker-client-8.16.0.jar!/:8.16.0]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at com.fasterxml.jackson.databind.introspect.AnnotatedMethod.call(AnnotatedMethod.java:104) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:291) ~[jackson-databind-2.13.4.2.jar!/:2.13.4.2]
... 51 common frames omitted