सिस्टम स्टार्ट-अप पर डॉक-कंपोज़ अप को कैसे चलाएं?


114

कंटेनरों को स्टार्टअप बिंदु पर ऑटोस्टार्ट करने के लिए, मैंने कमांड जोड़ने की कोशिश की:

cd directory_has_docker-compose.yml && docker-compose up -d in /etc/rc.local

लेकिन फिर मैं मशीन को रिबूट करने के बाद, कंटेनर काम नहीं करते हैं।

docker-compose up -dसिस्टम स्टार्ट अप कैसे चलाया जाता है?


3
उपयोग --restart alwaysया --restart unless-stoppedया docker-compose.yml उपयोग में restart: always-> रेफरी । लेकिन शायद कुछ कंटेनरों पर काम नहीं किया!
बेनामिन जाफरी

जवाबों:


130

जब हम उपयोग करते हैं crontabया पदावनत /etc/rc.localफाइल करते हैं, तो हमें sleep 10यह सुनिश्चित करने के लिए एक देरी की आवश्यकता होती है (जैसे , मशीन पर निर्भर करता है) कि सिस्टम सेवाएं उपलब्ध हैं। आमतौर पर, systemd(या upstart) का इस्तेमाल यह देखने के लिए किया जाता है कि सिस्टम बूट होने पर कौन सी सेवाएं शुरू करता है। आप इसके लिए समान कॉन्फ़िगरेशन का उपयोग करने का प्रयास कर सकते हैं:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

या, यदि आप -dध्वज के बिना चलाना चाहते हैं :

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

WorkingDirectoryअपने dockerized प्रोजेक्ट पथ के साथ पैरामीटर बदलें । और स्वचालित रूप से शुरू करने के लिए सेवा को सक्षम करें:

systemctl enable docker-compose-app

यदि रास्पबेरी को फिर से शुरू किए बिना काम करता है तो क्या यह परीक्षण करने का एक सरल तरीका है?
dmigo

2
यह सबसे खूबसूरत जवाब है IMO
kuzyn

2
@Migo systemctl start docker-compose-appऔर systemctl status docker-compose-appआप मुझे क्या लगता है के लिए देख रहे हैं।
हेक्टरज

मेरे लिए काम नहीं किया, जब मैं systemctl start docker-compose-appइस के साथ सामना किया:Job for docker-compose-app.service failed because the control process exited with error code. See "systemctl status docker-compose-app.service" and "journalctl -xe" for details
बेनामिन जाफरी

1
@ मिडीगो: अपनी सेवा के स्टार्टअप का परीक्षण करें: के service docker-compose-app startसाथ स्थिति service docker-compose-app status, साथ बंदservice docker-compose-app stop
BarryPye

96

आपको जोड़ने में सक्षम होना चाहिए:

restart: always 

प्रत्येक सेवा के लिए जिसे आप docker-compose.yml फ़ाइल में पुनरारंभ करना चाहते हैं


6
ध्यान रखें कि रिबूट होने पर उन्हें चलना होगा, इसलिए रिबूट से पहले मैन्युअल रूप से उन्हें रोकें नहीं।
टॉम

कुछ सेवाएँ जैसे Nginx इस विकल्प के साथ भी शुरू नहीं होती हैं।
बेनामिन जाफरी

15
यह प्रश्न का उचित उत्तर है। कंटेनरों को फिर से शुरू करने के लिए एक डिज़ाइन किया गया तरीका है, पहिया को सुदृढ़ करने के लिए क्रोन नौकरियों और अन्य तरीकों से क्यों प्राप्त करें।
ताहा रहमान सिद्दीकी 20

यह सही जवाब है। जब आप क्रोन के बजाय कुबेरनेट का उपयोग करना शुरू करते हैं, तो आपको खुशी होगी कि आपने इसका उपयोग किया है।
२३:१

9
@TahaRehmanSiddiqui नोट जिसमें restart: alwaysकुछ गंभीर बग हैं: उदाहरण के लिए रिबूट पर होस्ट माउंट संलग्न नहीं किया जाएगा। मेरी राय में, पहिया को सुदृढ़ करना बेहतर है, यदि मौजूदा पहिया वर्ग है।
ओकेडिट

73

यदि आपका docker.serviceसिस्टम स्टार्टअप पर सक्षम है

$ sudo systemctl enable docker

और आपकी सेवाओं में आपकी docker-compose.ymlहै

restart: always

यदि आप अपने सिस्टम को रिबूट करते हैं तो सभी सेवाएँ चलती हैं यदि आप केवल एक बार कमांड से नीचे चलते हैं

docker-compose up -d

2
यह सबसे सुरुचिपूर्ण समाधान होना चाहिए
कार्ल चेउंग

34

मैंने कोशिश की restart: always, यह कुछ कंटेनरों (जैसे php-fpm) पर काम करता है, लेकिन मैंने इस समस्या का सामना किया कि कुछ कंटेनर (जैसे नेग्नेक्स) अभी भी रिबूट के बाद फिर से शुरू नहीं कर रहे हैं।

समस्या का हल किया।

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&

2
इस उत्तर के लिए एक अपमान क्यों? क्या उत्तर उपयोगी नहीं है? क्या यह किसी भी मायने में गलत है? एक टिप्पणी उत्तर देने वाले और अन्य लोगों को यह बताने में उपयोगी होगी कि क्या गलत है।
आयुषी

5
आपको नंगे नींद के बारे में संदेह
giorgiosironi

@giorgiosironi नींद इस मामले में ठीक है। कंटेनर स्टार्ट-अप को वैसे भी nondeterministic व्यवहार को संभालने में सक्षम होना चाहिए।
z0r

4
यह 30 सेकंड तक विलंबता का भी परिचय दे रहा है जिसकी आवश्यकता नहीं है।
giorgiosironi

@ z0r नींद ठीक नहीं है! नींद "काम" हो सकती है लेकिन कोई भी स्टार्टअप अनुक्रम निर्धारक होना चाहिए। लिनक्स सेवाएं शुरू होने से पहले नेटवर्क जैसी चीजों को सुनिश्चित करने के लिए निर्भरता का उपयोग करती हैं। आपको भी ऐसा ही करना चाहिए।
colm.anseo

25

रिस्टार्ट का उपयोग करें : हमेशा आपके डॉकटर कम्पोज़ में

Docker-compose up -dछवियों से कंटेनर को फिर से लॉन्च करेगा। docker-compose startबंद किए गए कंटेनरों को शुरू करने के लिए उपयोग करें , यह कभी भी छवियों से नए कंटेनर लॉन्च नहीं करता है।

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

इसके अलावा आप डॉक फ़ाइल में कोड को लिख सकते हैं ताकि यह पहले बन जाए, अगर इसमें अन्य कंटेनरों की निर्भरता हो।


1
आप उपयोग नहीं करना चाह सकते हैं always, लेकिन हो सकता है unless-stopped। अन्य विकल्प हैं on-failureऔर no। इसे पुनरारंभ नीति के रूप में जाना जाता है ।
पॉल

5

के user39544जवाब के अलावा , के लिए एक और प्रकार के वाक्यविन्यास crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d

इसने 2018 में आरपीआई चलाने वाले आरपी 3 पर मेरे लिए काम किया। मैं crontab -eउपयोगकर्ता पी के रूप में भाग गया , पी के साथ समूह docker का एक सदस्य ...
स्कॉट वीर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.