I have a simple Spring Boot project and a docker-compose.yaml file, in which among other things a container for a Postgres database is configured. I use Spring Boot Docker Compose to automatically start the database when starting the application. I noticed that if the Docker command returns an error and the application fails to start, no corresponding exit code (!= 0) is returned to the shell.
Spring Boot version: 3.1.9
Example 1
I start the application with mvn spring-boot:run.
The error message Application run failed ... Docker is not running appears.
However, Maven unexpectedly returns a BUILD SUCCESS with exit code 0.
Log output
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.1.9)
2024-03-22 12:41:15.352 INFO no-application-context 5120 --- [ restartedMain] a.b.c.d.e.f.g.sample.demo.Application : Starting Application using Java 17.0.6 with PID 93713 (/path/to/my/application/target/classes started by user123 in /path/to/my/application)
2024-03-22 12:41:15.352 DEBUG no-application-context 5121 --- [ restartedMain] a.b.c.d.e.f.g.sample.demo.Application : Running with Spring Boot v3.1.9, Spring v6.0.17
2024-03-22 12:41:15.353 INFO no-application-context 5122 --- [ restartedMain] a.b.c.d.e.f.g.sample.demo.Application : The following 1 profile is active: "local"
2024-03-22 12:41:15.374 INFO no-application-context 5124 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2024-03-22 12:41:15.374 INFO no-application-context 5125 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2024-03-22 12:41:15.389 INFO no-application-context 5126 --- [ restartedMain] .s.b.d.c.l.DockerComposeLifecycleManager : Using Docker Compose file '/path/to/my/application/docker-compose.yaml'
2024-03-22 12:41:16.292 ERROR no-application-context 5127 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed
org.springframework.boot.docker.compose.core.DockerNotRunningException: Docker is not running
at org.springframework.boot.docker.compose.core.DockerCli$DockerCommands.getDockerCommand(DockerCli.java:146)
at org.springframework.boot.docker.compose.core.DockerCli$DockerCommands.<init>(DockerCli.java:129)
at org.springframework.boot.docker.compose.core.DockerCli.lambda$new$0(DockerCli.java:65)
at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1220)
at org.springframework.boot.docker.compose.core.DockerCli.<init>(DockerCli.java:64)
at org.springframework.boot.docker.compose.core.DockerCompose.get(DockerCompose.java:92)
at org.springframework.boot.docker.compose.lifecycle.DockerComposeLifecycleManager.getDockerCompose(DockerComposeLifecycleManager.java:154)
at org.springframework.boot.docker.compose.lifecycle.DockerComposeLifecycleManager.start(DockerComposeLifecycleManager.java:110)
at org.springframework.boot.docker.compose.lifecycle.DockerComposeListener.onApplicationEvent(DockerComposeListener.java:53)
at org.springframework.boot.docker.compose.lifecycle.DockerComposeListener.onApplicationEvent(DockerComposeListener.java:35)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:174)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
at org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:136)
at org.springframework.boot.context.event.EventPublishingRunListener.contextLoaded(EventPublishingRunListener.java:98)
at org.springframework.boot.SpringApplicationRunListeners.lambda$contextLoaded$4(SpringApplicationRunListeners.java:72)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112)
at org.springframework.boot.SpringApplicationRunListeners.contextLoaded(SpringApplicationRunListeners.java:72)
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:420)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1317)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
at com.audi.awsi.service.onepaymentprofile.Application.main(Application.java:14)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.boot.docker.compose.core.ProcessExitException: 'docker version --format {{.Client.Version}}' failed with exit code 1.
Stdout:
23.0.1
Stderr:
Cannot connect to the Docker daemon at unix:///Users/user123/.colima/default/docker.sock. Is the docker daemon running?
at org.springframework.boot.docker.compose.core.ProcessRunner.run(ProcessRunner.java:96)
at org.springframework.boot.docker.compose.core.ProcessRunner.run(ProcessRunner.java:74)
at org.springframework.boot.docker.compose.core.DockerCli$DockerCommands.getDockerCommand(DockerCli.java:135)
... 30 common frames omitted
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.775 s
[INFO] Finished at: 2024-03-22T12:41:16+01:00
[INFO] ------------------------------------------------------------------------
Example 2
I test the application with mvn verify -Dspring.docker.compose.skip.intests.false.
The error message Application run failed ... Docker is not running appears several times.
However, Maven unexpectedly returns a BUILD SUCCESS with exit code 0 and Tests run: 0, Failures: 0, Errors: 0, Skipped: 0.
The CI/CD pipeline incorrectly reports that all tests have been successful. However, my expectation is that an exit code != 0 is returned to the shell and the test error is correctly reported in CI/CD.
How to Reproduce
- Set up a Spring Boot project including Spring Boot Docker Compose
- Create a
docker-compose.yamlfile with a sample container - Provoke a Docker error (e.g. shutdown docker daemon)
- Execute the command
mvn spring-boot:run
Comment From: wilkinsona
You haven't mentioned it, by I can tell from the log output that, in example 1, you're using spring-boot-devtools. The problem that you're seeing is a duplicate of #28541.
I cannot reproduce the behavior you have described in example 2, either with or without spring-boot-devtools on the classpath. If you would like us to spend some more time investigating, please spend some time providing a complete yet minimal sample that reproduces the problem. You can share it with us by pushing it to a separate repository on GitHub or by zipping it up and attaching it to this issue.
Comment From: bnhmn
You haven't mentioned it, by I can tell from the log output that, in example 1, you're using
spring-boot-devtools. The problem that you're seeing is a duplicate of #28541.
You're right. Removing spring-boot-devtools fixes issue in example 1.
Regarding example 2:
After lots of debugging it seems that it was not related to Spring but an issue with the Maven Surefire plugin version 3.0.0-M4.
I have upgraded to latest version 3.2.5 and now the Docker Compose error is correctly reflected in the exit code.
Issue is resolved.