How to restart an existing Docker container in restart=“always” mode?

When you initially run a Docker container from an image you can specify the option:

--restart="always"

This ensures that the container is always restarted by the Docker daemon if for some reason it stops. So you could run a container like so:

  • SocketError: No such file or directory - connect(2) for /var/run/docker.sock
  • Docker php_network_getaddresses error
  • Docker stack deploy rolling updates volume issue
  • Increase Disk Space on Docker Toolbox
  • dockerize does not delay the container initialization
  • Bluemix: service bound to container does not appear in VCAP_SERVICES
  • docker run --restart="always" <IMAGE>
    

    Also you can restart an existing Docker container by specifying its container ID, i.e.:

    docker start <CONTAINER ID>
    

    However I can’t determine if it’s possible to change an existing container, that originally was not run with the --restart="always option, to convert it to always restart in future.

    Currently the only way I can think to do this is to save the container as a new image and then run that image as a new container with the --restart="always" option. Would this in fact be the correct way to do this?

    EDIT: What I perhaps didn’t make clear enough originally is that I am thinking about the situation where there have been changes in the container since it was originally run, which need to be persisted. So just running a new container from the original image would not be sufficient.

  • Symbolic Link Host to Docker Container
  • Docker RUN Command: When To Group Commands, When Not To?
  • Can anyone help me to create Dockerfile for my tomcat copy?
  • Is it possible run syslog inside Docker and expose that to the host as host's syslog daemon?
  • Dockerize stack: MapServer - AngularJs web app - Lumen API - PostgreSQL
  • how process static file when deploying django using docker and aws eb
  • 4 Solutions collect form web for “How to restart an existing Docker container in restart=“always” mode?”

    We now have docker update, which allows changing the restart policy of a running container.

    docker update --restart=always <CONTAINER ID>
    

    There are three other options:

    • no (default)
    • on-failure
    • unless-stopped

    Please refer to the link for details.

    Ok, so to answer my own question, it seems that it’s not possible just to restart the same container with --restart=always, because that’s something you have to do when you run a container for the first time and not a parameter that you can use when you start an existing container.

    There are three possible work-arounds to this:

    1. As @user2915097 stated, you can abandon the original container (stopping it and then deleting it with docker rm <CONTAINER ID>to tidy up). Then just run a new container from the original image specifying the -restart=always option this time.
    2. If no volumes were used, so the changes are internal to the container, you need to commit the container to a new image and then run a new container from that image.

      docker commit <CONTAINER ID> <NEW IMAGE NAME>

      docker run -d --restart=always ... <NEW IMAGE NAME>

    3. If volumes were used and all changes are restricted to the volumes, then you can run a second container with the --volumes-from parameter without having to commit a new version of the image. i.e.

      • docker stop <CONTAINER 1 NAME>
      • docker run -d --restart=always --volumes-from <CONTAINER 1 NAME> ... <ORIGINAL IMAGE NAME>

      It would then be safe to delete Container 1, as the volumes will not be deleted whilst another container continues to use them.

    I guess there is a fourth possibility too; if you used a volume(s) and you know that there have been changes to the container that aren’t on the volume, then you’ll have to use a combination of (2) and (3).

    Update: This worked to enable restart. But setting it back to no and it gets reset back to always and the container starts again! 🙁 I’m going to leave this answer here in case someone figures out how this really works. I must be close!

    Folks, I’ve found the most hacky solution that gets around copying containers etc.

    vi /var/lib/docker/containers/$(docker inspect -f ‘{{ .Id }}’ $ContainerID)/hostconfig.json

    Search for “RestartPolicy”. Set it to “no”, “always” etc

    Maybe someone could wrap that up in a script!?

    Anyway, that piece of json along with the config.json would allow you to modify all sorts of things that you missed when creating your container.

    extract from http://www.brandpending.com/blog/2014/11/21/setting-and-re-setting-the-restart-behaviour-of-a-docker-container

    So let say you want to change the restart policy of this container
    from always to on-failure. To do this, you need to stop the container,
    remove it and re-run it with the new restart policy.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.