gradle-docker-compose-plugin
gradle-docker-compose-plugin copied to clipboard
JavaExec does not exit properly when interrupted with container logging enabled and no output from a container
Long running JavaExec processes are left running when used with docker compose if the following happens:
- The process is long running
- The docker-compose stanza in gradle attempts to log the container output using one of
- captureContainersOutput
- captureContainersOutputToFile
- The container doesn't actually produce any output
- Ran into this with the memcached container specifically
The following demonstrates the issue:
- Execute
./gradlew run
to start- Web server that is long running
- Has capture output statements in the docker-compose stanza
- Uses memcached in the associated docker-compose file
- Inspect the process list
- See that the process is running
- Interrupt gradle with ctrl-c
- Inspect the process list again
- Notice that the process is still running
- The process doesn't exit
Not sure how much of this is relevant but adding it in case it's useful:
- O/S is Ubuntu 18.04
- OpenJDK 11 from the O/S
- Happens on the command line and when invoked with IntelliJ
- Interestingly, doesn't seem to be an issue when gradle/the application is run in debug mode
I'm happy to provide more detail or information as required.
Hello, unfortunately, there is no way (no API available) how to handle this situation with long-running processes correctly. You could execute Gradle with --no-daemon
so the JVM should be turned off right after your build - then it should work as expected. This is actually the same as running in debug mode.
I just want to make sure my comment was clear. It's specifically an issue when the container does not produce any output and captureContainerOutput* is used in the docker-compose stanza. It works fine otherwise.
For example, if I switch from the memcached container to the mysql one (which does produce output), I can interrupt gradle and it will correctly shut down the main process.
Not sure if this is helpful but here's a small demo project with a readme that goes through the steps. demo.tar.gz