Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker run a shell script in the background without exiting the container

Tags:

linux

docker

I am trying to run a shell script in my docker container. The problem is that the shell script spawns another process and it should continue to run unless another shutdown script is used to terminate the processes that are spawned by the startup script.

When I run the below command,

docker run image:tag /bin/sh /root/my_script.sh

and then,

docker ps -a

I see that the command has exited. But this is not what I want. My question is how to let the command run in background without exiting?

like image 853
NEO Avatar asked Jul 22 '15 17:07

NEO


4 Answers

Run you container with your script in background with below command

docker run -i -t -d  image:tag /bin/sh /root/my_script.sh

Check the container id by docker ps command

Then verify your script is executing or not on container

docker exec <id> /bin/sh -l -c "ps aux"
like image 54
Mahattam Avatar answered Nov 09 '22 06:11

Mahattam


The process that docker runs takes the place of init in the UNIX process tree. init is the topmost parent process, and once it exits the docker container stops. Any child process (now an orphan process) will be stopped as well.

$ docker pull busybox >/dev/null
$ time docker run --rm busybox sleep 3

real    0m3.852s
user    0m0.179s
sys 0m0.012s

So you can't allow the parent pid to exit, but you have two options. You can leave the parent process in place and allow it to manage its children (for example, by telling it to wait until all child processes have exited)

$ time docker run --rm busybox sh -c 'sleep 3 & wait'

real    0m3.916s
user    0m0.178s
sys 0m0.013s

…or you can replace the parent process with the child process using exec. This means that the new command is being executed in the parent process's space…

$ time docker run --rm busybox sh -c 'exec sleep 3'

real    0m3.886s
user    0m0.173s
sys 0m0.010s

This latter approach may be complex depending on the nature of the child process, but having fewer unnecessary processes running is more idiomatically Docker. (Which is not saying you should only ever have one process.)

like image 33
kojiro Avatar answered Nov 09 '22 07:11

kojiro


You haven't explained why you want to see your container running after your script has exited, or whether or not you expect your script to exit.

A docker container exits as soon as the container's CMD exits. If you want your container to continue running, you will need a process that will keep running. One option is simply to put a while loop at the end of your script:

while :; do
  sleep 300
done

Your script will never exit so your container will keep running. If your container hosts a network service (a web server, a database server, etc), then this is typically the process the runs for the life of the container.

If instead your script is exiting unexpectedly, you will probably need to take a look at your container logs (docker logs <container>) and possibly add some debugging to your script.

If you are simply asking, "how do I run a container in the background?", then Emil's answer (pass the -d flag to docker run) will help you out.

like image 6
larsks Avatar answered Nov 09 '22 06:11

larsks


Wrap the program with a docker-entrypoint.sh bash script that blocks the container process and is able to catch ctrl-c. This bash example should help: https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash

The script should shutdown the process cleanly when the exit signal is sent by Docker.

You can also add a loop inside the script that repeatedly checks the running process.

like image 1
blacklabelops Avatar answered Nov 09 '22 07:11

blacklabelops