cooldude101
cooldude101

Reputation: 1405

How to debug docker restart not restarting in node.js app?

I have a container with a docker-compose like this

services:
  app:
    build:
      context: app
    restart: always
version: '3.5'

It launches a node app docker-compose run -d --name my-app app node myapp.js

the app is made to either run to completion or throw, and then the goal would be to have docker restart it in an infinite loop, regardless of the exit code. I'm unsure why but it doesn't restart it.

How can I debug this? I have no clue what exit code node is sending, nor do I know which exit code docker uses to decide to restart or not.

I am also on mac, haven't tested on linux yet. Edit: It does restart on linux, don't have another mac to see if the behavior is isolated to my mac only.

Upvotes: 1

Views: 1407

Answers (2)

Charlie
Charlie

Reputation: 23798

It is important to understand the following two concepts:

  • Ending your Node app doesn't mean the end of your container. Your container runs a shared process from your OS and your Node app is only a sub process of that. (Assuming your application runs with the Deamon)

  • The restart indicates the "starting" policy - it will never terminate and start your container again.

Having said that, what you need is a way you can really restart your container from within the application. The best way to do this is via Docker healthchecks:

https://docs.docker.com/engine/reference/builder/#healthcheck

Or, here are some answers on restarting a container from within the application.

Stopping docker container from inside

Upvotes: 1

Adiii
Adiii

Reputation: 59946

From Github Issue seems like it does not respect `--restart``, or from the @Charlie comment seems like its vary from platform to platform.

The docker-compose run command is for running “one-off” or “adhoc” tasks.The run command acts like docker run -ti in that it opens an interactive terminal to the container and returns an exit status matching the exit status of the process in the container.

docker-compose run

Also if its like docker run -it then I am not seeing an option for restart=always but it should then respect ``restart` option in compose.

Usage:
    run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...]
        SERVICE [COMMAND] [ARGS...]

Options:
    -d, --detach          Detached mode: Run container in the background, print
                          new container name.
    --name NAME           Assign a name to the container
    --entrypoint CMD      Override the entrypoint of the image.
    -e KEY=VAL            Set an environment variable (can be used multiple times)
    -l, --label KEY=VAL   Add or override a label (can be used multiple times)
    -u, --user=""         Run as specified username or uid
    --no-deps             Don't start linked services.
    --rm                  Remove container after run. Ignored in detached mode.
    -p, --publish=[]      Publish a container's port(s) to the host
    --service-ports       Run command with the service's ports enabled and mapped
                          to the host.
    --use-aliases         Use the service's network aliases in the network(s) the
                          container connects to.
    -v, --volume=[]       Bind mount a volume (default [])
    -T                    Disable pseudo-tty allocation. By default `docker-compose run`
                          allocates a TTY.
    -w, --workdir=""      Working directory inside the container

Upvotes: 0

Related Questions