简体   繁体   中英

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

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?

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.

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.)

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"

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM