डॉक्यू-कम्पोज़ कैसे प्राप्त करें, रिपॉजिटरी से नवीनतम छवि का उपयोग करने के लिए


89

मुझे नहीं पता कि मैं क्या गलत कर रहा हूं, लेकिन मैं बस docker-compose upपुराने कंटेनरों को सिस्टम से पूरी तरह से हटाए बिना हमारी रजिस्ट्री से नवीनतम छवि का उपयोग करने के लिए नहीं मिल सकता । ऐसा लगता है कि रचना पहले से शुरू की गई छवि का उपयोग कर रही है, हालांकि डॉक-कंपोज पुल ने एक नई छवि प्राप्त की है।

मैंने देखा कि हमेशा ताजा चित्रों से कंटेनरों को फिर से बनाने के लिए डॉक-कंपोज़ कैसे प्राप्त करें? जो मेरे मुद्दे के समान लग रहा था, लेकिन मेरे द्वारा दिए गए समाधानों में से कोई भी मेरे लिए काम नहीं करता है, क्योंकि मैं एक समाधान की तलाश कर रहा हूं जो मैं उत्पादन सर्वर पर उपयोग कर सकता हूं और वहां मैं उन्हें शुरू करने से पहले सभी कंटेनरों को हटाना नहीं चाहता हूं। फिर से (संभव डेटा हानि?)। मैं केवल परिवर्तित छवियों के नए संस्करण का पता लगाने, उन्हें खींचने और फिर उन नई छवियों के साथ सेवाओं को पुनरारंभ करने के लिए रचना करना चाहूंगा।

मैंने इसके लिए एक सरल परीक्षण परियोजना बनाई जिसमें प्रत्येक नए बिल्ड पर वृद्धि के लिए केवल एक संस्करण एनआर प्राप्त करना एकमात्र लक्ष्य है। संस्करण nr तब प्रदर्शित होता है जब मैं उस nginx सर्वर को ब्राउज़ करता हूं जो बनाया जाता है (यह स्थानीय रूप से अपेक्षित रूप से काम करता है)।

डॉक वर्जन: 1.11.2 डॉकटर-कंपोज वर्जन: 1.7.1 OS: डॉक-टूलबॉक्स का उपयोग करके दोनों CentOS 7 और OS X 10.10 पर परीक्षण किया गया

मेरा डॉकटर-कंपोज.लिम:

version: '2'
services:
  application:
    image: ourprivate.docker.reg:5000/ourcompany/buildchaintest:0.1.8-dev
    volumes:
      - /var/www/html
    tty: true

  nginx:
    build: nginx
    ports:
      - "80:80"
    volumes_from:
      - application
    volumes:
      - ./logs/nginx/:/var/log/nginx
  php:
    container_name: buildchaintest_php_1
    build: php-fpm
    expose:
      - "9000"
    volumes_from:
      - application
    volumes:
      - ./logs/php-fpm/:/var/www/logs

हमारे jenkins सर्वर पर मैं छवि बनाने और टैग करने के लिए निम्नलिखित चलाता हूं

cd $WORKSPACE && PROJECT_VERSION=$(cat VERSION)-dev
/usr/local/bin/docker-compose rm -f
/usr/local/bin/docker-compose build
docker tag ourprivate.docker.reg:5000/ourcompany/buildchaintest ourprivate.docker.reg:5000/ourcompany/buildchaintest:$PROJECT_VERSION
docker push ourprivate.docker.reg:5000/ourcompany/buildchaintest

ऐसा लगता है कि जब से बिल्ड पूरा होता है और हर बार संस्करण एनआरपी टकरा जाता है, तो मुझे लगता है कि यह एक नया संस्करण होने वाला है।

अगर मैं अब चला

docker-compose pull && docker-compose -f docker-compose.yml up -d

मेरे कंप्यूटर पर एक फ़ोल्डर में, जहां सामग्री केवल डॉक-कंपोज़ है। nginx और php सेवाओं का निर्माण करने के लिए आवश्यक डॉकफाइल्स हैं, जो आउटपुट मुझे मिलता है वह नवीनतम संस्करण संख्या नहीं है जैसा कि रजिस्ट्री में टैग किया गया है या दिखाया गया है docker-compose.yml (0.1.8) में, लेकिन उससे पहले का संस्करण, जो 0.1.7 है। हालांकि पुल कमांड का आउटपुट बताता है कि छवि का एक नया संस्करण लाया गया था:

Pulling application (ourprivate.docker.reg:5000/ourcompany/buildchaintest:latest)...
latest: Pulling from ourcompany/buildchaintest
Digest: sha256:8f7a06203005ff932799fe89e7756cd21719cccb9099b7898af2399414bfe62a
Status: Downloaded newer image for docker.locotech.fi:5000/locotech/buildchaintest:0.1.8-dev

अगर मैं चलाऊं तो ही

docker-compose stop && docker-compose rm -f

और फिर docker-compose upकमांड को चलाएं क्या मुझे उम्मीद के मुताबिक स्क्रीन पर दिखाने के लिए नया संस्करण मिलेगा।

क्या यह डॉकटर-कम्पोज़ का व्यवहार है? यानी मुझे हमेशा उत्पादन सर्वर पर भी docker-compose rm -fचलने upसे पहले हमेशा करना चाहिए ? या मैं यहां अनाज के खिलाफ कुछ कर रहा हूं, जिसके कारण यह काम नहीं कर रहा है?

लक्ष्य के लिए हमारी निर्माण प्रक्रिया का निर्माण करना है और docker-compose.yml में आवश्यक छवियों के टैग किए गए संस्करणों को बनाना है, उन्हें हमारी निजी रजिस्ट्री पर धकेलना और फिर "do-compose को कॉपी करने के लिए" प्रोडक्शन-स्टेप के लिए रिलीज़ करना है। उत्पादन सर्वर के लिए yml और उत्पादन docker-compose pull && docker-compose -f docker-compose.yml up -dशुरू करने के लिए नई छवि के लिए चलाते हैं । अगर किसी के पास इस पर युक्तियां हैं या इस तरह के सेटअप के लिए एक सर्वोत्तम अभ्यास ट्यूटोरियल को इंगित कर सकते हैं जो बहुत सराहना की जाएगी।


2
docker-compose up -d --force-recreateकाम नहीं किया?
बिमच

कंटेनरों को हटाते / पुन: उपयोग करते समय डेटा हानि के जोखिम से बचने के लिए, होस्ट या नामित वॉल्यूम का उपयोग करें। ऐसा लगता है कि आप पहले से ही अन्य कंटेनरों के लिए होस्ट वॉल्यूम का उपयोग कर रहे हैं। जब आप पहली बार इसका उपयोग करते हैं तो एक खाली नाम वाला वॉल्यूम छवि की मात्रा की सामग्री के साथ आरंभ करेगा।
22

-फोर्स-रिक्रिएटेड काम नहीं किया, नहीं :( मैं डेटा स्टोरेज के लिए वॉल्यूम का उपयोग कर रहा हूं, इसलिए डेटा लॉस वाला हिस्सा शायद उतना प्रासंगिक नहीं है। लेकिन मैं अभी भी उलझन में हूं कि इससे पहले डॉक-कंपोज आरएम करने के लिए कंटेनरों को फिर से शुरू करना। ऊपर, कमान, विशेष रूप से बल-विश्राम के साथ, एक नई छवि को ध्यान में रखते हुए उपयोग नहीं करना चाहिए। इसके बजाय यह गलत लगता है कि मुझे उत्पादन सर्वर पर हटाने के लिए मजबूर करना होगा
जेन्स 9

यदि --force-recreateआप कंटेनरों को पुनः प्राप्त नहीं कर रहे हैं, तो आपको बग रिपोर्ट दर्ज करने की आवश्यकता हो सकती है docker-compose। ध्यान रखें कि एक नई छवि का उपयोग करना कंटेनर को फिर से बनाना होगा, जो इसे हटा देगा। और यदि आप इस प्रक्रिया में किसी भी विशिष्ट कंटेनर को नहीं हटाते हैं, तो आप उन डेटा की लंबी लंबी सूची प्राप्त कर सकते हैं जिन्हें आप फिर कभी उपयोग नहीं करते हैं docker volume ls -f dangling=true। तो आपका फिक्स पहले आधा है जो आपके लिए क्या करना चाहिए।
BMitch

ठीक है धन्यवाद! मुझे यह सुनिश्चित करने के लिए थोड़ा अधिक इधर-उधर होना पड़ेगा कि मैं इस प्रक्रिया को समझता हूं (फिर भी एक नौसिखिया जब यह डॉकटर की बात आती है), लेकिन ऐसा लगता है कि निर्माण करने से पहले rm -f की रचना करते समय मुझे क्या करना होगा।
जेन्स वीगर

जवाबों:


68

यह सुनिश्चित करने के लिए, कि आप :latestअपने रजिस्ट्री से अपने टैग के लिए नवीनतम संस्करण का उपयोग कर रहे हैं (जैसे docker hub) आपको नवीनतम टैग को भी फिर से खींचने की आवश्यकता है। यदि यह बदल गया है, तो जब आप docker-compose upफिर से डाउनलोड करेंगे, तो अंतर डाउनलोड और शुरू हो जाएगा ।

तो यह जाने का रास्ता होगा:

docker-compose stop
docker-compose rm -f
docker-compose pull   
docker-compose up -d

मैंने इसे एक ऐसी छवि में विभाजित किया है जिसे मैं docker-compose को शुरू करने के लिए चलाता हूं और सुनिश्चित करता हूं कि छवियां अद्यतित रहें: https://hub.docker.com/r/stephanlindauer/docker-compose-updater/


40
docker-compose pull && docker-compose up -dपर्याप्त है। यह स्वचालित रूप से जाँच करता है कि क्या चल रहे कंटेनर पुराने हैं और अगर ऐसा है, तो उन्हें सबसे नई छवियों के साथ फिर से बनाएँ
Mindaugas Varkalys

@MindaugasVarkalys आपकी टिप्पणी को स्वीकृत उत्तर होना चाहिए, सर। आकर्षण की तरह काम करता है।
युरी पॉज़्नानक

37

नवीनतम चित्र पाने के लिए डॉक-कंपोज़ बिल्ड -पुल का उपयोग करें

मैं कमांड का उपयोग करता हूं जो वास्तव में 1 में 3 है

docker-compose down && docker-compose build --pull && docker-compose up -d

यह कमांड सेवाओं को रोक देगा, नवीनतम छवि को खींचेगा और फिर सेवाएं शुरू करेगा।


शायद आपको docker-compose pullसेवाओं के लिए छवियों को अपडेट करने के लिए जोड़ना चाहिए : निर्माण के बजाय: docker-compose.ymlया इसमें docker-compose build --pullक्या होगा?
सागरबीटी

nginx uses an image, skippingजब निर्माण का उपयोग करते हैं तो मुझे मिलता है - निर्माण इस प्रकार छवियों को अद्यतन नहीं कर रहा है।
एंटोनियो आराजू

23

इस सवाल को बंद करने के लिए, जो काम किया गया था, वह वास्तव में चल रहा है

docker-compose stop
docker-compose rm -f
docker-compose -f docker-compose.yml up -d

यानी upदोबारा चलने से पहले कंटेनर हटा दें ।

ऐसा करते समय किसी को ध्यान में रखने की आवश्यकता है कि डेटा वॉल्यूम कंटेनरों को हटा दिया जाता है यदि आप बस चलाते हैं rm -f। यह रोकने के लिए कि मैं हटाने के लिए स्पष्ट रूप से प्रत्येक कंटेनर निर्दिष्ट करता हूं:

docker-compose rm -f application nginx php

जैसा कि मैंने अपने प्रश्न में कहा था, मुझे नहीं पता कि यह सही प्रक्रिया है या नहीं। लेकिन यह हमारे उपयोग के मामले के लिए काम करता है, इसलिए जब तक हम एक बेहतर समाधान नहीं ढूंढ लेते हैं, तब तक हम इस के साथ रोल करेंगे।


क्या होगा यदि आप पिछले कंटेनर संस्करण में रोलबैक करना चाहते हैं? कुल्ला, दोहराना?
अस्सी के दशक में

1
यह कोशिश नहीं की है, लेकिन हाँ, मैं उतना ही मानता हूं। चूंकि कंटेनर संस्करण को docker-compose.yml (जैसे myimage: 2.0.1) में परिभाषित किया जाना चाहिए, यदि आप वापस रोल करना चाहते हैं तो आप docker-compose.yml को उस संस्करण में अपडेट करेंगे जिसे आप वापस रोल करना चाहते हैं (जैसे 2.0 .0) और एक ही कुल्ला दोहराने की प्रक्रिया को फिर से करें।
जेन्स वीगर

अगर मुझे वापस रोल करना है तो मैं कमिट कर दूंगा, डॉकटर हब का निर्माण कर दूंगा और उसके बाद अपडाउन करने वाले का इंतजार करूंगा। शायद सबसे विस्तृत प्रणाली नहीं है, लेकिन यह मेरे खाली समय की परियोजनाओं के लिए काम करता है।
Stephanlindauer

निकालें सब कुछ एक समाधान की तरह नहीं लगता है, लेकिन एक डॉगी की तरह अधिक है।
PierrickM

3

मैंने देखा है यह हमारे 7-8 docker उत्पादन प्रणाली में होता है। एक और समाधान जो मेरे लिए उत्पादन में काम करता था, वह था

docker-compose down
docker-compose up -d

यह कंटेनरों को हटाता है और नवीनतम छवि से 'अप' बनाने के लिए लगता है।

यह अभी तक प्रति परिवर्तित कंटेनर (क्रमिक रूप से कम समय) के प्रति मेरे डाउन + अप के सपने को हल नहीं करता है, लेकिन यह कंटेनरों को अपडेट करने के लिए 'ऊपर' को मजबूर करने के लिए काम करता है।


docker-compose downafaik चल रहे कंटेनरों से जुड़े किसी भी डेटा वॉल्यूम कंटेनर को भी हटा देता है। इसलिए कोई समस्या नहीं अगर डेटा वॉल्यूम में केवल सामान होता है जिसे एक चालू कंटेनर से फिर से बनाया जा सकता है। लेकिन आपको सावधान रहना चाहिए यदि वॉल्यूम में डेटा है जिसे आप रखना चाहते हैं।
जेन्स वीगर

1
downडिफ़ॉल्ट रूप से और वर्तमान डॉक्टर द्वारा हटा दिया जाता है: कंटेनर, नेटवर्क और डिफ़ॉल्ट नेटवर्क। डॉक का कहना है कि 'नेटवर्क और बाहरी के रूप में परिभाषित वॉल्यूम को कभी भी हटाया नहीं जाता है।' नामित संस्करणों के साथ मेरे लिए काम करता है (और मुझे लगता है कि नामांकित नेटवर्क के लिए भी सच है)।
आर्मिनफ्रो जूल

3

विकल्प downइस समस्या को हल करें

मैं अपनी रचना फ़ाइल चलाता हूँ:

docker-compose -f docker/docker-compose.yml up -d

फिर मैं सभी को हटा देता हूं down --rmi all

docker-compose -f docker/docker-compose.yml down --rmi all

Stops containers and removes containers, networks, volumes, and images
created by `up`.

By default, the only things removed are:

- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used

Networks and volumes defined as `external` are never removed.

Usage: down [options]

Options:
    --rmi type          Remove images. Type must be one of:
                        'all': Remove all images used by any service.
                        'local': Remove only images that don't have a custom tag
                        set by the `image` field.
    -v, --volumes       Remove named volumes declared in the `volumes` section
                        of the Compose file and anonymous volumes
                        attached to containers.
    --remove-orphans    Remove containers for services not defined in the
                        Compose file

3

मैंने इस समस्या के साथ आधा दिन बिताया। कारण यह था कि यह जाँचना सुनिश्चित करें कि वॉल्यूम कहाँ दर्ज किया गया था।

वॉल्यूम: - एपीआई-डेटा: / src / पैटर्न

लेकिन तथ्य यह है कि इस जगह में कोड था जिसे हमने बदल दिया। लेकिन डॉकटर को अपडेट करते समय, कोड नहीं बदला।

इसलिए, यदि आप किसी और के कोड की जांच कर रहे हैं और किसी कारण से आप अपडेट नहीं कर रहे हैं, तो यह जांचें।

और इसलिए सामान्य तौर पर यह दृष्टिकोण काम करता है:

docker- रचना करना

docker- रचना का निर्माण

docker-compose अप -d


0

'अप' कमांड के लिए डॉकटर-कंपोजिशन में स्पष्ट रूप से कहा गया है कि यह अपडेट करता है कि अंतिम 'अप' के प्रदर्शन के बाद से कंटेनर को छवि बदलनी चाहिए:

यदि किसी सेवा के लिए मौजूदा कंटेनर हैं, और कंटेनर के निर्माण के बाद सेवा के कॉन्फ़िगरेशन या छवि को बदल दिया गया था, तो डॉकटर-कंपोजर कंटेनरों को रोककर और पुन: निर्मित करके परिवर्तन को चुनता है (घुड़सवार संस्करणों को संरक्षित करता है)।

इसलिए 'स्टॉप' के बाद 'पुल' और उसके बाद 'अप' का उपयोग करके, इसलिए कंटेनर को चलाने वाले कंटेनरों के लिए खोए हुए संस्करणों के मुद्दों से बचना चाहिए, निश्चित रूप से, उन कंटेनरों के लिए जिनके चित्र अपडेट किए गए हैं।

मैं वर्तमान में इस प्रक्रिया के साथ प्रयोग कर रहा हूं और शीघ्र ही इस टिप्पणी में अपने परिणाम शामिल करूंगा।


यहां तक ​​कि सिर्फ
डॉक

0

यदि डॉक्यू कम्पोज़र एक फाइल में है, तो बस चलाएं:

docker-compose -f appName.yml down && docker-compose -f appName.yml pull && docker-compose -f appName.yml up -d


-3

मैं नवीनतम चित्र प्राप्त करने के लिए निम्नलिखित कमांड का उपयोग कर रहा हूं

sudo docker-compose down -rmi all

sudo docker-compose up -d

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