Skip to main content

[SOLVED] How to start a stopped Docker container with a different command? - docker

[SOLVED] How to Restart a Stopped Docker Container with a Different Command

In Docker, managing containers well is very important. We sometimes need to restart a stopped Docker container. But we want to use a different command than the one we set before. This guide will show you how to do this in different ways. We want to help you manage your Docker containers better based on your needs.

Solutions We Will Discuss:

  • Solution 1: Use docker start with overrides
  • Solution 2: Use docker run with the --rm option
  • Solution 3: Create a new container from the stopped one
  • Solution 4: Use docker exec to run commands in a stopped container
  • Solution 5: Change the ENTRYPOINT or CMD in the Dockerfile
  • Solution 6: Use a Docker Compose override

For more tips on Docker commands, you can look at our articles on how to fill user input for Docker and Docker container linking. Now let’s look at the solutions that will help us start our stopped Docker containers with the commands we want!

Solution 1 - Use docker start with overrides

We can start a stopped Docker container with a new command using the docker start command. We need to add the --detach flag. But this method does not let us change the command directly. The container will run the command that is in its Dockerfile or the one we gave when we ran docker run.

If we want to start a stopped container with a different command, it is better to create a new container from the stopped one. This lets us change the command.

If we just want to quickly restart the container with its original command, we can use:

docker start <container_name_or_id>

This command starts the container with the command it had before. If we want to see what command the container is set to run, we can inspect it like this:

docker inspect <container_name_or_id> --format='{{.Config.Cmd}}'

If we want to run a different command, we can use docker run or other methods that let us change the command. We can also use docker exec for this. For more details about using environment variables and running commands in Docker, we can check this best practices guide.

Solution 2 - Use docker run with –rm option

We can start a stopped Docker container with a different command by using the docker run command with the --rm option. This method is good when we want to create a new instance from the same image. It makes sure that any changes we make to the container do not stay after it stops.

The --rm option automatically deletes the container when it exits. This stops extra containers from piling up. Here is how we do it:

  1. First, we need to find the image of the stopped container. We can do this by running:

    docker ps -a

    This command shows all containers, both running and stopped, and also their images.

  2. Next, we can use the docker run command to start a new container with the command we want. For example, if we want to run a new instance of the my-app image with a different command, we can do this:

    docker run --rm my-app <new_command>

    We should replace <new_command> with the command we want the container to run.

Example

Let’s say we have an image called my-app, and we want to open a shell in it instead of running the default command. We would run:

docker run --rm -it my-app /bin/bash

In this example:

  • The -it flags let us run the container in interactive mode with a terminal.
  • /bin/bash is the new command that will run when the container starts.

By using this method, we start a new container from the same image as the stopped one. This lets us run different commands without changing the original container. If we want to know more about advanced command overrides, we can check how to pass environment variables when we run our container.

Solution 3 - Create a new container from the stopped one

If we want to run a different command in a stopped Docker container, we can create a new container based on the stopped one. This way, we can specify a new command without changing the original container.

Here is how we can do it:

  1. Identify the Stopped Container: First, we need to find the stopped container we want to use. We can list all containers, even the stopped ones, by using this command:

    docker ps -a

    This command shows all containers and their statuses. We should note the CONTAINER ID or NAME of the stopped container.

  2. Create a New Container: Next, we can create a new container from the stopped one using the docker create command. We need to give the image name and the new command we want to run. The general format is:

    docker create --name <new_container_name> <image_name> <new_command>

    For example, if our stopped container is from the ubuntu image and we want to run the bash command, we can type:

    docker create --name my_new_container ubuntu bash
  3. Start the New Container: After we create the new container, we can start it with this command:

    docker start my_new_container
  4. Verify the New Container: We can check if the new container is running by using:

    docker ps

This way, we can run a different command in a new container that comes from a stopped one. If we need to pass environment variables or mount volumes, we can add those options to the docker create command too.

For example, if we want to set an environment variable, we can do it like this:

docker create --name my_new_container -e MY_ENV=some_value ubuntu bash

By making a new container from the stopped one, we keep the original container’s settings while being flexible with the commands we want to run. This way is great if we need to fix issues or run different scripts without changing the original container setup. For more information on managing Docker containers, we can check the Docker documentation.

Solution 4 - Use docker exec to run commands in a stopped container

We can use the docker exec command to run commands inside a running container. But if the container has stopped, we cannot use docker exec directly. To handle this, we can start the stopped container in a temporary way or use another method to run commands.

Steps to Use docker exec with a Stopped Container

  1. Start the Container in Interactive Mode: We can start the stopped container in interactive mode with a shell command. This lets us execute any command we need.

    docker start -ai <container_name_or_id>
    • The -a flag connects to the container’s output.
    • The -i flag lets us interact with the container.
  2. Running Specific Commands: If we want to run a special command instead of attaching to the shell, we can start the container with a new command. For example, if our container was running a service, we can start it with a new command:

    docker start <container_name_or_id>
    docker exec <container_name_or_id> <your_command>

    Replace <your_command> with the command we want to run, like bash or any other executable in the container.

  3. Using a Temporary Container: If we need to get files or the environment of the stopped container but don’t want to start it, we can create a new container using the stopped container’s image. This way, we can run commands as needed:

    docker run --rm -it --volumes-from <container_name_or_id> <image_name> bash
    • The --rm flag removes the container when it exits.
    • The --volumes-from option lets us access the volumes of the stopped container.
  4. Accessing Logs: If we just want to check the logs of the stopped container, we can use:

    docker logs <container_name_or_id>

    This command shows us the logs created by the container before it stopped. This is helpful for debugging.

Example

Let’s say we have a container named my_app that has stopped. We can start it and run a bash shell like this:

docker start -ai my_app

Or, if we just want to run a command:

docker start my_app
docker exec my_app /bin/bash

Note

If we often need to run commands in stopped containers, we might want to change the original container’s setup, like its CMD or ENTRYPOINT, to allow more freedom in running commands. For more details, we can check out how to create user databases in Docker or look at Docker commands for more options.

Solution 5 - Change the ENTRYPOINT or CMD in Dockerfile

To start a stopped Docker container with a new command, we can change the ENTRYPOINT or CMD in the Dockerfile that builds the image. This helps us set a new command that runs when the container starts.

Changing the Dockerfile

  1. Find your Dockerfile: Open the Dockerfile used for the image of the stopped container.

  2. Change ENTRYPOINT or CMD: Update the ENTRYPOINT or CMD to the new command you want to run.

    • ENTRYPOINT: This is the main command that runs every time the container starts.
    • CMD: This gives default options for the ENTRYPOINT. If we do not set ENTRYPOINT, then CMD runs on its own.

    Here is an example of how to change these commands:

    # Original Dockerfile
    FROM ubuntu:latest
    ENTRYPOINT ["echo", "Hello"]
    CMD ["World"]
    
    # Changed Dockerfile
    FROM ubuntu:latest
    ENTRYPOINT ["echo", "Goodbye"]
    CMD ["Everyone"]
  3. Build the new image: After we change the Dockerfile, we need to create a new image from it. Run this command in the folder with your Dockerfile:

    docker build -t my-new-image .
  4. Start a new container: We can now run a new container using the changed image:

    docker run my-new-image

Important Notes

  • If we want to keep the original container but just change the command, we should make a new image with a different tag.
  • If we need to run a temporary command without changing the Dockerfile, we can use other ways like docker exec or docker start with options.

For more info on Dockerfile commands and best ways to use it, we can check Dockerfile basics. This method gives a simple way to change how our containers behave when they start, which makes it easier to fit different needs.

Solution 6 - Use a Docker Compose override

If we are using Docker Compose and need to start a stopped container with a new command, we can use a Docker Compose override. This helps us change the way our existing services work in the docker-compose.yml file without changing that file. Here is how we can do it:

  1. Create a Docker Compose Override File: First, we can create a file called docker-compose.override.yml. Docker Compose will use this file automatically if it is next to our main docker-compose.yml.

  2. Modify the Command: In the override file, we need to write the service we want to change and set a new command with the command directive.

Example

Let’s say we have this docker-compose.yml for a service called web:

version: "3"
services:
  web:
    image: nginx
    ports:
      - "80:80"

We can make a docker-compose.override.yml to change the command when we start the service:

version: "3"
services:
  web:
    command: ["nginx", "-g", "daemon off;"]
  1. Starting the Service: After we create the override file, we can start the service with this command:
docker-compose up

This will start the web service with the command we wrote in the override file. If the container was stopped before, Docker Compose will make it again with the new command.

Additional Notes

  • Multiple Overrides: If we need, we can also use more than one override file. Just name them like this: docker-compose.override.yml, docker-compose.override-1.yml, and so on. We can specify them in the command line when we run Docker Compose.

  • Environment Variables: We can use environment variables in our override file for changing settings. Check out this guide for more info on using environment variables.

This way is very helpful in development when we often need to change commands or settings for different situations without changing the main files. We can learn more about managing Docker Compose and its settings in this article.

Conclusion

In this article, we looked at different ways to start a stopped Docker container with a new command. We talked about using docker start with overrides. We also discussed how to make a new container from the one that stopped. These ways help us manage our Docker containers better.

If you want to learn more about Docker, we suggest checking out guides on how to mount host volumes into containers and how to manage Docker networks. They can be really helpful.

Comments