2015-07-17 26 views
16

के साथ स्वचालित रूप से तैनाती करना मैं नवीनतम डॉकर छवि के साथ अपना ईसीएस सेवा लॉन्च करके अपने आवेदन की तैनाती को स्वचालित करना चाहता हूं।ईसीएस सेवा - नई डॉकर छवि

  1. एक नया कार्य संशोधन बनाएँ (अपने डोकर भंडार पर छवि को अद्यतन करने के बाद): मैं क्या पढ़ा है से, इस प्रकार है जिस तरह से एक नई छवि संस्करण को तैनात करने की है।
  2. सेवा अद्यतन करें और नया संशोधन निर्दिष्ट करें।

ऐसा लगता है, लेकिन मैं इसे सीएलआई के माध्यम से करना चाहता हूं ताकि मैं इसे स्क्रिप्ट कर सकूं। # 2 update-service के साथ एडब्ल्यूएस सीएलआई के माध्यम से करने के लिए काफी आसान लगता है, लेकिन मुझे register-task-definition के साथ पूरे कार्य JSON को फिर से निर्दिष्ट किए बिना # 1 करने का कोई तरीका नहीं दिख रहा है (मेरे JSON में पर्यावरण चर में प्रमाण-पत्र शामिल होंगे, इसलिए मैं जितना संभव हो सके उतने स्थानों में रखना चाहते हैं)।

क्या यह है कि मुझे अपने ईसीएस सेवा अपडेट की तैनाती को स्वचालित करना चाहिए? और यदि हां, तो क्या कार्य परिभाषा एक नया संशोधन शुरू करने का एक "अच्छा" तरीका है (यानी सबकुछ डुप्लिकेट किए बिना)?

+2

इस पर चाल यह है कि 'वर्णन-कार्य-परिभाषा' में आपकी मूल कार्य परिभाषा _containerDefinitions_ कुंजी के साथ होगी। मुझे एक नई परिभाषा पंजीकृत करने के लिए 'पंजीकरण-कार्य-परिभाषा' चलाने के बाद इसे संशोधित करने में सफलता मिली है। यदि आप एनएनवी के बारे में चिंतित हैं, तो सबसे आसान समाधान गैर-बैश एसडीके में से एक का उपयोग करना है। –

उत्तर

12

हां, यह सही दृष्टिकोण है।

और नहीं, वर्तमान एपीआई के साथ, आप डुप्लिकेट किए बिना मौजूदा कार्य परिभाषा का एक नया संशोधन पंजीकृत नहीं कर सकते हैं।

आप CLI का उपयोग नहीं हुआ है मूल कार्य परिभाषा उत्पन्न करने के लिए (या मूल आदेशों कि यह उत्पन्न पुन: उपयोग नहीं करना चाहते हैं), तो आपको CLI के माध्यम से निम्नलिखित की तरह कुछ की कोशिश कर सकते:

OLD_TASK_DEF=$(aws ecs describe-task-definition --task-definition <task_family_name>) 
NEW_CONTAINER_DEFS=$(echo $OLD_TASK_DEF | jq '.taskDefinition.containerDefinitions' | jq '.[0].image="<new_image_name>"') 
aws ecs register-task-definition --family <task_family_name> --container-definitions "'$(echo $NEW_CONTAINER_DEFS)'" 

अंतिम कमांड के --container-defintions तर्क (जिसमें "environment" प्रविष्टियां शामिल हैं) के रूप में 100% सुरक्षित नहीं है, फिर भी ps जैसी प्रक्रियाओं के माध्यम से दिखाई देगी। एडब्ल्यूएस एसडीके में से एक दिमाग की बेहतर शांति प्रदान करेगा।

+0

आपको वॉल्यूम्स जैसे अन्य अनुभागों की भी आवश्यकता हो सकती है। बस इसे पार्स करने के लिए jq का उपयोग करें, फिर विकल्पों को शामिल करें (उदा। - वॉल्यूम्स VOLUMES_DEF) को 'रजिस्टर-कार्य-परिभाषा' –

4

मैट Callanan द्वारा प्रदान की जवाब मेरे लिए काम नहीं किया: मैं इस ओर से कोई त्रुटि प्राप्त: '--container-परिभाषाओं' पैरामीटर पार्स करने में त्रुटि:

--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'" 

के परिणामस्वरूप अपेक्षित: '=' , प्राप्त: {पर्यावरण: '

इनपुट के लिए': '' [{आदि आदि ....

मैं क्या हल करने में था:

TASK_FAMILY=<task familiy name> 
DOCKER_IMAGE=<new_image_name> 
LATEST_TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${TASK_FAMILY}) 

echo $LATEST_TASK_DEFINITION \ 
    | jq '{containerDefinitions: .taskDefinition.containerDefinitions, volumes: .taskDefinition.volumes}' \ 
    | jq '.containerDefinitions[0].image='\"${DOCKER_IMAGE}\" \ 
    > /tmp/tmp.json 

aws ecs register-task-definition --family ${TASK_FAMILY} --cli-input-json file:///tmp/tmp.json 

मैं दोनों कंटेनर परिभाषाएं लेता हूं और मूल जेसन दस्तावेज़ से तत्वों को वॉल्यूम करता हूं, क्योंकि मेरा कंटेनर डिफिनिशन इन वॉल्यूम्स का उपयोग करता है (इसलिए यदि आप वॉल्यूम्स का उपयोग नहीं करते हैं तो इसकी आवश्यकता नहीं है)।

संबंधित मुद्दे