मैं Amazon ECS कार्यों के लिए अद्यतन किए गए डॉकरों के चित्र कैसे तैनात करूं?


110

मेरे अमेज़ॅन ईसीएस कार्यों को अपनी डॉकर छवियों को अपडेट करने के लिए सही दृष्टिकोण क्या है , एक बार कहा छवियों को इसी रजिस्ट्री में अपडेट किया गया है?


मैं एक स्वचालित / अनुसूचित लैम्बडा फ़ंक्शन चलाने की सलाह दूंगा। इस तरह यह उदाहरण के बाहर है। क्या आपने कोशिश की है? आप SWF का उपयोग एक समय में करने के लिए भी कर सकते हैं
iSkore

मुझे इसे @iSkore को स्वचालित करने की आवश्यकता नहीं है। मैं अंततः इसके लिए एक स्क्रिप्ट लिखना चाहता हूं, लेकिन इसे चलाने के लिए खुद को चुनें।
एकन्यूड्स 1

आहह गच्चा। उस पर यकीन नहीं था। क्या आप थोड़ी और जानकारी प्रदान कर सकते हैं?
i

@iSkore मुझे नहीं पता कि मैं पहले से किए गए किसी भी बेहतर तरीके से इसका वर्णन कैसे कर सकता हूं। प्रक्रिया है: 1. रजिस्ट्री के लिए डॉकर छवि का नया संस्करण पुश करें। 2. ईसीएस में नए छवि संस्करण को तैनात करें। प्रश्न उत्तरार्द्ध को कैसे लागू किया जाए।
एकन्यूड्स १

यह ईकेएस के साथ आसान या स्पष्ट नहीं है..किसी भी क्लस्टर का उपयोग करने का सबसे आम काम है, एक नई छवि को तैनात करना, इसलिए प्रलेखन में अस्पष्ट है?

जवाबों:


88

यदि आपका कार्य किसी सेवा के अंतर्गत चल रहा है, तो आप नई तैनाती के लिए बाध्य कर सकते हैं। यह कार्य परिभाषा को पुनर्मूल्यांकन करने के लिए मजबूर करता है और नई कंटेनर छवि को खींचा जाता है।

aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment

1
मुझे लगता है कि यह काम करने के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि आपके ईसीएस उदाहरणों पर एक ही आकार का एक अतिरिक्त कार्य तैनात करने के लिए पर्याप्त संसाधन हैं। मुझे लगता है कि AWS अनिवार्य रूप से एक हॉटस्पैप करने की कोशिश करता है, पुराने टास्क को समाप्त करने से पहले एक नए टास्क इंस्टेंस को प्री-बूट किया जाता है। यदि आप नहीं करते हैं तो यह केवल 0 रनिंग इंस्टेंस के साथ "तैनाती" प्रविष्टियों को जोड़ता रहता है।
एलेक्स फेडुलोव

3
@AlexFedulov, हाँ, मुझे लगता है कि आप सही हैं। एक नई तैनाती बनाते समय डाउनटाइम न लगाने के लिए आप 1) पुराने संस्करण के साथ नए संस्करण को तैनात करने के लिए पर्याप्त उदाहरणों का प्रावधान कर सकते हैं। यह ऑटोसैसलिंग के साथ प्राप्त किया जा सकता है। 2) फ़ार्गेट परिनियोजन प्रकार का उपयोग करें। आप ECS को नई तैनाती से पहले अपनी पुरानी सेवा को हटाने की अनुमति देने के लिए सेवा के "न्यूनतम स्वस्थ प्रतिशत" पैरामीटर को 0 पर सेट करके अतिरिक्त संसाधनों को आवंटित करने से बच सकते हैं। यह हालांकि कुछ डाउनटाइम को बढ़ाएगा।
दिमा

3
अज्ञात विकल्प:
प्रवर्तन

1
अज्ञात विकल्प:
काइल

1
मैं इस आदेश की कोशिश की, यह नई छवि के साथ कंटेनर को अद्यतन नहीं करता है, यह एक ही पुरानी छवि के साथ एक और कंटेनर तक घूमता है। इसलिए मैं सेवा में रहते हुए भी दो कंटेनरों को समाप्त कर रहा हूं, जिनमें वांछित संख्या = 1 है
मैथ्स

61

हर बार जब आप (के माध्यम से या तो कार्य प्रारंभ करें StartTaskऔर RunTaskAPI कॉल या कि एक सेवा के भाग के रूप में स्वचालित रूप से शुरू कर दिया गया है), ईसीएस एजेंट एक प्रदर्शन करेंगे docker pullकी imageअपने कार्य परिभाषा में निर्दिष्ट आप। यदि आप प्रत्येक बार रजिस्ट्री पर धकेलने के लिए एक ही छवि नाम (टैग सहित) का उपयोग करते हैं, तो आपको एक नया कार्य चलाने में नई छवि चलाने में सक्षम होना चाहिए। ध्यान दें कि यदि डॉकर किसी भी कारण से रजिस्ट्री तक नहीं पहुंच सकता है (उदाहरण के लिए, नेटवर्क समस्याएं या प्रमाणीकरण मुद्दे), तो ईसीएस एजेंट एक कैश्ड छवि का उपयोग करने का प्रयास करेगा; अगर आप अपनी छवि को अपडेट करने के दौरान कैश्ड छवियों के उपयोग से बचना चाहते हैं, तो आप हर बार अपनी रजिस्ट्री में एक अलग टैग डालना चाहते हैं और नए कार्य को चलाने से पहले अपनी कार्य परिभाषा को अपडेट कर सकते हैं।

अद्यतन: इस व्यवहार को अब ECS_IMAGE_PULL_BEHAVIORECS एजेंट पर सेट पर्यावरण चर के माध्यम से देखा जा सकता है । देखें प्रलेखन जानकारी के लिए। लेखन के समय के अनुसार, निम्नलिखित सेटिंग्स समर्थित हैं:

आपके कंटेनर इंस्टेंस के लिए पुल छवि प्रक्रिया को अनुकूलित करने के लिए उपयोग किया जाने वाला व्यवहार। निम्नलिखित वैकल्पिक व्यवहारों का वर्णन करता है:

  • यदि defaultनिर्दिष्ट किया गया है, तो छवि को दूरस्थ रूप से खींच लिया गया है। यदि छवि पुल विफल हो जाता है, तो कंटेनर उदाहरण पर कैश्ड छवि का उपयोग करता है।

  • यदि alwaysनिर्दिष्ट किया गया है, तो छवि को हमेशा दूर से खींचा जाता है। यदि छवि पुल विफल हो जाता है, तो कार्य विफल हो जाता है। यह विकल्प यह सुनिश्चित करता है कि छवि का नवीनतम संस्करण हमेशा खींचा जाए। किसी भी कैश्ड चित्र को अनदेखा किया जाता है और स्वचालित छवि सफाई प्रक्रिया के अधीन होता है।

  • यदि onceनिर्दिष्ट किया गया है, तो छवि को केवल दूरस्थ रूप से खींचा जाता है यदि यह उसी कंटेनर उदाहरण पर पिछले कार्य द्वारा खींचा नहीं गया है या यदि कैश की गई छवि को स्वचालित छवि सफाई प्रक्रिया द्वारा हटा दिया गया था। अन्यथा, उदाहरण पर कैश्ड छवि का उपयोग किया जाता है। यह सुनिश्चित करता है कि कोई अनावश्यक छवि नहीं खींची जाती है।

  • यदि prefer-cachedनिर्दिष्ट किया गया है, तो कोई कैश की गई छवि नहीं होने पर छवि को दूरस्थ रूप से खींच लिया जाता है। अन्यथा, उदाहरण पर कैश्ड छवि का उपयोग किया जाता है। कैश्ड छवि को हटाया नहीं जाता है यह सुनिश्चित करने के लिए कंटेनर के लिए स्वचालित छवि सफाई अक्षम है।


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

1
हां, वर्तमान व्यवहार यह है कि यह हर बार एक पुल का प्रयास करेगा। यदि पुल विफल हो जाता है (नेटवर्क समस्याएं, अनुमतियों की कमी आदि), तो यह कैश्ड छवि का उपयोग करने का प्रयास करेगा। आप एजेंट लॉग फ़ाइलों में अधिक जानकारी पा सकते हैं जो आमतौर पर हैं /var/log/ecs
सैमुअल कार्प

26

नई कार्य परिभाषा दर्ज करना और नई कार्य परिभाषा का उपयोग करने के लिए सेवा को अपडेट करना AWS द्वारा अनुशंसित दृष्टिकोण है। इसके लिए सबसे आसान तरीका है:

  1. टास्क परिभाषाओं पर नेविगेट करें
  2. सही कार्य का चयन करें
  3. नया संशोधन बनाएँ चुनें
  4. यदि आप पहले से ही कंटेनर छवि के नवीनतम संस्करण को खींच रहे हैं जैसे: नवीनतम टैग, तो बस क्रिएट पर क्लिक करें। अन्यथा, कंटेनर छवि का संस्करण नंबर अपडेट करें और फिर बनाएं पर क्लिक करें।
  5. क्रियाओं का विस्तार करें
  6. अपडेट सेवा (दो बार) चुनें
  7. फिर सेवा के फिर से शुरू होने की प्रतीक्षा करें

इस ट्यूटोरियल में अधिक विवरण है और बताता है कि उपरोक्त चरण एंड-टू-एंड उत्पाद विकास प्रक्रिया में कैसे फिट होते हैं।

पूर्ण प्रकटीकरण: इस ट्यूटोरियल में बिटनामी के कंटेनर हैं और मैं बिटनामी के लिए काम करता हूं। हालाँकि यहाँ व्यक्त विचार मेरे अपने हैं और बिटनामी के मत नहीं।


3
यह काम करता है, लेकिन आपको अपनी सेवा मिनट / अधिकतम मान को बदलना पड़ सकता है। यदि आपके पास केवल एक ईसी 2 उदाहरण है, तो आपको शून्य को न्यूनतम स्वस्थ प्रतिशत निर्धारित करना होगा, अन्यथा यह अद्यतन कंटेनर को तैनात करने के लिए कार्य (आपकी सेवा को अस्थायी रूप से ऑफ़लाइन बनाने) को कभी नहीं मारेगा।
माल्विनस

3
@ मालविनस गुड पॉइंट! में ट्यूटोरियल के ईसीएस सेटअप अनुभाग में, मैं वास्तव में वर्णन करते हैं। उस अनुभाग से अनुशंसित कॉन्फ़िगरेशन यहां दी गई है: कार्य की संख्या - 1, न्यूनतम स्वस्थ प्रतिशत - 0, अधिकतम प्रतिशत - 200.
नील

@ नील मैंने आपके दृष्टिकोण की कोशिश की जैसा कि यहां कहा गया है ... अभी भी कोई खुशी नहीं है
हाफिज

@ हाफ़िज़ यदि आपको यह पता लगाने में सहायता की आवश्यकता है, तो आपको यह वर्णन करना चाहिए कि आपको कितनी दूर और किस त्रुटि के कारण चोट लगी है।
नील

यह केवल सेवाओं के लिए काम करता है, सेवाओं के बिना काम नहीं करता है।
zaitsman

8

इसे करने के दो तरीके हैं।

सबसे पहले, AWS CodeDeploy का उपयोग करें। आप ECS सेवा परिभाषा में ब्लू / ग्रीन परिनियोजन अनुभागों को कॉन्फ़िगर कर सकते हैं। इसमें एक CodeDeployRoleForECS, स्विच के लिए एक और TargetGroup और एक परीक्षण श्रोता (वैकल्पिक) शामिल हैं। AWS ECS CodeDeploy एप्लिकेशन और परिनियोजन समूह बनाएगा और आपके लिए इन ECS क्लस्टर / सेवा और आपके ELB / TargetGroups के साथ इन CodeDeploy संसाधनों को लिंक करेगा। तब आप एक परिनियोजन आरंभ करने के लिए CodeDeploy का उपयोग कर सकते हैं, जिसमें आपको एक AppSpec दर्ज करने की आवश्यकता होती है जो निर्दिष्ट करता है कि किस सेवा / कंटेनर को किस सेवा को अपडेट करने के लिए उपयोग किया जाए। यहां आप अपने नए कार्य / कंटेनर को निर्दिष्ट करते हैं। फिर, आप देखेंगे कि नए टारगेट को नए टारगेटग्रुप में स्पिन किया गया है और पुराने टारगेटग्रुप को एलएलबी में काट दिया गया है, और जल्द ही पुराने टारगेटग्रुप में पंजीकृत पुराने इंस्टेंसेस को समाप्त कर दिया जाएगा।

यह बहुत जटिल लगता है। वास्तव में, चूंकि / यदि आपने अपनी ईसीएस सेवा पर ऑटो स्केलिंग सक्षम की है, तो ऐसा करने का एक सरल तरीका यह है कि कंसोल या क्ली का उपयोग करके एक नई तैनाती को मजबूर करना है, जैसे एक सज्जन ने यहां बताया है:

aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment

इस तरह आप अभी भी "रोलिंग अपडेट" परिनियोजन प्रकार का उपयोग कर सकते हैं, और ईसीएस बस नए उदाहरणों को स्पिन करेगा और सब कुछ ठीक होने पर आपकी सेवा के बिना डाउनटाइम वाले पुराने को सूखा देगा। खराब पक्ष यह है कि आप परिनियोजन पर ठीक से नियंत्रण खो देते हैं और त्रुटि होने पर पिछले संस्करण में वापस नहीं लौटते हैं और इससे जारी सेवा टूट जाएगी। लेकिन यह एक बहुत ही सरल तरीका है।

BTW, न्यूनतम स्वस्थ प्रतिशत और अधिकतम प्रतिशत, जैसे 100 और 200 के लिए उचित संख्या निर्धारित करना न भूलें।


क्या आईपी को बदले बिना ऐसा करने का कोई तरीका है? जब मैंने इसे चलाया तो मेरा काम हुआ लेकिन इसने मेरे द्वारा
चलाए जा

@Migdotcom मैं एक समान मुद्दा था जब एक प्रॉक्सी NLB की जरूरत थी। संक्षेप में ईसी 2 उदाहरण आईपी रखने का एकमात्र तरीका लोचदार आईपी पते का उपयोग करना है या एक अलग दृष्टिकोण का उपयोग करना है। मुझे आपके उपयोग के मामले की जानकारी नहीं है, लेकिन ग्लोबल एक्सेलेरेटर को ECS से लिंक करने से जुड़े ALB ने मुझे स्थैतिक आईपी पते प्रदान किए, इस उपयोग के मामले को हल किया। यदि आप गतिशील आंतरिक IP जानना चाहते हैं, तो आपको ALB की लंबोदर के साथ क्वेरी करनी होगी। यह बहुत प्रयास था। नीचे लिंक: aws.amazon.com/blogs/networking-and-content-delivery/…
मार्कस

aws ecs अद्यतन-सेवा - क्लस्टर <क्लस्टर नाम> - सेवा <सेवा नाम> - प्रवर्तन-नई-तैनाती मेरे लिए काम करती है!
gvasquez

3

मैंने अद्यतन डॉकरों की छवियों को ईसीएस पर एक मचान सेवा में तैनात करने के लिए एक स्क्रिप्ट बनाई , ताकि संबंधित कार्य परिभाषा डोकर छवियों के वर्तमान संस्करणों को संदर्भित करे। मुझे यकीन नहीं है कि अगर मैं सर्वोत्तम प्रथाओं का पालन कर रहा हूं, तो प्रतिक्रिया का स्वागत किया जाएगा।

काम करने के लिए स्क्रिप्ट के लिए, आपको या तो एक अतिरिक्त ईसीएस उदाहरण या एक deploymentConfiguration.minimumHealthyPercentमूल्य की आवश्यकता है ताकि ईसीएस अपडेट की गई परिभाषा को तैनात करने के लिए एक उदाहरण चोरी कर सके।

मेरा एल्गोरिथ्म इस तरह है:

  1. Git संशोधन के साथ टास्क डेफिनिशन में कंटेनरों के अनुरूप टैग डॉकर छवियां।
  2. Docker छवि टैग को संबंधित रजिस्ट्रियों में पुश करें।
  3. कार्य परिभाषा परिवार में डेरेगिस्टर पुरानी कार्य परिभाषाएँ।
  4. नई कार्य परिभाषा को पंजीकृत करें, अब वर्तमान Git संशोधनों के साथ टैग की गई Docker छवियों का जिक्र है।
  5. नई कार्य परिभाषा का उपयोग करने के लिए सेवा अद्यतन करें।

मेरा कोड नीचे चिपकाया गया:

तैनाती-ईसीएस

#!/usr/bin/env python3
import subprocess
import sys
import os.path
import json
import re
import argparse
import tempfile

_root_dir = os.path.abspath(os.path.normpath(os.path.dirname(__file__)))
sys.path.insert(0, _root_dir)
from _common import *


def _run_ecs_command(args):
    run_command(['aws', 'ecs', ] + args)


def _get_ecs_output(args):
    return json.loads(run_command(['aws', 'ecs', ] + args, return_stdout=True))


def _tag_image(tag, qualified_image_name, purge):
    log_info('Tagging image \'{}\' as \'{}\'...'.format(
        qualified_image_name, tag))
    log_info('Pulling image from registry in order to tag...')
    run_command(
        ['docker', 'pull', qualified_image_name], capture_stdout=False)
    run_command(['docker', 'tag', '-f', qualified_image_name, '{}:{}'.format(
        qualified_image_name, tag), ])
    log_info('Pushing image tag to registry...')
    run_command(['docker', 'push', '{}:{}'.format(
        qualified_image_name, tag), ], capture_stdout=False)
    if purge:
        log_info('Deleting pulled image...')
        run_command(
            ['docker', 'rmi', '{}:latest'.format(qualified_image_name), ])
        run_command(
            ['docker', 'rmi', '{}:{}'.format(qualified_image_name, tag), ])


def _register_task_definition(task_definition_fpath, purge):
    with open(task_definition_fpath, 'rt') as f:
        task_definition = json.loads(f.read())

    task_family = task_definition['family']

    tag = run_command([
        'git', 'rev-parse', '--short', 'HEAD', ], return_stdout=True).strip()
    for container_def in task_definition['containerDefinitions']:
        image_name = container_def['image']
        _tag_image(tag, image_name, purge)
        container_def['image'] = '{}:{}'.format(image_name, tag)

    log_info('Finding existing task definitions of family \'{}\'...'.format(
        task_family
    ))
    existing_task_definitions = _get_ecs_output(['list-task-definitions', ])[
        'taskDefinitionArns']
    for existing_task_definition in [
        td for td in existing_task_definitions if re.match(
            r'arn:aws:ecs+:[^:]+:[^:]+:task-definition/{}:\d+'.format(
                task_family),
            td)]:
        log_info('Deregistering task definition \'{}\'...'.format(
            existing_task_definition))
        _run_ecs_command([
            'deregister-task-definition', '--task-definition',
            existing_task_definition, ])

    with tempfile.NamedTemporaryFile(mode='wt', suffix='.json') as f:
        task_def_str = json.dumps(task_definition)
        f.write(task_def_str)
        f.flush()
        log_info('Registering task definition...')
        result = _get_ecs_output([
            'register-task-definition',
            '--cli-input-json', 'file://{}'.format(f.name),
        ])

    return '{}:{}'.format(task_family, result['taskDefinition']['revision'])


def _update_service(service_fpath, task_def_name):
    with open(service_fpath, 'rt') as f:
        service_config = json.loads(f.read())
    services = _get_ecs_output(['list-services', ])[
        'serviceArns']
    for service in [s for s in services if re.match(
        r'arn:aws:ecs:[^:]+:[^:]+:service/{}'.format(
            service_config['serviceName']),
        s
    )]:
        log_info('Updating service with new task definition...')
        _run_ecs_command([
            'update-service', '--service', service,
            '--task-definition', task_def_name,
        ])


parser = argparse.ArgumentParser(
    description="""Deploy latest Docker image to staging server.
The task definition file is used as the task definition, whereas
the service file is used to configure the service.
""")
parser.add_argument(
    'task_definition_file', help='Your task definition JSON file')
parser.add_argument('service_file', help='Your service JSON file')
parser.add_argument(
    '--purge_image', action='store_true', default=False,
    help='Purge Docker image after tagging?')
args = parser.parse_args()

task_definition_file = os.path.abspath(args.task_definition_file)
service_file = os.path.abspath(args.service_file)

os.chdir(_root_dir)

task_def_name = _register_task_definition(
    task_definition_file, args.purge_image)
_update_service(service_file, task_def_name)

_common.py

import sys
import subprocess


__all__ = ['log_info', 'handle_error', 'run_command', ]


def log_info(msg):
    sys.stdout.write('* {}\n'.format(msg))
    sys.stdout.flush()


def handle_error(msg):
    sys.stderr.write('* {}\n'.format(msg))
    sys.exit(1)


def run_command(
        command, ignore_error=False, return_stdout=False, capture_stdout=True):
    if not isinstance(command, (list, tuple)):
        command = [command, ]
    command_str = ' '.join(command)
    log_info('Running command {}'.format(command_str))
    try:
        if capture_stdout:
            stdout = subprocess.check_output(command)
        else:
            subprocess.check_call(command)
            stdout = None
    except subprocess.CalledProcessError as err:
        if not ignore_error:
            handle_error('Command failed: {}'.format(err))
    else:
        return stdout.decode() if return_stdout else None

@Andris धन्यवाद, तय।
एकन्यूड्स 1

5
यह ओवरकिल है। टेराफॉर्म या सिर्फ सिंगल ईकल्स-क्ली लाइन के माध्यम से तैनात करना संभव होना चाहिए।
Holms

@ Ems टास्क इमेज को अपडेट करने के लिए मैं Terraform का उपयोग कर रहा हूं। यह उपरोक्त अजगर-कोड के रूप में ओवरकिल है। आवश्यक कदम उतने ही जटिल हैं।
जरी तुर्किया

3

AWS कोडपिपलाइन।

आप ईसीआर को एक स्रोत के रूप में, और ईसीएस को एक लक्ष्य के रूप में निर्धारित कर सकते हैं।


2
क्या आप इसके लिए किसी दस्तावेज से जुड़ सकते हैं?
बेनडॉग

1

मेरे लिए काम के मामले में बाद में docker की इमेज टैग समान है:

  1. क्लस्टर और सेवा पर जाएं।
  2. सेवा का चयन करें और अद्यतन पर क्लिक करें।
  3. 0 के रूप में कार्यों की संख्या निर्धारित करें और अपडेट करें।
  4. परिनियोजन समाप्त होने के बाद, कार्यों की संख्या को फिर से 1 पर ले जाएं।

1

एक ही मुद्दे में भाग गया। घंटों बिताने के बाद, अद्यतन छवि की स्वचालित तैनाती के लिए इन सरलीकृत चरणों का निष्कर्ष निकाला है:

1.ECS कार्य परिभाषा में परिवर्तन: एक बेहतर समझ के लिए, मान लें कि आपने नीचे विवरण के साथ एक कार्य परिभाषा बनाई है (ध्यान दें: ये संख्या आपके कार्य परिभाषा के अनुसार बदल जाएगी):

launch_type = EC2

desired_count = 1

फिर आपको निम्नलिखित परिवर्तन करने की आवश्यकता है:

deployment_minimum_healthy_percent = 0  //this does the trick, if not set to zero the force deployment wont happen as ECS won't allow to stop the current running task

deployment_maximum_percent = 200  //for allowing rolling update

2. अपनी छवि को < अपनी छवि-नाम>: नवीनतम के रूप में रखें । नवीनतम कुंजी संबंधित ईसीएस कार्य द्वारा खींचे जाने का ख्याल रखती है।

sudo docker build -t imageX:master .   //build your image with some tag
sudo -s eval $(aws ecr get-login --no-include-email --region us-east-1)  //login to ECR
sudo docker tag imageX:master <your_account_id>.dkr.ecr.us-east-1.amazonaws.com/<your-image-name>:latest    //tag your image with latest tag

3. छवि को ECR में रखें

sudo docker push  <your_account_id>.dkr.ecr.us-east-1.amazonaws.com/<your-image-name>:latest

4. पूरी तरह से तैनाती

sudo aws ecs update-service --cluster <your-cluster-name> --service <your-service-name> --force-new-deployment --region us-east-1

नोट: मैंने सभी आदेशों को इस क्षेत्र को हम-पूरब -1 मानकर लिखा है । लागू करते समय इसे अपने संबंधित क्षेत्र से बदल दें।


मैंने देखा कि पैरामीटर टेराफ़ॉर्म पैरामीटर हैं; CloudFormation के लिए समान विचार प्राप्त करने के लिए कोई भी विचार: मेरे पास मेरा AutoScalingGroup MinSize: 0 और MaxS: 1 है; और क्या सेट करने की आवश्यकता है?
वेन

0

AWS cli का उपयोग करके मैंने ऊपर दिए गए सुझाव के अनुसार अपडेट-सेवा की कोशिश की। ईसीआर से नवीनतम डॉकटर नहीं उठाए। अंत में, मैंने अपनी एन्सिबल प्लेबुक को फिर से चलाया जो कि ECS क्लस्टर बनाया। जब ecs_taskdefinition चलता है, तो कार्य परिभाषा का संस्करण टकरा जाता है। फिर सब अच्छा है। नई डॉकटर छवि को उठाया जाता है।

सत्यता से यह सुनिश्चित नहीं होता है कि टास्क वर्जन में बदलाव के कारण रिडाइपल बाध्य हो जाता है, या यदि ecs_service का उपयोग करने वाली प्लेबुक कार्य को पुनः लोड करने का कारण बनती है।

अगर किसी को दिलचस्पी है, तो मुझे अपनी प्लेबुक के एक संचित संस्करण को प्रकाशित करने की अनुमति मिल जाएगी।


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

0

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


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