Dockerfile CMD instruction will exit the container just after running it

Anand Suthar picture Anand Suthar · Feb 14, 2017 · Viewed 92.6k times · Source

I want to setup some configuration when my container starts, for this I am using shell scripts. But my container will exits as soon as my scripts ends, I have tried with -d flag / detached mode but It will never run in detached mode.

Below is my Dockerfile

FROM ubuntu:14.04

ADD shell.sh /usr/local/bin/shell.sh

RUN chmod 777 /usr/local/bin/shell.sh

CMD /usr/local/bin/shell.sh

Below is my shell script

#!/bin/bash
echo Hello-docker
  1. Run without any flag

    docker run hello-docker
    

    This will print 'Hello-docker' on my console and exits

  2. Run with -itd flags

    docker run -itd hello-docker
    

    and as below my console output, This time also will exits soon. :( enter image description here

    • The difference I saw is in COMMAND section when I run other images command section will shows "/bin/bash" and will continue in detached mode.

    • And when I run my image in container with shell script COMMAND section will show "/bin/sh -c /usr/loca", and Exit.

    • I want to run container till I not stop it manually.

EDIT:

After adding ENTRYPOINT instruction in Dockerfile, this will not execute my shell script :(

FROM ubuntu:14.04

ADD shell.sh /usr/local/bin/shell.sh

RUN chmod 777 /usr/local/bin/shell.sh

CMD /usr/local/bin/shell.sh

ENTRYPOINT /bin/bash

As per docker documentation here

CMD will be overridden when running the container with alternative arguments, so If I run docker image with some arguments as below, will not execute CMD instructions. :(

sudo docker run -it --entrypoint=/bin/bash <imagename>

Answer

NZD picture NZD · Feb 14, 2017

A docker container will run as long as the CMD from your Dockerfile takes.

In your case your CMD consists of a shell script containing a single echo. So the container will exit after completing the echo.

You can override CMD, for example:

sudo docker run -it --entrypoint=/bin/bash <imagename>

This will start an interactive shell in your container instead of executing your CMD. Your container will exit as soon as you exit that shell.

If you want your container to remain active, you have to ensure that your CMD keeps running. For instance, by adding the line while true; do sleep 1; done to your shell.sh file, your container will print your hello message and then do nothing any more until you stop it (using docker stop in another terminal).

You can open a shell in the running container using docker exec -it <containername> bash. If you then execute command ps ax, it will show you that your shell.sh is still running inside the container.