簡體   English   中英

如何使用 docker-compose 重啟單個容器

[英]How to restart a single container with docker-compose

我有一個docker-compose.yml文件,其中包含 4 個容器: redispostgresapiworker

worker容器的開發過程中,我經常需要重新啟動它以應用更改。 有什么好的方法可以在不重啟其他容器的情況下重啟單個容器(例如worker )?

很簡單:使用命令:

docker-compose restart worker

您可以設置在殺死容器之前等待停止的時間(以秒為單位)

docker-compose restart -t 30 worker

請注意,這將重新啟動容器,但不會重建它。 如果要應用更改然后重新啟動,請查看其他答案。

重新啟動單個節點的其他答案是在目標上, docker-compose restart worker 這將反彈該容器,但不包括任何更改,即使您單獨重建它。 您可以手動stoprmcreatestart ,但還有更簡單的方法。

如果您更新了代碼,則可以使用以下步驟一步完成構建和重新加載:

docker-compose up --detach --build

這將首先從任何更改的代碼中重建您的圖像,如果由於緩存被重用而沒有更改,這將很快。 然后它只替換更改的容器。 如果您下載的圖像已過時,您可以在上述命令之前使用:

docker-compose pull

先下載任何改變圖像(容器不會重新啟動,直到你執行的命令up以上)。 不需要進行初始停止。

並且僅對單個服務執行此操作,請使用您要指定的服務遵循 up 或 pull 命令,例如:

docker-compose up --detach --build worker

這是第一個選項的快速示例,Dockerfile 的結構是將代碼中頻繁更改的部分保留在末尾。 實際上, pip install的要求是單獨提出的,因為該文件很少更改。 由於 nginx 和 redis 容器是最新的,它們沒有重新啟動。 整個過程的總時間不到 6 秒:

$ 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

要在此處重新啟動具有更改的服務是我執行的步驟:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose up --no-start worker
docker-compose start worker

以下命令

docker-compose restart worker

只會停止和啟動容器。 即不從 docker-compose.xml 加載任何更改

STOP 類似於 PC 中的休眠。 因此,停止/啟動不會查找在配置文件中所做的任何更改。 要從容器的配方(docker-compose.xml)重新加載,我們需要刪除並創建容器(類似於重啟PC)

所以命令將如下

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

使用 docker-compose 文件重啟服務

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

用例 #1:如果 COMPOSE_FILE_NAME 是docker-compose.yml並且 service 是 worker

docker-compose restart worker

用例 #2:如果文件名是sample.yml並且服務是 worker

docker-compose -f sample.yml restart worker

默認情況下,如果我們運行docker-compose.yml docker-compose命令, docker-compose.yml -compose 會查找docker-compose.yml ,否則我們有標志可以使用-f [FILE_NAME].yml指定特定文件名

簡單的“docker”命令對“worker”容器一無所知。 使用這樣的命令

docker-compose -f docker-compose.yml restart worker

由於其他一些答案包括有關重建的信息,並且我的用例也需要重建,因此我有一個更好的解決方案(與那些相比)。

仍然有一種方法可以輕松地僅針對單個worker容器,該容器在一行中重建 + 重新啟動它,盡管它實際上不是單個命令。 對我來說最好的解決方案就是重建並重新啟動

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

這對我來說同時實現了兩個主要目標:

  1. 以單個worker容器為目標
  2. 在一行中重建並重新啟動它

希望這可以幫助其他人到達這里。

這里的答案是在談論 docker-compose.yml 文件上更改的反映。

但是,如果我想將我所做的更改合並到我的代碼中,並且我相信只有通過重建圖像並且我使用以下命令才能做到這一點,該怎么辦

1. docker 容器停止

docker stop container-id

2. docker容器移除

docker rm container-id

3. docker鏡像刪除

docker rmi image-id

4.再次組合容器

docker-compose up container-name

重啟容器

如果您只想重新啟動容器:

docker-compose restart servicename

將此命令視為“僅按名稱重新啟動容器”,相當於docker restart命令。

注意事項:

  1. 如果您更改了 ENV 變量,它們將不會在容器中更新。 你需要停止它並重新開始。 或者,使用單個命令docker-compose up將檢測更改並重新創建容器。

  2. 正如許多其他人提到的,如果您更改了docker-compose.yml文件本身,則簡單的重啟不會應用這些更改。

  3. 如果您在構建階段將代碼復制到容器內(在Dockerfile使用ADDCOPY命令),則每次代碼更改時您都必須重建容器( docker-compose build )。

與您的代碼的相關性

docker-compose restart應該可以正常工作,如果您的代碼通過docker-compose.yml中的 volume 指令將路徑映射到容器中, docker-compose.yml所示:

services:

  servicename:
    volumes:
      - .:/code

但我建議使用實時代碼重新加載,這可能由您在 DEBUG 模式下選擇的框架提供(或者,您可以使用您選擇的語言搜索自動重新加載包)。 添加它應該消除每次代碼更改后重新啟動容器的需要,而是重新加載內部進程。

進行更改后,您需要將更改拉入服務器,然后重新創建容器。 因此,正如文檔所示:

docker-compose pull worker && docker-compose up -d --no-deps worker

pull worker只會將這個項目拉到服務器, --no-deps會阻止重啟worker容器所依賴的容器。

要在僅重新啟動單個服務的同時對 Docker Compose 文件應用更改,您可以使用 docker-compose 命令和 up 命令並指定服務名稱。 例如:

$ docker-compose up -d --no-deps myservice

...此命令將更新 myservice 服務的配置並重新啟動它,而不會觸及 Compose 文件中的任何其他服務。 -d 標志在后台運行服務,--no-deps 標志告訴 Compose 不要啟動 myservice 服務的任何依賴項。

或者,您可以使用 restart 命令重新啟動單個服務:

$ docker-compose 重新啟動我的服務

...這將為 myservice 服務應用最新配置並重新啟動它。 請注意,此命令不會對 Compose 文件本身應用任何更改,它只會使用當前配置重新啟動服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM