ডকার এন্ট্রিপয়েন্ট স্ক্রিপ্টগুলির জন্য সেট-ই এবং এক্সিকিউট "$ @" কি করে?


95

আমি লক্ষ্য করেছি যে ডকারের জন্য অনেক এন্ট্রিপয়েন্ট.শ স্ক্রিপ্টগুলি এরকম কিছু করে:

#!/bin/bash
set -e

... code ...

exec "$@"

কি কি set -eএবং exec "$@"জন্য?


4
দেখুন BashFAQ # 105 Re: কেন set -eঅনেক বেশী ত্রুটি-প্রবণ চেয়ে হাতে লেখা ত্রুটি পরিচালনা বিবেচনা করা হয়। (যদি তাড়াহুড়ো হয় তবে নীচের অনুশীলনগুলির জন্য শীর্ষে উপমাটি এড়িয়ে যান)।
চার্লস ডাফি

উত্তর:


71

এটি মূলত কোনও কমান্ড লাইন আর্গুমেন্ট গ্রহণ করে entrypoint.shএবং কমান্ড হিসাবে কার্যকর করে। উদ্দেশ্যটি মূলত "এই .sh স্ক্রিপ্টে সমস্ত করুন, তারপরে একই শেলটিতে ব্যবহারকারী কমান্ড লাইনে যে কমান্ডটি প্রেরণ করবে" তা চালাও।

দেখা:


4
এটিও নোট করুন exec "$@"যা বর্তমানে চলমান প্রক্রিয়াটি নতুন আবেদনের সাথে যুক্ত নতুন প্রক্রিয়াটির সাথে প্রতিস্থাপন করবে। ডকার সংকেত দেওয়ার জন্য গুরুত্বপূর্ণ: স্ট্যাকওভারফ্লো.com
হককি পার্কার

35

set -eকোনও কমান্ড চালানো হচ্ছে যদি শূন্য-বহির্গমন কোডের সাথে প্রস্থান হয় তবে অবিলম্বে প্রস্থান করতে শেল বিকল্প সেট করে। স্ক্রিপ্টটি ব্যর্থ কমান্ডের প্রস্থান কোড সহ ফিরে আসবে। বাশ ম্যান পৃষ্ঠা থেকে:

সেট-ই:

একটি পাইপলাইন (যা একটি সাধারণ কমান্ড সমন্বিত থাকতে পারে), একটি তালিকা, বা একটি যৌগিক কমান্ড (উপরে শেল গ্র্যামার দেখুন) অবিলম্বে প্রস্থান করুন, যদি শূন্য-শূন্য স্থিতি উপস্থিত হয়। শেলটি প্রস্থান করে না যদি কমান্ডটি ব্যর্থ হয় কমান্ড তালিকার সাথে সাথে কিছুক্ষণ পরে বা কীওয়ার্ড অবধি ব্যর্থ হয় তবে পরীক্ষার অংশ যদি নীচের অংশে বা এলিফ সংরক্ষিত শব্দের পরে থাকে, একটি && বা সম্পাদিত কোনও কমান্ডের অংশ || চূড়ান্ত && বা || এর পরে প্রাপ্ত কমান্ড ব্যতীত, পাইপলাইনে থাকা কোনও কমান্ড শেষ না হলেও, বা যদি কমান্ডের ফেরতের মান উল্টানো হচ্ছে! যদি সাব-শেল ব্যতীত অন্য কোনও যৌগিক কমান্ড একটি শূন্য-স্থিতি প্রত্যাবর্তন করে কারণ কোনও কমান্ড ব্যর্থ হওয়ার সময়-ই উপেক্ষা করা হত, শেলটি প্রস্থান করে না। ERR এ একটি ফাঁদ সেট করা থাকলে শেলটি বেরোনোর ​​আগেই সম্পাদিত হয়।

যৌগিক কমান্ড বা শেল ফাংশন যদি এমন একটি প্রেক্ষাপটে সঞ্চালিত হয় যেখানে -e উপেক্ষা করা হচ্ছে, যৌগ কমান্ড বা ফাংশন বডি-র মধ্যে নির্বাহ করা কমান্ডগুলির কোনওটিই -e সেটিং দ্বারা প্রভাবিত হবে না, এমনকি -e সেট করা থাকলেও এবং একটি আদেশ কমান্ড প্রদান করে ব্যর্থতা অবস্থা। কোনও যৌগিক কমান্ড বা শেল ফাংশন যদি সেটাকে নির্ধারণ করা হয় যেখানে এমন একটি প্রেক্ষাপটে নির্ধারণ করা হয় যেখানে -e উপেক্ষা করা হয়, তবে এই সেটিংটির কোনও কার্যকারিতা কার্যকর হবে না যতক্ষণ না যৌগিক কমান্ড বা ফাংশন কলযুক্ত কমান্ডটি সম্পূর্ণ না করে।


exec "$@"এন্ট্রিপয়েন্টটি সাধারণত পাস করার জন্য ব্যবহৃত হয় যা ডকার কমান্ডটি চালায়। এটি বর্তমান চলমান শেলটি "$@"প্রতি নির্দেশকারী কমান্ডের সাথে প্রতিস্থাপন করবে । ডিফল্টরূপে, সেই পরিবর্তনশীল কমান্ড লাইন আর্গুমেন্টের দিকে নির্দেশ করে।

এন্ট্রিপয়েন্ট.শকে নির্দেশ করে কোনও এন্ট্রিপয়েন্ট সহ যদি আপনার একটি চিত্র থাকে এবং আপনি আপনার ধারকটিকে docker run my_image server startএটি হিসাবে চালনা entrypoint.sh server startকরেন তবে এটি কনটেইনারটিতে চলমান রূপান্তরিত হবে । এক্সিকিউটিভ লাইনে entrypoint.sh, পিড 1 হিসাবে চলমান শেলটি কমান্ডের সাথে নিজেকে প্রতিস্থাপন করবে server start

এটি সংকেত পরিচালনার জন্য গুরুত্বপূর্ণ। ব্যবহার না করেই exec, server startউপরোক্ত উদাহরণে অন্য PID হিসাবে চালানো হবে, এবং এটা থেকে প্রস্থান পরে, আপনি আপনার শেল স্ক্রিপ্টে ফিরে আসবে। পিড 1-তে একটি শেলের সাথে, একটি সিগন্যর্ট ডিফল্টরূপে উপেক্ষা করা হবে। এর অর্থ হ'ল গ্রেফুল স্টপ সিগন্যাল যা docker stopআপনার ধারককে প্রেরণ করে, serverপ্রক্রিয়াটি কখনই গ্রহণ করবে না । 10 সেকেন্ড পরে (ডিফল্টরূপে), চমত্কার docker stopশাটডাউনটি ছেড়ে দেয় এবং এমন একটি সিগ্কিল প্রেরণ করে যা আপনার অ্যাপ্লিকেশনটিকে প্রস্থান করতে বাধ্য করবে, কিন্তু সম্ভাব্য ডেটা ক্ষতি বা বন্ধ নেটওয়ার্ক সংযোগের সাথে, অ্যাপ্লিকেশন বিকাশকারীরা যদি সংকেত পেয়ে থাকে তবে চারপাশে কোডিং করতে পারত। এর অর্থ হল আপনার ধারকটি সর্বদা থামতে 10 সেকেন্ড সময় নেয়।

মনে রাখবেন যে শেল কমান্ডগুলির মতো shiftএবং set --আপনি এর মান পরিবর্তন করতে পারেন "$@"। উদাহরণস্বরূপ, এখানে একটি স্ক্রিপ্টের একটি সংক্ষিপ্ত অংশ রয়েছে /bin/sh -c "..."যা কমান্ড থেকে সরিয়ে দেয় যা উপস্থিত হতে পারে যদি আপনি ডকারের শেল সিনট্যাক্স এর জন্য ব্যবহার করেন CMD:

# convert `/bin/sh -c "server start"` to `server start`
if [ $# -gt 1 ] && [ x"$1" = x"/bin/sh" ] && [ x"$2" = x"-c" ]; then
  shift 2
  eval "set -- $1"
fi

....

exec "$@"

4
দেখুন POSIX testবৈশিষ্ট , যা চিহ্ন -aলুপ্তপ্রায়। [ "$#" -gt 1 ] && [ "$1" = /bin/sh ]সঠিক প্রতিস্থাপন ( x"$1"কেবলমাত্র অপ্রচলিত সিনট্যাক্স ব্যবহার করার সময় হ্যাকারিটির কোনও প্রয়োজন নেই )।
চার্লস ডাফি

এছাড়াও, স্ট্রিংটিকে shift 2; set -- $1কীভাবে evalবিশ্লেষণ করবে তা মোটেও একই নয় । বিবেচনা করুন /bin/sh -c 'printf "%s\n" "hello world" "goodbye world"', যদি আপনি কোনও কংক্রিট পরীক্ষার কেস চান, এবং দেখুন স্ট্রিংকে আর্গুমেন্টে রূপান্তর করার সময় বাশ উদ্ধৃতিগুলি পার্স করে না
চার্লস ডাফি

অচল বিকল্পের টিপসটির জন্য @ চার্লস ডফি ধন্যবাদ, আমি নিশ্চিত যে আমি আবার এই ভুলটি করব, পুরানো অভ্যাসগুলি কঠোরভাবে মারা যায়। এর সাথে eval, আমি বিশ্বাস করি যে আমি এখনও চাই যে /bin/sh -cস্ট্রিংয়ের সাথে তার আচরণের প্রতিচ্ছবি তৈরি করতে চাই তবে দয়া করে আমাকে কিছু অনুপস্থিত থাকলে তা আমাকে জানান।
বিএমচি

30

set -e - যদি কোনও কমান্ড ব্যর্থ হয় তবে স্ক্রিপ্ট থেকে প্রস্থান করুন (শূন্য নয়)

exec "$@"- ইনপুট ভেরিয়েবলগুলি পুনর্নির্দেশ করবে, আরও এখানে দেখুন


"ইনপুট ভেরিয়েবলগুলি পুনর্নির্দেশ করবে"? এহ? execঅবশ্যই এটি ব্যবহারের মোডে রয়েছে যেখানে এটি পুনর্নির্দেশগুলি সম্পাদন করে, তবে এটি সেই মোড নয়।
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.