Reputation: 2694
I have a development setup where I need multiple containers running different services, and I'm trying to use Fig to achieve this. Everything else works fine, but one of these services is a Play Framework app, and it does not want to stay running unless it gets a pseudo-TTY. This would be fine and good, but since I want to coordinate these multiple containers, I want to fig up
, and that command does not seem to allocate pseudo-TTY's, so the process dies immediately after startup, and all the containers along with it.
I've created a repository with a showcase of this problem that anybody can just clone and run, the instructions are in the README. If anybody can shed any light on how to create e.g. a middleman script that would keep the app running, or really any other solution where I could fig up
my linked container setup, that'd be brilliant.
Alternatively, if anybody is using any other methods of coordinating multiple containers like this, like maybe a nice shell script runner that manages things, I welcome your insight.
edit: I changed the accepted answer because the new one actually solves the problem. The workaround answer still has valuable info, though.
Upvotes: 9
Views: 3283
Reputation: 9381
Fig has been replaced by Docker Compose, and in your docker-compose.yml
file you can now add the stdin_open: true
setting, which should fix this issue:
web:
image: brikis98/ping-play
ports:
- "9000:9000"
stdin_open: true
In the example above, the brikis98/ping-play
image is a Play app that executes activator run
by default. If I run docker-compose up
on the YAML file above, the Play app boots up and keeps running instead of exiting immediately.
Upvotes: 11
Reputation: 3972
A Play! run command orchestrated via Fig currently will always exit once launched. It is the same behaviour if you resumed the Fig created container (docker start -i). Basically this mirrors what happens when you launch the Play/SBT/Activator REPL via a run command as a Docker background daemon it will also exit (docker run -d).
The workaround as Ilkka already commented is to package the Play application to able to run on its own. Either via the stage and/or start commands https://playframework.com/documentation/2.3.x/Production or as distribution via https://playframework.com/documentation/2.3.x/ProductionDist.
For example if Docker image includes application source then you can add the stage command to it
ADD myapplication /var/local/application
WORKDIR /var/local/application
RUN /usr/local/bin/activator stage
And in the fig.yml your command can be
command: target/universal/stage/bin/myapplication
You can see an example Dockerfile and yml file with this Docker Compose (Fig's successor) project
Upvotes: 6
Reputation: 18679
fig run is supposed to use the TTY terminal. so you could try
fig run test ./activator start
Upvotes: 0