डॉकटर-कंपोज के साथ एक कंटेनर को कैसे पुनः आरंभ करें


333

मेरे पास एक docker-compose.ymlफ़ाइल है जिसमें 4 कंटेनर हैं: रेडिस, पोस्टग्रेज, एपी, वर्कर

कार्यकर्ता के विकास के दौरान, मुझे अक्सर परिवर्तनों को लागू करने के लिए इसे पुनः आरंभ करने की आवश्यकता होती है। क्या workerअन्य कंटेनरों को फिर से शुरू किए बिना एक कंटेनर (जैसे ) को पुनरारंभ करने का कोई अच्छा तरीका है ?


2
docker-compose -f docker-compose.yml पुनः आरंभ कर्मी
बलू

जवाबों:


397

यह बहुत सरल है: कमांड का उपयोग करें:

docker-compose restart worker

आप कंटेनर को मारने से पहले रुकने का समय निर्धारित कर सकते हैं (सेकंड में)

docker-compose restart -t 30 worker

ध्यान दें कि यह कंटेनर को पुनः आरंभ करेगा लेकिन इसे बनाए बिना। यदि आप अपने परिवर्तनों को लागू करना चाहते हैं और फिर पुनः आरंभ करें, तो अन्य उत्तरों पर एक नज़र डालें।


3
मेरे लिए यह काम कर गया, लेकिन एक सामान्य प्रश्न यदि यहां अनुमति दी गई है: क्या 'पुनः आरंभ' लिंक किए गए कंटेनरों की देखभाल करता है और / etc / मेजबानों को अद्यतन करता है या 'पुनः आरंभ' किसी भी IP को बिल्कुल भी नहीं बदलता है?
माइकलब

कंटेनर नाम से जुड़े होते हैं और आमतौर पर एकमात्र आईपी जिसके बारे में आपको चिंता करने की आवश्यकता होती है वह है बाहरी डॉकटर होस्ट आईपी (आमतौर पर 192.168.99-00)। जहां कुछ परेशानी हो सकती है यदि आप कहते हैं, एक डेटाबेस कंटेनर को पुनरारंभ करें जो अन्य कंटेनरों से जुड़ा हुआ है। आश्रित कंटेनरों को फिर से जोड़ने के लिए पर्याप्त लचीला होना चाहिए।
रयान किम्बर

20
ओपी कहता है कि उसे "परिवर्तनों को लागू करने के लिए इसे फिर से शुरू करने की आवश्यकता है"। डॉक्स के अनुसार docker-compose restartकमांड किसी भी बदलाव को लागू नहीं करेंगे। "यदि आप अपने docker-compose.ymlकॉन्फ़िगरेशन में परिवर्तन करते हैं तो ये परिवर्तन इस कमांड को चलाने के बाद परिलक्षित नहीं होते हैं।" इसलिए उपयोग करें docker-compose up -d --builddocs.docker.com/compose/reference/restart
featherbelly

5
nb, कार्यकर्ता नाम YAML फ़ाइल में सेवा करने के लिए दिया जाता है और कुछ भी नहीं है कि आप देखते हैं जब चल रहा हैdocker ps -a
worc

2
यह अन्य उत्तर ज्यादा बेहतर है stackoverflow.com/a/39501539/292408 , क्योंकि restartअगर आप पहले से ही भाग चुके हैं तो भी यह परिवर्तन लागू नहीं करता है docker-compose build <container name>और यह एक गैर-काम / गलत उत्तर है।
एलिजा लिन

170

एक एकल नोड को पुन: प्रारंभ करने के लिए अन्य उत्तर, लक्ष्य पर हैं docker-compose restart worker। यह उस कंटेनर को उछाल देगा, लेकिन इसमें कोई बदलाव शामिल नहीं है, भले ही आपने इसे अलग से बनाया हो। आप मैन्युअल रूप से कर सकते हैं stop, rm, create, और start, लेकिन वहाँ बहुत आसान तरीके हैं।

यदि आपने अपना कोड अपडेट कर दिया है, तो आप एक ही चरण में निर्माण और पुनः लोड कर सकते हैं:

docker-compose up --detach --build

यह किसी भी परिवर्तित कोड से सबसे पहले आपकी छवियों का पुनर्निर्माण करेगा, जो कि कैश का पुन: उपयोग किए जाने के बाद से कोई बदलाव नहीं होने पर तेजी से होता है। और फिर यह केवल बदले हुए कंटेनरों की जगह लेता है। यदि आपकी डाउनलोड की गई छवियां बासी हैं, तो आप उपरोक्त आदेश को पूर्ववर्ती कर सकते हैं:

docker-compose pull

किसी भी बदली हुई इमेज को डाउनलोड करने के लिए (जब तक आप upऊपर की तरह कमांड नहीं चलाते हैं तब तक कंटेनर को फिर से शुरू नहीं किया जाएगा )। प्रारंभिक रोकना अनावश्यक है।

और केवल एक ही सेवा के लिए ऐसा करने के लिए, उन सेवाओं के साथ अप या पुल कमांड का पालन करें जिन्हें आप निर्दिष्ट करना चाहते हैं, जैसे:

docker-compose up --detach --build worker

यहां पहले विकल्प का एक त्वरित उदाहरण है, डॉकरीफाइल को कोड के अंत में अक्सर बदलते हिस्सों को पास रखने के लिए संरचित किया जाता है। वास्तव में आवश्यकताओं को अलग से खींच लिया जाता है pip installक्योंकि उस फ़ाइल में शायद ही कभी बदलाव होता है। और जब से नगनेक्स और रेडिस कंटेनर अप-टू-डेट थे, तब तक उन्हें फिर से शुरू नहीं किया गया था। पूरी प्रक्रिया के लिए कुल समय 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

यह दिलचस्प है, लेकिन क्या इसका उपयोग -no-cacheविकल्प के साथ किया जा सकता है ? कहो कि मैंने अपने में कुछ जोड़ा है package.jsonऔर फिर से करने की जरूरत है, RUN npm installलेकिन Dockerfileखुद को नहीं बदला है
Augustin Riedinger

2
@augustinriedinger यदि आपकी इनपुट फ़ाइल बदली गई है और आप इसे एक COPYकमांड के साथ शामिल करते हैं , जो कैश को स्वचालित रूप से तोड़ देगा।
BMitch

1
@ उद्घाटन पदाधिकारी धन्यवाद मैं मोबाइल हूं इसलिए मैं लिंक किए गए सवालों को नहीं देख सकता। अपने प्रश्न में दिए चरणों से आपको पहले से ही COPYअपने डॉकरफाइल में एक कमांड होना चाहिए । git pullPackage.json फ़ाइल अपडेट हो जाएगा और जब डोकर आप एक अलग फाइल में कॉपी देखता निर्माण कैश टूट जाएगा।

1
धन्यवाद इस व्यवहार के बारे में नहीं जानता था! मैं ADDइसके बजाय उपयोग कर रहा था , COPYलेकिन जाहिर है कि बाद वाला सबसे अच्छा अभ्यास है इसलिए मैं इसके लिए जाऊंगा!
ऑगस्टिन रिडिंगर कॉलर

1
@augustinriedinger पर कैश बस्ट के ADDरूप में एक ही परिणाम होगा COPY, लेकिन (जैसा कि सर्वोत्तम प्रथाओं लिंक में सुझाया गया है) सबसे अधिक अतिरिक्त क्षमताओं की आवश्यकता नहीं है, इसलिए मुझे इसका उल्लेख करने की भी चिंता नहीं है।
21 अक्टूबर को BMitch

28

यहां परिवर्तनों के साथ किसी सेवा को पुनः आरंभ करने के लिए मैंने जो कदम उठाए हैं:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

10
यदि आपको बिल्ड के साथ आवेदन करने के लिए परिवर्तनों की आवश्यकता है, तो आप आसानी से कर सकते हैं docker-compose up -d --buildऔर यह सब कुछ पुनर्निर्माण करेगा और किसी भी बदले हुए कंटेनर को फिर से शुरू करेगा। डाउनटाइम के साथ पहले स्टॉप की आवश्यकता नहीं है, और अलग-अलग बनाएं और कमांड शुरू करें।
BMitch

4
हां, यदि आप सभी सेवाओं को फिर से शुरू करना चाहते हैं, लेकिन ओपी केवल एक ही सेवा को फिर से शुरू करना चाहता है और दूसरों को पुनः आरंभ नहीं करना चाहता है
जेफ़

3
मैंने जो उत्तर पोस्ट किया है, उसे देखें, उदाहरण में, upकेवल उस कंटेनर को फिर से बनाया जाएगा जिसे बदल दिया गया था और इसलिए उसे पुनः आरंभ करने की आवश्यकता थी।
BMitch

18

निम्नलिखित आदेश

docker-compose restart worker

सिर्फ स्टॉप और कंटेनर को स्टार्ट करेंगे। यानी docker-compose.xml से कोई भी परिवर्तन लोड किए बिना

STOP पीसी में हाइबरनेटिंग के समान है। इसलिए स्टॉप / स्टार्ट कॉन्फ़िगरेशन फ़ाइल में किए गए किसी भी बदलाव की तलाश नहीं करेगा। कंटेनर (docker-compose.xml) के नुस्खा से पुनः लोड करने के लिए हमें कंटेनर को निकालने और बनाने की आवश्यकता है (पीसी को रिबूट करने के लिए समान सादृश्य)

तो कमांड निम्नानुसार होंगे

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

+1, बहुत धन्यवाद! के लिए rmलाइन विकल्प -fकाम (कोई शीघ्र) और के साथ वर्तमान डोकर आता है createऔर startविलय कर दिया है के रूप में up(ताकि कुल में हम 3 आदेशों नहीं 4), और के लिए upविकल्प -dउपयोगी है (निष्पादन पृष्ठभूमि में है)।
ज्योतिषी

10

डॉकटर-कंपोज़ फ़ाइल के साथ सेवा को पुनरारंभ करें

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

केस # 1 का उपयोग करें: यदि COMPOSE_FILE_NAME है docker-compose.ymlऔर सेवा कार्यकर्ता है

docker-compose restart worker

केस # 2 का उपयोग करें: यदि फ़ाइल का नाम है sample.ymlऔर सेवा कार्यकर्ता है

docker-compose -f sample.yml restart worker

docker-compose.ymlयदि हम docker-composeकमांड चलाते हैं तो डिफ़ॉल्ट रूप से डॉक-कंपोज़ दिखता है , अन्यथा हमारे पास विशिष्ट फ़ाइल नाम देने के लिए ध्वज है-f [FILE_NAME].yml


7

साधारण 'docker' कमांड 'वर्कर' कंटेनर के बारे में कुछ नहीं जानता। इस तरह कमांड का उपयोग करें

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


4
काम नहीं करता है - कोकर-कम्पोज़ के लिए नए बदलाव। फिर से शुरू होने पर लागू नहीं हुआ
jlee

3

कंटेनर को पुनरारंभ करें

यदि आप अपने कंटेनर को पुनः आरंभ करना चाहते हैं:

docker-compose restart servicename

इस कमांड को "केवल अपने नाम से कंटेनर को पुनरारंभ करें" के रूप में सोचें, जो docker restartकमांड के बराबर है ।

नोट चेतावनी:

  1. यदि आपने ENV चर बदले हैं तो वे कंटेनर में अपडेट नहीं होंगे। आपको इसे रोकने और फिर से शुरू करने की आवश्यकता है। या, एकल आदेश का उपयोग करके docker-compose upपरिवर्तनों का पता लगाना और कंटेनर को फिर से बनाना होगा।

  2. जैसा कि कई अन्य ने उल्लेख किया है, यदि आपने docker-compose.ymlफ़ाइल को स्वयं बदल दिया है, तो साधारण पुनरारंभ उन परिवर्तनों को लागू नहीं करेगा।

  3. यदि आप अपने कोड को कंटेनर में बिल्ड स्टेज पर ( Dockerfileउपयोग ADDया COPYकमांड में) कॉपी करते हैं , तो हर बार कोड आपको कंटेनर को फिर से बनाना होगा ( docker-compose build)।

अपने कोड से सहसंबंध

docker-compose restartपूरी तरह से ठीक काम करना चाहिए, यदि आपके कोड को कंटेनर में मैप किया जाता है docker-compose.ymlजैसे कि मात्रा निर्देश द्वारा :

services:

  servicename:
    volumes:
      - .:/code

लेकिन मैं लाइव कोड पुनः लोड करने का उपयोग करने की सलाह दूंगा, जो संभवत: DEBUG मोड में आपकी पसंद के फ्रेमवर्क द्वारा प्रदान किया गया है (वैकल्पिक रूप से, आप अपनी पसंद की भाषा में ऑटो-रीलोड पैकेज खोज सकते हैं)। इसे जोड़ने से आपके कोड में बदलाव के बाद हर बार कंटेनर को पुनरारंभ करने की आवश्यकता समाप्त हो जानी चाहिए, इसके बजाय प्रक्रिया को फिर से लोड करना चाहिए।


1

उत्तर यहाँ docker-compose.yml फ़ाइल पर परिवर्तन के प्रतिबिंब के बारे में बात कर रहे हैं।

लेकिन क्या होगा अगर मैं अपने कोड में किए गए बदलावों को शामिल करना चाहता हूं, और मुझे विश्वास है कि यह केवल छवि के पुनर्निर्माण से संभव होगा और यह मैं निम्नलिखित आदेशों के साथ करता हूं

1. डॉकटर कंटेनर स्टॉप

docker stop container-id

2. docker कंटेनर हटाने

docker rm container-id

3. docker छवि निकालना

docker rmi image-id

4. कंटेनर को फिर से लिखें

docker-compose up container-name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.