সিআই এর সাথে ডকার-রচনা ব্যবহার করে - প্রস্থান কোড এবং ডিমনাইজড লিঙ্কযুক্ত পাত্রে কীভাবে মোকাবেলা করবেন?


90

এখনই আমাদের জেনকিনস এজেন্টরা আমাদের প্রতিটি রেল প্রকল্পের জন্য একটি ডকার-কমপোজ.আইএমএল তৈরি করে এবং তারপরে ডকার-কমপোজ চালায় run ডকার-কমপোজ.আইএমএল এর একটি প্রধান "ওয়েব" ধারক রয়েছে যার মধ্যে rbenv রয়েছে এবং আমাদের অন্যান্য সমস্ত রেলের উপর নির্ভরশীলতা রয়েছে। এটি এমন একটি ডিবি কন্টেইনারের সাথে লিঙ্কযুক্ত যাতে টেস্ট পোস্টগ্রিস ডিবি থাকে।

সমস্যাটি তখনই ঘটে যখন আমাদের প্রকৃতপক্ষে পরীক্ষা চালানো এবং প্রস্থান কোডগুলি তৈরি করা দরকার। আমাদের সিআই সার্ভার কেবলমাত্র পরীক্ষার স্ক্রিপ্ট 0 থেকে প্রস্থান করার সময় মোতায়েন করবে তবে কনটেইনার আদেশগুলির মধ্যে একটি ব্যর্থ হলেও ডকার-কমপোজ সর্বদা 0 প্রদান করে।

অন্যান্য সমস্যাটি হ'ল ডিবি কনটেইনার অনির্দিষ্টকালের জন্য চলবে, এমনকি ওয়েব কন্টেইনারগুলি পরীক্ষা চালানোর পরেও docker-compose upকখনই ফিরে আসে না।

এই প্রক্রিয়াটির জন্য আমরা কীভাবে কোনও ডকার-রচনা ব্যবহার করতে পারি? আমাদের পাত্রে চালাতে সক্ষম হতে হবে তবে ওয়েব ধারকটি সম্পূর্ণ হয়ে গেলে প্রস্থান করুন এবং এর প্রস্থান কোডটি ফিরিয়ে দিন। এই মুহুর্তে আমরা ডিবি ধারককে স্পিন করতে এবং --link বিকল্পের সাহায্যে ওয়েব ধারকটি চালানোর জন্য ডকার ব্যবহার করে ম্যানুয়ালি আটকে রয়েছি।

উত্তর:


78

সংস্করণ থেকে 1.12.0, আপনি --exit-code-fromবিকল্পটি ব্যবহার করতে পারেন ।

ডকুমেন্টেশন থেকে :

- এক্সেরিট-কোড থেকে SERVICE

নির্বাচিত পরিষেবা ধারকটির প্রস্থান কোডটি ফেরত দিন। প্রযোজ্য - স্থানে-কনটেইনার-প্রস্থান


4
আপনি যদি docker-compose1.12.0 বা তার বেশি ব্যবহার করে থাকেন তবে এটি করার সঠিক উপায় হওয়া উচিত । সম্ভবত এটি আপনার ক্ষেত্রেও হয়। একটি উদাহরণ হতে পারে: docker-compose up --exit-code-from test-unit। মনে রাখবেন যে আমি set -eআমার স্ক্রিপ্টের শুরুতে একটি যোগ না করা পর্যন্ত এটি আমার পক্ষে কাজ করে না ।
অ্যাড্রিয়ান আন্তুনেজ

--exit-code-from-dযদিও সঙ্গে কাজ করে না । এটি এই ত্রুটিগুলি ফেলে দেবে: using --exit-code-from implies --abort-on-container-exitএবং --abort-on-container-exit and -d cannot be combined.
এরিক্যাট

4
ট্র্যাভিস সিআই-তে এই কাজটি করতে পেরেছি: travis-ci.org/coyote-team/coyote/builds/274582053 এখানে ট্র্যাভিস.আইএমএল : github.com/coyote-team/coyote/blob/master/.travis.yml #
এল

4
নথিটি নৃশংস। এটি কোন পতাকাগুলির সাথে সামঞ্জস্যপূর্ণ? এটি কি কেবল একটি পরিষেবা বা আপনি এটি বেশ কয়েকটি পাস করতে পারবেন?
worc

42

docker-compose runআপনার ইচ্ছেমতো প্রস্থান স্থিতি পাওয়ার সহজ উপায়। উদাহরণ স্বরূপ:

$ cat docker-compose.yml 
roit:
    image: busybox
    command: 'true'
naw:
    image: busybox
    command: 'false'
$ docker-compose run --rm roit; echo $?
Removing test_roit_run_1...
0
$ docker-compose run --rm naw; echo $?
Removing test_naw_run_1...
1

বিকল্পভাবে, আপনার কাছে মৃত পাত্রে পরিদর্শন করার বিকল্প রয়েছে। আপনি -fকেবল প্রস্থান স্থিতি পেতে পতাকা ব্যবহার করতে পারেন ।

$ docker-compose up
Creating test_naw_1...
Creating test_roit_1...
Attaching to test_roit_1
test_roit_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
$ docker-compose ps -q | xargs docker inspect -f '{{ .Name }} exited with status {{ .State.ExitCode }}'
/test_naw_1 exited with status 1
/test_roit_1 exited with status 0

যে ডিবি docker-compose upধারকটি কখনই ফিরে আসে না, আপনি যদি ব্যবহার করেন তবে আপনাকে সেই ধারকটি সিগকিল করতে হবে; এটি সম্ভবত আপনি চান না। পরিবর্তে, আপনি docker-compose up -dআপনার পাত্রে ডিমনাইজড চালনার জন্য ব্যবহার করতে পারেন এবং পরীক্ষাটি শেষ হয়ে গেলে পাত্রে ম্যানুয়ালি মেরে ফেলুন।docker-compose run আপনার জন্য লিঙ্কযুক্ত পাত্রে চালানো উচিত , তবে আমি ঠিক ততক্ষণে ইচ্ছাকৃতভাবে কাজ করতে বাধা দেওয়ার কারণে কোনও বাগ সম্পর্কে বকবক শুনেছি।


ডকার রান নিয়ে সমস্যাটি হ'ল -T দিয়ে রান করার সময় এটি কোনও আউটপুট দেয় না এবং আমরা আউটপুটটি চাই যাতে আমরা ব্যর্থ বিল্ডগুলি পরিদর্শন করতে পারি।
লোগান সারমান

4
আপনার সাথে আউটপুট পরিদর্শন করতে @LoganSermandocker-compose logs
kojiro

রান চলাকালীন এই লগগুলিকে অবিচ্ছিন্নভাবে পাইপ করার কোনও উপায় আছে যাতে সিআই বিল্ডটি প্রগতিশীল অবস্থায় আমরা এটি দেখতে পারি?
লোগান সারমান

আমার ধারণা আপনি কেন চালাচ্ছেন-T
কোজিরো

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

24

কোজিরোর উত্তর নিয়ে বিল্ডিং:

docker-compose ps -q | xargs docker inspect -f '{{ .State.ExitCode }}' | grep -v '^0' | wc -l | tr -d ' '

  1. ধারক আইডি পান
  2. প্রতিটি কন্টেইনার আইডির জন্য শেষ রানের প্রস্থান কোড পান
  3. কেবলমাত্র স্ট্যাটাস কোড যা '0' দিয়ে শুরু হয় না
  4. অ -0 স্থিতি কোডগুলির সংখ্যা গণনা করুন
  5. সাদা জায়গা ছাঁটাই

কতগুলি নন -0 প্রস্থান কোড ফেরত হয়েছিল তা ফেরত দেয় কোড 0 দিয়ে সমস্ত কিছুর বাইরে থাকলে 0 হবে।


আপনি নিরব-আউটপুটটিও ব্যবহার করতে পারেন docker-compose ps, উদাহরণস্বরূপ: docker-compose ps | grep -c "Exit 1"আপনাকে সেই সংখ্যাটি দেবে যেখানে "প্রস্থান 1" এর সাথে ডিসপ্লেতে মিল রয়েছে docker-compose ps(যা ফলাফলের একটি সুন্দর-মুদ্রিত সংক্ষিপ্তসার সারণী সরবরাহ করে)। প্রস্থান কোডগুলি "রাজ্য" কলামে তালিকাবদ্ধ রয়েছে।
এহারিক

এটি সত্যিই দুর্দান্ত। আমার ক্ষেত্রে ব্যর্থ পরীক্ষার স্যুটে কনটেইনারগুলিতে চালিত কন্টেনারগুলি একটি কোডের সাথে প্রস্থান করে না 1 এর কোড দিয়ে কেউ বেরিয়ে আসে তবে আমি একত্রিত করতে পারি না যেহেতু তাদের কোনওটিই করেনা .... এটি কীভাবে পরিচালনা করবেন কোনও ধারণা কেস?
Walkerrandophsmith

9

অদ্ভুতভাবে যথেষ্ট পরিমাণে পতাকা docker-compose runযুক্ত করে আপনি যদি নিজের পরীক্ষাগুলিকে ম্যানুয়ালি কিক করতে ব্যবহার করতে ইচ্ছুক হন তবে --rmরচনাটি আপনার কমান্ডের প্রস্থান স্থিতিকে সঠিকভাবে প্রতিবিম্বিত করে causes

এখানে আমার উদাহরণ:

$ docker-compose -v
docker-compose version 1.7.0, build 0d7bf73

$ (docker-compose run bash false) || echo 'Test failed!'  # False negative.

$ (docker-compose run --rm bash false) || echo 'Test failed!'  # True positive.
Test failed!

$ (docker-compose run --rm bash true) || echo 'Test failed!'  # True negative.

4
অথবা (docker-compose run --rm ...) || exit $?ত্রুটির ক্ষেত্রে সমাপ্তির জন্য। ব্যাশ স্ক্রিপ্টগুলিতে দরকারী।
আমিররেজা নাসিরি

8

docker waitপ্রস্থান কোড পেতে ব্যবহার করুন :

$ docker-compose -p foo up -d
$ ret=$(docker wait foo_bar_1)

foo"প্রকল্পের নাম"। উপরের উদাহরণে, আমি এটিকে স্পষ্টভাবে উল্লেখ করেছি, তবে আপনি যদি এটি সরবরাহ না করেন তবে এটি ডিরেক্টরি নাম। barআপনার ডকার-কমপোজ.আইএমএলে পরীক্ষার অধীনে আপনি সিস্টেমটিকে যে নামটি দিয়েছেন is

নোটটি যে docker logs -fসঠিক কাজটি করে, কনটেইনারটি বন্ধ হয়ে গেলেও প্রস্থান করা হয়। সুতরাং আপনি রাখতে পারেন

$ docker logs -f foo_bar_1

মধ্যে docker-compose upএবং docker waitযাতে আপনি দেখতে পারেন আপনার পরীক্ষা চালানো।


8

--exit-code-from SERVICE এবং --abort-on-container-exit দৃশ্যে কাজ করবেন না যেখানে সমাপ্তির জন্য আপনাকে সমস্ত ধারক চালাতে হবে, তবে সেগুলির মধ্যে কোনও একটি প্রারম্ভিকভাবে প্রস্থান করলে ব্যর্থ হন। উদাহরণস্বরূপ হতে পারে যদি বিভিন্ন পাত্রে একযোগে 2 টি স্যুট চালানো হয়।

@ স্পেনথিলের পরামর্শের সাথে আপনি docker-composeএমন একটি স্ক্রিপ্ট মুড়ে রাখতে পারেন যা কোনও পাত্রে করলে ব্যর্থ হবে।

#!/bin/bash
set -e

# Wrap docker-compose and return a non-zero exit code if any containers failed.

docker-compose "$@"

exit $(docker-compose -f docker-compose.ci.build.yml ps -q | tr -d '[:space:]' |
  xargs docker inspect -f '{{ .State.ExitCode }}' | grep -v 0 | wc -l | tr -d '[:space:]')

তারপরে আপনার সিআই সার্ভারে কেবল পরিবর্তন docker-compose upকরুন ./docker-compose.sh up


4
এই স্ক্রিপ্টটি কখনই অন্যান্য ধারক (যেমন ডাটাবেস, ওয়েব অ্যাপ্লিকেশন) স্থায়ীভাবে চলার কারণে প্রস্থান বিভাগে পৌঁছায় না। বিচ্ছিন্ন মোডে চলমান এটি ধারকটি উঠে যাওয়ার সাথে সাথেই বেরিয়ে যায়
বালডি

এটা ঠিক, আপনি কেবলমাত্র সমস্ত ধারক সম্পূর্ণ করতে চালাতে চাইলে এটি কাজ করে । সম্ভবত বিশেষত সাধারণ নয়, তবে এটি লেখার সময় আমার পক্ষে কার্যকর ছিল এবং আমি ভেবেছিলাম এটি ভাগ করে নেব।
ম্যাট কোল

সেখানকার বেশিরভাগ রাস্তাটি আমাকে পেয়ে যাওয়ায় আপনার উত্তরটিকে উজ্জীবিত করে তুলেছে! বিযুক্ত মোডে প্রতিটি পরীক্ষার ধারকটিতে ডকার ওয়েট যুক্ত করা এটি কাজ করে। ভাগ করে নেওয়ার জন্য ধন্যবাদ :)
বাল্ডি

2

ডকার-রেলগুলি আপনাকে কোন ধারকটির ত্রুটি কোডটি মূল প্রক্রিয়াতে ফিরে আসে তা নির্দিষ্ট করার অনুমতি দেয়, যাতে আপনি সিআই সার্ভার ফলাফল নির্ধারণ করতে পারেন। এটি সিআই এবং ডকার সহ রেলের জন্য বিকাশের একটি দুর্দান্ত সমাধান।

উদাহরণ স্বরূপ

exit_code: web

আপনার docker-rails.ymlসমর্পণ করা হবে webকমান্ডের ফলে পাত্রে প্রস্থান কোড docker-rails ci testdocker-rails.ymlস্ট্যান্ডার্ডের চারপাশে কেবল একটি মেটা মোড়ক docker-compose.ymlযা আপনাকে বিভিন্ন পরিবেশের জন্য একই বেস কনফিগারেশনটি উত্তরাধিকারী / পুনঃব্যবহার করার সম্ভাব্যতা দেয় যেমন উন্নয়ন বনাম পরীক্ষা বনাম সমান্তরাল_সেসটস।


2

আপনি যদি কোনও ডকার ইঞ্জিনে একই নামে আরও ডকার-রচনা পরিষেবা চালাতে পারেন এবং সঠিক নামটি জানেন না তবে:

docker-compose up -d
(exit "${$(docker-compose logs -f test-chrome)##* }")

echo %? - পরীক্ষা-ক্রোম পরিষেবা থেকে প্রস্থান কোড ফেরৎ দেয়

উপকারিতা:

  • সঠিক পরিষেবা থেকে প্রস্থান করার জন্য অপেক্ষা করুন
  • পরিষেবা নাম ব্যবহার করে, ধারকের নাম নয়

2

আপনি এর সাথে প্রস্থান স্থিতি দেখতে পাবেন:

echo $(docker-compose ps | grep "servicename" | awk '{print $4}')

এটি শুরু করার জন্য ধন্যবাদ। এখানে এটির আমার সংস্করণটি রয়েছে (যা আমার পক্ষে আরও ভাল কাজ করে / আমার মনে হয় এই উত্তরটি লেখার পর থেকেই কমান্ড আউটপুট ফর্ম্যাট পরিবর্তিত হয়েছে) -docker-compose ps | grep servicename | grep -v 'Exit 0' && echo "Automation or integration tests failed." && exit 1
ডিটিরেজো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.