Docker container will automatically stop after “docker run -d”

Multi tool use
Multi tool use


Docker container will automatically stop after “docker run -d”



According to tutorial I read so far, use "docker run -d" will start a container from image, and the container will run in background. This is how it looks like, we can see we already have container id.


docker run -d


root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d



But if I ran "docker ps", nothing was returned.


docker ps



So I tried "docker ps -a", I can see container already exited:


docker ps -a


root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz



Anything I did wrong? How can I troubleshoot this issue?





"docker run hello-world" <== works perfectly, but if I run "docker run -d hello-world", I still cannot get a running container.
– J John
May 13 '15 at 8:50





I had a similar issue but I got it working by using docker run -it -d <image> /bin/bash this starts a bash shell interactively and doesn't close the container because the shell process is active.
– Rtsne42
Jun 20 '17 at 17:16


docker run -it -d <image> /bin/bash




9 Answers
9



The centos dockerfile has a default command bash.


bash



That means, when run in background (-d), the shell exits immediately.


-d



Update 2017



More recent versions of docker authorize to run a container both in detached mode and in foreground mode (-t, -i or -it)


-t


-i


-it



In that case, you don't need any additional command and this is enough:


docker run -t -d centos



The bash will wait in the background.
That was initially reported in kalyani-chaudhari's answer and detailed in jersey bean's answer.


vonc@voncvb:~$ d ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a50fd9e9189 centos "/bin/bash" 8 seconds ago Up 2 seconds wonderful_wright



Original answer (2015)



As mentioned in this article:



Instead of running with docker run -i -t image your-command, using -d is recommended because you can run your container with just one command and you don’t need to detach terminal of container by hitting Ctrl + P + Q.


docker run -i -t image your-command


-d



However, there is a problem with -d option. Your container immediately stops unless the commands are not running on foreground.
Docker requires your command to keep running in the foreground. Otherwise, it thinks that your applications stops and shutdown the container.


-d



The problem is that some application does not run in the foreground. How can we make it easier?



In this situation, you can add tail -f /dev/null to your command.
By doing this, even if your main command runs in the background, your container doesn’t stop because tail is keep running in the foreground.


tail -f /dev/null



So this would work:


docker run -d centos tail -f /dev/null



A docker ps would show the centos container still running.


docker ps



From there, you can attach to it or detach from it (or docker exec some commands).


docker exec





Sorry, one more question, I have a script need to run at startup, looks like /etc/rc.d/rc.local no longer works(my mindset still treating docker like OS), I assume docker file is better option in this case?
– J John
May 13 '15 at 10:03





This works but isn't it a little hacky?
– Balázs Mária Németh
Nov 11 '15 at 12:11





@GuruprasadGV That is expected. Instead of using docker attach, use docker exec -it <yourContainer> bash.
– VonC
Mar 5 '16 at 7:01


docker exec -it <yourContainer> bash





This also works if you add the tail command at the end of an entrypoint file.
– yara
Jan 20 '17 at 18:12





I used sshd as my last (long running) command. You can then ssh on too your container as you would on a VM (once you set .ssh/authorized_keys etc)... You can also go on to configure the container using ansible.
– andrew pate
Mar 15 '17 at 15:07



According to this answer, adding the -t flag will prevent the container from exiting when running in the background. You can then use docker exec -i -t <image> /bin/bash to get into a shell prompt.


-t


docker exec -i -t <image> /bin/bash


docker run -t -d <image> <command>



It seems that the -t option isn't documented very well, though the help says that it "allocates a pseudo-TTY."





More documentation on tty: stackoverflow.com/a/35551071/6309
– VonC
Jul 22 '16 at 12:06





Nice. Seems less hacky than appending tail -f /dev/null
– Scarysize
Jan 5 '17 at 15:38


tail -f /dev/null





Thanks! On the slim chance this helps someone, this doesn't behave nicely in Emacs Eshell.
– Peter Becich
Feb 1 '17 at 22:35





docker run -t -d --name mysql -p 3306:3306 mysql - doesn't work for me (ubuntu 14.04.5): STATUS=Exited (1) 4 seconds ago
– Putnik
Jun 1 '17 at 20:06


docker run -t -d --name mysql -p 3306:3306 mysql





I found that you don't need <command> here, unless you want. Strangely, it also works to replace -t with -i (interactive). The doc does mention using -t and -i combined will behave like a shell.
– jersey bean
Sep 27 '17 at 8:11



Hi this issue is because docker containers exit if there is no running application in the container.


-d



option is just to run a container in deamon mode.



So the trick to make your container continuously running is point to a shell file in docker which will keep your application running.You can try with a start.sh file


Eg: docker run -d centos sh /yourlocation/start.sh



This start.sh should point to a never ending application.



In case if you dont want any application to be running,you can install monit which will keep your docker container running.
Please let us know if these two cases worked for you to keep your container running.


monit



All the best



A Docker container runs a process (the "command" or "entrypoint") that keeps it alive. The container will continue to run as long as the command continues to run.



In your case, the command (/bin/bash, by default, on centos:latest) is exiting immediately (as bash does when it's not connected to a terminal and has nothing to run).


/bin/bash


centos:latest



Normally, when you run a container in daemon mode (with -d), the container is running some sort of daemon process (like httpd). In this case, as long as the httpd daemon is running, the container will remain alive.


-d


httpd



What you appear to be trying to do is to keep the container alive without a daemon process running inside the container. This is somewhat strange (because the container isn't doing anything useful until you interact with it, perhaps with docker exec), but there are certain cases where it might make sense to do something like this.


docker exec



(Did you mean to get to a bash prompt inside the container? That's easy! docker run -it centos:latest)


docker run -it centos:latest



A simple way to keep a container alive in daemon mode indefinitely is to run sleep infinity as the container's command. This does not rely doing strange things like keeping STDIN open in daemon mode.


sleep infinity


$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d651c7a9e0ad centos:latest "sleep infinity" 2 seconds ago Up 2 seconds nervous_visvesvaraya



You can accomplish what you want with either:


docker run -t -d <image-name>



or


docker run -i -d <image-name>



or


docker run -it -d <image-name>



The command parameter as suggested by other answers (i.e. tail -f /dev/null) is completely optional, and is NOT required to get your container to stay running in the background.



Also note the Docker documentation suggests that combining -i and -t options will cause it to behave like a shell.



See:



https://docs.docker.com/engine/reference/run/#foreground



execute command as follows :


docker run -t -d <image-name>



if you want to specify port then command as below:


docker run -t -d -p <port-no> <image-name>



verify the running container using following command:


docker ps





I actually like this answer the best, because the most popular answer suggests that you need a command (i.e. tail -f /dev/null). The command is completely optional. The key here is to use -t. I also found -i work in place of -t, or you can also use both -it combined (as the documentation suggests it will run as a shell).
– jersey bean
Sep 27 '17 at 8:13





Is there any advantage of using -t -d vs -i -d? Both will keep the container running.
– wisbucky
Dec 22 '17 at 0:15


-t -d


-i -d



Docker requires your command to keep running in the foreground. Otherwise, it thinks that your applications stops and shutdown the container.



So if your docker entry script is a background process like following:


/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &



The '&' makes the container stop and exit if there are no other foreground process triggered later.
So the solution is just remove the '&' or have another foreground CMD running after it, such as


tail -f server.log



Maybe it is just me but on CentOS 7.3.1611 and Docker 1.12.6 but I ended up having to use a combination of the answers posted by @VonC & @Christopher Simon to get this working reliably. Nothing I did before this would stop the container from exiting after it ran CMD successfully. I am starting oracle-xe-11Gr2 and sshd.



Dockerfile


...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null



Then adding -d -t and -i to run


docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611



Finally after hours of bashing my head against the wall


ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password:
debug1: Authentication succeeded (password).



For whatever reason the above will exit after executing CMD if the tail -f is removed, or any of the -t -d -i options are omitted.



I have explained it in the following post that has the same question.



How to retain docker alpine container after "exit" is used?






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Pt Je3rjuALBg2ua0Err4eTcqcDOSYY4E v2ijE3,CguSz2QryxVU 8TotOqYzNabFfDL8I0KYK2
9Mnb7R,Uth

Popular posts from this blog

Rothschild family

Boo (programming language)