How to restart a single container with docker-compose

后端 未结 9 1803
失恋的感觉
失恋的感觉 2020-12-02 03:27

I have a docker-compose.yml file that contains 4 containers: redis, postgres, api, worker

During the development of worker, I often need to restart it i

相关标签:
9条回答
  • 2020-12-02 03:57

    It is very simple: Use the command:

    docker-compose restart worker
    

    You can set the time to wait for stop before killing the container (in seconds)

    docker-compose restart -t 30 worker
    

    Note that this will restart the container but without rebuilding it. If you want to apply your changes and then restart, take a look at the other answers.

    0 讨论(0)
  • 2020-12-02 04:02

    Restart container

    If you want to just restart your container:

    docker-compose restart servicename

    Think of this command as "just restart the container by its name", which is equivalent to docker restart command.

    Note caveats:

    1. If you changed ENV variables they won't updated in container. You need to stop it and start again. Or, using single command docker-compose up will detect changes and recreate container.

    2. As many others mentioned, if you changed docker-compose.yml file itself, simple restart won't apply those changes.

    3. If you copy your code inside container at the build stage (in Dockerfile using ADD or COPY commands), every time the code changes you have to rebuild the container (docker-compose build).

    Correlation to your code

    docker-compose restart should work perfectly fine, if your code gets path mapped into the container by volume directive in docker-compose.yml like so:

    services:
    
      servicename:
        volumes:
          - .:/code
    

    But I'd recommend to use live code reloading, which is probably provided by your framework of choice in DEBUG mode (alternatively, you can search for auto-reload packages in your language of choice). Adding this should eliminate the need to restart container every time after your code changes, instead reloading the process inside.

    0 讨论(0)
  • 2020-12-02 04:08

    Since some of the other answers include info on rebuilding, and my use case also required a rebuild, I had a better solution (compared to those).

    There's still a way to easily target just the one single worker container that both rebuilds + restarts it in a single line, albeit it's not actually a single command. The best solution for me was simply rebuild and restart:

    docker-compose build worker && docker-compose restart worker
    

    This accomplishes both major goals at once for me:

    1. Targets the single worker container
    2. Rebuilds and restarts it in a single line

    Hope this helps anyone else getting here.

    0 讨论(0)
  • 2020-12-02 04:11

    Restart Service with docker-compose file

    docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]
    

    Use Case #1: If the COMPOSE_FILE_NAME is docker-compose.yml and service is worker

    docker-compose restart worker
    

    Use Case #2: If the file name is sample.yml and service is worker

    docker-compose -f sample.yml restart worker
    

    By default docker-compose looks for the docker-compose.yml if we run the docker-compose command, else we have flag to give specific file name with -f [FILE_NAME].yml

    0 讨论(0)
  • 2020-12-02 04:12

    The other answers to restarting a single node are on target, docker-compose restart worker. That will bounce that container, but not include any changes, even if you rebuilt it separately. You can manually stop, rm, create, and start, but there are much easier methods.

    If you've updated your code, you can do the build and reload in a single step with:

    docker-compose up --detach --build
    

    That will first rebuild your images from any changed code, which is fast if there are no changes since the cache is reused. And then it only replaces the changed containers. If your downloaded images are stale, you can precede the above command with:

    docker-compose pull
    

    To download any changed images first (the containers won't be restarted until you run a command like the up above). Doing an initial stop is unnecessary.

    And to only do this for a single service, follow the up or pull command with the services you want to specify, e.g.:

    docker-compose up --detach --build worker
    

    Here's a quick example of the first option, the Dockerfile is structured to keep the frequently changing parts of the code near the end. In fact the requirements are pulled in separately for the pip install since that file rarely changes. And since the nginx and redis containers were up-to-date, they weren't restarted. Total time for the entire process was under 6 seconds:

    $ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
    Building counter
    Step 1 : FROM python:2.7-alpine
     ---> fc479af56697
    Step 2 : WORKDIR /app
     ---> Using cache
     ---> d04d0d6d98f1
    Step 3 : ADD requirements.txt /app/requirements.txt
     ---> Using cache
     ---> 9c4e311f3f0c
    Step 4 : RUN pip install -r requirements.txt
     ---> Using cache
     ---> 85b878795479
    Step 5 : ADD . /app
     ---> 63e3d4e6b539
    Removing intermediate container 9af53c35d8fe
    Step 6 : EXPOSE 80
     ---> Running in a5b3d3f80cd4
     ---> 4ce3750610a9
    Removing intermediate container a5b3d3f80cd4
    Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
     ---> Running in 0d69957bda4c
     ---> d41ff1635cb7
    Removing intermediate container 0d69957bda4c
    Successfully built d41ff1635cb7
    counter_nginx_1 is up-to-date
    counter_redis_1 is up-to-date
    Recreating counter_counter_1
    
    real    0m5.959s
    user    0m0.508s
    sys     0m0.076s
    
    0 讨论(0)
  • 2020-12-02 04:13

    To restart a service with changes here are the steps that I performed:

    docker-compose stop -t 1 worker
    docker-compose build worker
    docker-compose up --no-start worker
    docker-compose start worker
    
    0 讨论(0)
提交回复
热议问题