Authors – All

If you have a few years of experience in the DevOps ecosystem, and you're interested in sharing that experience with the community, have a look at our Contribution Guidelines.

1. Overview

In this tutorial, we’ll explore different ways to keep Docker containers running indefinitely.

By default, containers run only as long as their default command executes, but it’s common to run them indefinitely for debugging and troubleshooting purposes.

2. Basics of Docker Run

Let’s look at some of the basics of the docker run command, and ways to pass commands to a container when it’s started.

2.1. Specifying the Command to Run

While creating a Dockerfile, there are two ways to specify which command to run:

  • The ENTRYPOINT directive specifies a command for the container. This is helpful for commands we always want to run unless the user explicitly overrides them.
  • We can also specify commands using the CMD directive. This is used to define the default command or arguments to be passed to the container. Any arguments that the user includes after the image name replace the entire CMD directive.

2.2. Overriding the Default Commands

To override a CMD directive, we can simply add another command after docker run [image_name]:

docker run ubuntu echo "Hello World"

To override the ENTRYPOINT directive, we need to add the –entrypoint flag and the desired command before the image name, and any arguments after the image name:

docker run --entrypoint echo ubuntu "Hello World"

Both the examples will run the command echo “Hello World”  when the container starts.

2.3. Docker Run With a Command

The default behavior of the docker run command can be summarized by the following:

  • The container runs in the foreground unless explicitly detached using the -d flag.
  • The container runs as long as the specified command keeps running and then stops.

Let’s look at an example of this:

docker run ubuntu bash

The above command will run the bash command in the ubuntu image. The bash command will start a shell in the container.

The command runs, but the container stops after the command finishes, which is almost immediately. We can test this using the docker ps command:

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c8f8f8f8f8f8        ubuntu              bash                2 minutes ago      Exited (0)          22/tcp               mystifying_snyder

3. Running Docker Containers Indefinitely

By default, a container may or may not be designed to run indefinitely. For example, a container containing a web server runs as long as the web server is running. However, a container containing a one-time job, such as a cron job, runs only for a short period of time.

Let’s look at some ways to run containers indefinitely.

3.1. Never Ending Commands

The simplest way to keep the container running is to pass a command that never ends. 

We can use the tail -f  command to read the /dev/null file. The command keeps looking for new changes in the file to display, so it never ends as long as the file exists:

docker run ubuntu tail -f /dev/null

We can use the below command to run an infinite loop that does nothing:

docker run ubuntu while true; do sleep 1; done

The below command keeps the container idle and does nothing:

docker run ubuntu sleep infinity

We can use never-ending commands in any of the following ways:

  • ENTRYPOINT or CMD directive in the Dockerfile
  • Overriding ENTRYPOINT or CMD in the docker run command

It doesn’t make sense to run a never-ending command in the foreground and get a stuck terminal. In this case, we can use the -d flag to run the container in the background.

3.2. Starting a Pseudo-TTY

Never-ending commands were a hack a long time ago when no other options existed. However, in the latest versions of Docker, it’s possible to keep containers running by starting a terminal session with them both in the foreground and the background.

Pseudo-TTYs are used to run commands inside a container. To start a pseudo-TTY session with the container, we can use the -t flag. The container won’t exit until the session ends.

If we want to interact with the container, we can couple this with the -i flag. This will allow us to run commands in the container using our terminal:

docker run -it ubuntu bash

Alternatively, if our purpose is just to run the container indefinitely, we can use the -d flag:

docker run -d -t ubuntu

4. Conclusion

In this article, we learned some ways to run Docker containers indefinitely. We discussed the ways commands are passed to a container, and then altered these commands to solve our problem. We also touched on the modern solution of using Pseudo-TTY sessions to keep containers running.

Authors – All

If you have a few years of experience in the DevOps ecosystem, and you're interested in sharing that experience with the community, have a look at our Contribution Guidelines.

Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.