In my Dockerfile, I run a script:
RUN /bin/sh -c scripts/init.sh
Inside init.sh
, all commands ending with &
are not executed: I cannot run background processes.
Any idea why?
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.
Sign up to join this communityI had the similar issue and something like the following helped me.
RUN nohup bash -c "scripts/init.sh &" && sleep 4
In many cases the server you started isn’t yet fully ready. To allow the server a bit more time to get ready add a sleep command. How large the argument sleep needs to depend on the service you start and you probably need to tweak it.
Read more on this Doc
To run something in the background:
RUN bash -c "sh ./scripts/init.sh & sleep 5 && tail -F /dev/null"
This will run your script and immediately sleeps for 5 seconds, then keeps container running forever. Using this technique, you can run multiple commands in a Docker.
You can remove tail -F /dev/null
or replace with the next command/service which doesn't exit and keeps container running.
My first idea is to create services inside the container instead of running them with nohup
or &
, run them as system service and you don't need to handle them in init.sh.
But this is not a "real" docker approach. If you need more than 1 service to run, separate them to different containers (1 container - 1 service) and put all of them together with a docker-compose solution.
docker exec -d my_command
after the build...