ডকার কম্পোজ করে Y শুরু করার আগে ধারক এক্স এর জন্য অপেক্ষা করুন


324

আমি থেকে rabbitmq এবং একটি সহজ পাইথন নমুনা ব্যবহার করছি এখানে Docker-রচনা একসাথে। আমার সমস্যাটি হ'ল খরগোশ সম্পূর্ণরূপে শুরু হওয়ার জন্য আমাকে অপেক্ষা করতে হবে। আমি এতদূর যা অনুসন্ধান করেছি সেগুলি থেকে, y (খরগোশ) শুরু না হওয়া পর্যন্ত আমি ধারক x (আমার ক্ষেত্রে কর্মী) সাথে কীভাবে অপেক্ষা করব তা জানি না।

আমি এই ব্লগপোস্টটি পেয়েছি যেখানে তিনি অন্য হোস্টটি অনলাইনে আছে কিনা তা পরীক্ষা করে দেখেন । আমি এই ডকার কমান্ডটিও পেয়েছি :

অপেক্ষার

ব্যবহার: ডকার ওয়েট কন্টেইনার [কনটেনার ...]

কোনও ধারক থামার আগ পর্যন্ত অবরোধ করুন, তারপরে প্রস্থান কোডটি মুদ্রণ করুন।

কোনও ধারক থামার অপেক্ষায় থাকা আমি সম্ভবত যা খুঁজছি তা নয় তবে যদি তা হয় তবে ডকার-কমপোস.আইএমএল-এর ভিতরে কি এই আদেশটি ব্যবহার করা সম্ভব? এখনও অবধি আমার সমাধানটি হল কয়েক সেকেন্ড অপেক্ষা করা এবং বন্দরটি পরীক্ষা করা, তবে এটি কি এটি অর্জনের উপায় ?. আমি যদি অপেক্ষা না করি তবে আমি একটি ত্রুটি পেয়েছি।

Docker-compose.yml

worker:
    build: myapp/.
    volumes:
    - myapp/.:/usr/src/app:ro

    links:
    - rabbitmq
rabbitmq:
    image: rabbitmq:3-management

পাইথন হ্যালো নমুনা (খরগোশ.পি):

import pika
import time

import socket

pingcounter = 0
isreachable = False
while isreachable is False and pingcounter < 5:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect(('rabbitmq', 5672))
        isreachable = True
    except socket.error as e:
        time.sleep(2)
        pingcounter += 1
    s.close()

if isreachable:
    connection = pika.BlockingConnection(pika.ConnectionParameters(
            host="rabbitmq"))
    channel = connection.channel()

    channel.queue_declare(queue='hello')

    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    print (" [x] Sent 'Hello World!'")
    connection.close()

কর্মী জন্য ডকফেরাইল:

FROM python:2-onbuild
RUN ["pip", "install", "pika"]

CMD ["python","rabbit.py"]

নভেম্বর 2015 আপডেট করুন :

একটি শেল স্ক্রিপ্ট বা আপনার প্রোগ্রামের মধ্যে অপেক্ষা করা সম্ভবত একটি সম্ভাব্য সমাধান। তবে এই ইস্যুটি দেখার পরে আমি ডকার / ডকার-কমপোজ নিজেই একটি আদেশ বা বৈশিষ্ট্য সন্ধান করছি।

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

সুতরাং আমি বোর্ড কমান্ডগুলিতে ডকার-রচনা দিয়ে একটি উত্তর আশা করছি, যা তারা আশা করে যে এই সমস্যাটি শেষ করলে কেস হবে।

মার্চ ২০১ Update আপডেট করুন

একটা হল প্রস্তাব একটি বিল্ট-ইন ভাবে যদি একটি ধারক "জীবন্ত" হয় তা নির্ধারণ করতে প্রদানের জন্য। সুতরাং ডকার-রচনা সম্ভবত এটি অদূর ভবিষ্যতে ব্যবহার করতে পারে।

জুন 2016 আপডেট করুন

দেখে মনে হচ্ছে স্বাস্থ্য সংস্করণটি 1.12.0 সংস্করণে ডকারে একীভূত করা হবে

জানুয়ারী 2017 আপডেট করুন

আমি একটি ডকার-রচনা সমাধান পেয়েছি দেখুন: ডকার Y শুরু করার আগে ধারক X এর জন্য অপেক্ষা করুন


2
ডিস্ট্রিবিউটেড সিস্টেমে ত্রুটি সহনশীল করতে উত্সাহিত করতে স্বাস্থ্য পরীক্ষাগুলি ব্যবহার করে ডকার-কমপোজ ২.৩ এ অবমূল্যায়ন করা হয়েছে। দেখুন: docs.docker.com/compose/startup-order
Kmaid

উত্তর:


283

অবশেষে একটি ডকার-রচনা পদ্ধতি সহ একটি সমাধান খুঁজে পেয়েছে। যেহেতু ডকার-রচনা ফাইল ফর্ম্যাট ২.১ আপনি স্বাস্থ্য পরীক্ষাগুলি সংজ্ঞায়িত করতে পারেন ।

আমি এটি একটি উদাহরণস্বরূপ প্রকল্পে করেছি আপনার কমপক্ষে ডক্কার 1.12.0+ ইনস্টল করা উচিত। আমাকে খরগোশ-মেক-পরিচালনা ডকফাইফাইল প্রসারিত করার দরকার ছিল , কারণ কার্ল অফিসিয়াল ছবিতে ইনস্টল করা হয়নি।

এখন আমি পরীক্ষা করি যদি খরগোশ-কনটেইনার পরিচালনার পৃষ্ঠা পাওয়া যায়। এক্সটিকোড 0 দিয়ে কার্ল শেষ হলে কনটেইনার অ্যাপ (পাইথন পাইকা) শুরু হবে এবং হ্যালো কাতারে একটি বার্তা প্রকাশ করবে। এটি এখন কাজ করছে (আউটপুট)।

ডকার-রচনা (সংস্করণ 2.1):

version: '2.1'

services:
  app:
    build: app/.
    depends_on:
      rabbit:
        condition: service_healthy
    links: 
        - rabbit

  rabbit:
    build: rabbitmq/.
    ports: 
        - "15672:15672"
        - "5672:5672"
    healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:15672"]
        interval: 30s
        timeout: 10s
        retries: 5

আউটপুট:

rabbit_1  | =INFO REPORT==== 25-Jan-2017::14:44:21 ===
rabbit_1  | closing AMQP connection <0.718.0> (172.18.0.3:36590 -> 172.18.0.2:5672)
app_1     |  [x] Sent 'Hello World!'
healthcheckcompose_app_1 exited with code 0

ডকফেরফাইল (খরগোশ + কার্ল):

FROM rabbitmq:3-management
RUN apt-get update
RUN apt-get install -y curl 
EXPOSE 4369 5671 5672 25672 15671 15672

সংস্করণ 3 আর নির্ভরশীলনের শর্ত ফর্মটিকে সমর্থন করে না । সুতরাং আমি নির্ভরশীলতা থেকে অনর্থক পুনরায় চালু করতে সরালাম। এখন আমার অ্যাপ্লিকেশন ধারক এটি কাজ না হওয়া পর্যন্ত 2-3 বার পুনঃসূচনা করবে, তবে এটি এখনও প্রবেশের পয়েন্টটি ওভাররাইট না করে ডকার-রচনা বৈশিষ্ট্য।

ডকার-রচনা (সংস্করণ 3):

version: "3"

services:

  rabbitmq: # login guest:guest
    image: rabbitmq:management
    ports:
    - "4369:4369"
    - "5671:5671"
    - "5672:5672"
    - "25672:25672"
    - "15671:15671"
    - "15672:15672"
    healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:15672"]
        interval: 30s
        timeout: 10s
        retries: 5

  app:
    build: ./app/
    environment:
      - HOSTNAMERABBIT=rabbitmq
    restart: on-failure
    depends_on:
      - rabbitmq
    links: 
        - rabbitmq

6
@ সোভেনহর্নবার্গ pingআইসিএমপি ব্যবহার করে তাই টিসিপি পোর্টগুলি সমর্থন করে না। হয়তো ncটিসিপি বন্দর পরীক্ষা করার জন্য। সম্ভবত psql -h localhost -p 5432কিছু ব্যবহার এবং জিজ্ঞাসা করা ভাল ।
ম্যাট

36
"উপর নির্ভর করে" এ সংস্করণ 3 সরানো হয়েছে docs.docker.com/compose/compose-file/#dependson
Nha

48
@ এনহা দেখে মনে হচ্ছে conditionফর্মটি depends_onসরিয়ে ফেলা হয়েছে, তবে depends_onএটি এখনও ভি 3

14
কিভাবে healthchecks এখনও যদি নিয়ন্ত্রণ প্রারম্ভে অর্ডার ব্যবহার করা যেতে পারে depends_onসঙ্গে conditionসরানো হয়েছে?
ফ্রান্সজ

42
এখনও এইরকম বেদনা বিশ্বাস করা
শক্ত

71

স্থানীয়ভাবে এটি এখনও সম্ভব নয়। এই বৈশিষ্ট্য অনুরোধটি দেখুন

এতক্ষণ আপনার প্রয়োজনীয় CMDসমস্ত পরিষেবাগুলি না হওয়া পর্যন্ত অপেক্ষা করার জন্য আপনার পাত্রে এটি করা দরকার।

ইন Dockerfileগুলি CMDআপনি আপনার নিজের শুরু স্ক্রিপ্ট পড়ুন পারে যে গোপন আপনার ধারক পরিষেবা আপ শুরু। আপনি এটি শুরু করার আগে, আপনি নির্ভর করে যেমন একটি জন্য অপেক্ষা করুন:

Dockerfile

FROM python:2-onbuild
RUN ["pip", "install", "pika"]
ADD start.sh /start.sh
CMD ["/start.sh"]

start.sh

#!/bin/bash
while ! nc -z rabbitmq 5672; do sleep 3; done
python rabbit.py

সম্ভবত আপনার নিজের মধ্যে নেটকাটও ইনস্টল করা দরকার Dockerfile। পাইথন চিত্রটিতে প্রাক-ইনস্টলড কী আছে তা আমি জানি না।

সরল টিসিপি পোর্ট চেকের জন্য কয়েকটি সরঞ্জাম রয়েছে যা অপেক্ষারত যুক্তি ব্যবহার করা সহজ করে:

আরও জটিল অপেক্ষা:


আপনি সিএমডি বলতে কী বোঝাতে চেয়েছেন? এর অর্থ কি আমার প্রোগ্রামেমটি করতে হবে, যেমন আমি এটি একটি পোর্ট চেক দিয়ে করেছি? অথবা আপনি যেমন এর জন্য লিনাক্স থেকে একটি নির্দিষ্ট সিএমডি বোঝাতে চান?
সোভেনহর্নবার্গ

আপনাকে ব্যাখ্যা করার জন্য ধন্যবাদ, আমি আপনার উত্তরটিকে উঁচু করে তুলেছি I তবে আমি মনে করি আসন্ন বৈশিষ্ট্য অনুরোধটি আমার প্রশ্নের সঠিক উত্তর হবে তাই আমি এটিকে এ পর্যন্ত উত্তর না দিয়ে রেখেছি।
সোভেনহর্নবার্গ

44

ব্যবহার করা restart: unless-stoppedবা restart: alwaysএই সমস্যার সমাধান হতে পারে।

containerখরগোশ এমকিউ প্রস্তুত না হলে শ্রমিক যদি থামে, এটি না হওয়া পর্যন্ত এটি পুনরায় চালু করা হবে।


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

@ ডেরেকমাহার, আপনার যদি জাভা ভিত্তিক ওয়েব অ্যাপ্লিকেশন রয়েছে যা কেবলমাত্র আরএসটি কলগুলি সরবরাহ করে, আপনি জেটি / টমক্যাটের পরিবর্তে কী ব্যবহার করবেন?
জোগ

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

35

বেশ সম্প্রতি তারা এই depends_onবৈশিষ্ট্যটি যুক্ত করেছে ।

সম্পাদনা:

রচনা সংস্করণ ২.১+ হিসাবে আপনি এটি অর্জনের depends_onসাথে একত্রে ব্যবহার করতে পারেন healthcheck:

দস্তাবেজগুলি থেকে :

version: '2.1'
services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: redis
    healthcheck:
      test: "exit 0"

সংস্করণ 2.1 এর আগে

আপনি এখনও ব্যবহার করতে পারেন depends_on, তবে এটি কেবল পরিষেবাগুলিতে শুরু হওয়া ক্রমের উপরেই প্রভাব ফেলে - নির্ভরশীল পরিষেবা শুরু হওয়ার আগে সেগুলি প্রস্তুত না হলে নয়।

এটির কমপক্ষে 1.6.0 সংস্করণ প্রয়োজন বলে মনে হচ্ছে।

ব্যবহার এই জাতীয় কিছু দেখতে হবে:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres 

দস্তাবেজগুলি থেকে:

পরিষেবার মধ্যে নির্ভরতা প্রকাশ করা, যার দুটি প্রভাব রয়েছে:

  • ডকার-কমপোজ নির্ভরতা ক্রমে পরিষেবাগুলি শুরু করবে। নিম্নলিখিত উদাহরণে, ওয়েবের আগে ডিবি এবং রেডিস শুরু হবে।
  • Docker- রচনা আপ SERVICE স্বয়ংক্রিয়ভাবে SERVICE এর নির্ভরতা অন্তর্ভুক্ত করবে। নিম্নলিখিত উদাহরণে, ডকার-কমপেজ ওয়েবও তৈরি করবে এবং ডিবি এবং রিডিস শুরু করবে।

দ্রষ্টব্য: আমি এটি যেমন বুঝতে পারি, যদিও এটি ধারন করে যাতে পাত্রে লোড হয়। এটি কোনও গ্যারান্টি দেয় না যে ধারকটির ভিতরে থাকা পরিষেবাটি আসলে লোড হয়েছে।

উদাহরণস্বরূপ, আপনি পোস্টগ্র্রেস ধারক হতে পারে। তবে পোস্টগ্রিজ পরিষেবা নিজেই এখনও ধারকটির মধ্যেই সূচনা হতে পারে।


10
ডেনফিন লিখেছেন: depend_on কেবল অর্ডার করছে। প্রকৃতপক্ষে অন্য ধারকটি শুরু করতে দেরি করার জন্য যখন কোনও প্রক্রিয়া নিজেই শুরু করা শেষ করে তখন এটি সনাক্ত করার কিছু উপায় হতে হবে।
সোভেনহর্নবার্গ

15
"সংস্করণ 3 এর শর্ত ফর্মটিকে আর সমর্থন করে না depends_on" " docs.docker.com/compose/compose-file/#d dependson
akauppi

depends_onধারকটি readyরাষ্ট্র না হওয়া পর্যন্ত অপেক্ষা করবেন না (এটি আপনার ক্ষেত্রে যার অর্থ হতে পারে)। ধারকটি 'চালিত' অবস্থায় না আসা পর্যন্ত এটি কেবল অপেক্ষা করে।
htyagi

19

আপনি এটি কেবল কমান্ড বিকল্পে যেমন যুক্ত করতে পারেন যেমন।

command: bash -c "sleep 5; start.sh"

https://github.com/docker/compose/issues/374#issuecomment-156546513

একটি বন্দরে অপেক্ষা করার জন্য আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

command: bash -c "while ! curl -s rabbitmq:5672 > /dev/null; do echo waiting for xxx; sleep 3; done; start.sh"

অপেক্ষার সময় বাড়ানোর জন্য আপনি আরও কিছুটা হ্যাক করতে পারেন:

command: bash -c "for i in {1..100} ; do if ! curl -s rabbitmq:5672 > /dev/null ; then echo waiting on rabbitmq for $i seconds; sleep $i; fi; done; start.sh"

13

restart: on-failure আমার জন্য কৌশলটি করেছেন .. নীচে দেখুন

---
version: '2.1'
services:
  consumer:
    image: golang:alpine
    volumes:
      - ./:/go/src/srv-consumer
    working_dir: /go/src/srv-consumer
    environment:
      AMQP_DSN: "amqp://guest:guest@rabbitmq:5672"
    command: go run cmd/main.go
    links:
          - rabbitmq
    restart: on-failure

  rabbitmq:
    image: rabbitmq:3.7-management-alpine
    ports:
      - "15672:15672"
      - "5672:5672"

12

ধারক ব্যবহারের জন্য অর্ডার শুরু করুন

depends_on:

পূর্ববর্তী কন্টেইনারটির জন্য স্ক্রিপ্ট ব্যবহার শুরু করুন

entrypoint: ./wait-for-it.sh db:5432

এই নিবন্ধটি আপনাকে https://docs.docker.com/compose/startup-order/ এ সহায়তা করবে


5
মন্তব্যে @ সোভেনহর্নবার্গ, আপনি লিঙ্ক করেছেন, অপেক্ষা-for-it.sh বৈশিষ্ট্য সম্পর্কে কোনও ব্যাখ্যা নেই।
প্রস্থান

7

নেটকাট ( ডকার-ওয়েট স্ক্রিপ্ট ব্যবহার করে ) পরিষেবাটি শেষ হওয়ার জন্য অপেক্ষা করে এমন একটি এন্ডপয়েন্টটি সেট করে আপনি এটিও সমাধান করতে পারেন । আমি এই পদ্ধতির পছন্দ করি কারণ আপনার এখনও একটি পরিষ্কার commandবিভাগ রয়েছে docker-compose.ymlএবং আপনার আবেদনে আপনাকে ডকার নির্দিষ্ট কোড যুক্ত করার দরকার নেই:

version: '2'
services:
  db:
    image: postgres
  django:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    entrypoint: ./docker-entrypoint.sh db 5432
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

তারপরে আপনার docker-entrypoint.sh:

#!/bin/sh

postgres_host=$1
postgres_port=$2
shift 2
cmd="$@"

# wait for the postgres docker to be running
while ! nc $postgres_host $postgres_port; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"

# run the command
exec $cmd

এটি আজকাল অফিসিয়াল ডকার ডকুমেন্টেশনে নথিভুক্ত করা হয়

PS: netcatএটি উপলভ্য না হলে আপনার ডকারে ইনস্টল করা উচিত । এটি করতে আপনার Dockerফাইলটিতে এটি যুক্ত করুন:

RUN apt-get update && apt-get install netcat-openbsd -y 

4

" ডকার-ওয়েট " নামক ইউটিলিটি ব্যবহারের জন্য প্রস্তুত রয়েছে যা অপেক্ষা করার জন্য ব্যবহার করা যেতে পারে।


1
আপনাকে ধন্যবাদ, তবে এটি কেবল একটি শেল স্ক্রিপ্ট তাই এটি h3nrik উত্তর বা পাইথনের ভিতরে অপেক্ষা করার মতো। এটি নিজেই ডকার-রচনার বৈশিষ্ট্য নয়। আপনি github.com/docker/compose/issues/374নজর রাখতে পারেন তারা একটি স্বাস্থ্য পরীক্ষা বাস্তবায়নের পরিকল্পনা করছেন যা সবচেয়ে ভাল উপায়। একটি উন্মুক্ত টিসিপি সংযোগের অর্থ এই নয় যে আপনার পরিষেবা প্রস্তুত বা প্রস্তুত থাকতে পারে। এটি ছাড়াও আমার ডকস্পাইলে আমার প্রবেশপথটি পরিবর্তন করা দরকার।
সোভেনহর্নবার্গ

3

বিভিন্ন উপায়ে চেষ্টা করেছেন তবে এর সরলতাটি পছন্দ করেছেন: https://github.com/ufoscout/docker-compose-wait

ধারণা যে আপনি ENV ব্যবহার করতে পারেন Docker রচনা ফাইলে Vars একটি (পোর্ট) সেবা আয়োজকের তালিকার যা এই মত "প্রতীক্ষিত" দিতে হবে জমা দিতে: WAIT_HOSTS: postgres:5432, mysql:3306, mongo:27017

সুতরাং আসুন আমরা বলি যে আপনার কাছে নিম্নলিখিত ডকার-কমপোজ.আইএমএল ফাইল রয়েছে (রেপো README থেকে অনুলিপি / অতীত ):

version: "3"

services:

  mongo:
    image: mongo:3.4
    hostname: mongo
    ports:
      - "27017:27017"

  postgres:
    image: "postgres:9.4"
    hostname: postgres
    ports:
      - "5432:5432"

  mysql:
    image: "mysql:5.7"
    hostname: mysql
    ports:
      - "3306:3306"

  mySuperApp:
    image: "mySuperApp:latest"
    hostname: mySuperApp
    environment:
      WAIT_HOSTS: postgres:5432, mysql:3306, mongo:27017

এর পরে, পরিষেবাগুলি অপেক্ষা করার জন্য, আপনাকে আপনার ডকফায়াইলগুলিতে নিম্নলিখিত দুটি লাইন যুক্ত করতে হবে (পরিষেবাগুলির ডকফেরফিলের মধ্যে যা অন্যান্য পরিষেবার জন্য অপেক্ষা করা উচিত):

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait
RUN chmod +x /wait

যেমন নমুনা সম্পূর্ণ উদাহরণস্বরূপ Dockerfile (রেপো প্রকল্প থেকে আবার README ):

FROM alpine

## Add your application to the docker image
ADD MySuperApp.sh /MySuperApp.sh

## Add the wait script to the image
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.5.0/wait /wait
RUN chmod +x /wait

## Launch the wait tool and then your application
CMD /wait && /MySuperApp.sh

সম্ভাব্য ব্যবহার সম্পর্কে অন্যান্য তথ্যের জন্য README দেখুন


আমি একযোগে উত্তর খুঁজছিলাম। আমি নীচে নেটক্যাট ব্যবহার করায় আমি সাধারণত hub.docker.com/r/ دادarek/wait-d depend dependants নিয়ে কাজ করেছি । আপনি যে সরবরাহ করেছেন সেটি হ'ল মরিচা-ভিত্তিক। আপনার গুণমান সম্পর্কে মন্তব্য করতে পারবেন না, তবে আমার জন্য কোনও অতিরিক্ত স্তর একটি নির্দিষ্ট প্রো নয়।
ফিলিপ ম্যালকজাক

1
আমি সুরক্ষার ভিত্তিতে এর বিরুদ্ধে দৃ strongly়ভাবে সুপারিশ করছি। আপনি হাইপারলিংক থেকে নির্বিচারে কার্যকর করতে চলেছেন। স্থির স্ক্রিপ্টের সাথে একই জিনিসটি করানো একটি আরও ভাল সমাধান হ'ল কপির সাথে ছবিতে অনুলিপি করা হয়েছে
পল কে

@ পলক অবশ্যই, এটি বোধগম্য যে হাইপারলিংক থেকে যে কোনও কিছুই চালানো নিরাপদ নয়, তবে এটি কীভাবে https://github.com/ufoscout/docker-compose-waitলাইব্রেরিটিকে কাজ করতে হয় তার উপরে একটি ডেমো :) আপনি যে লাইব্রেরিটি ব্যবহার করেন সেভাবে কোনও উত্তর বদলাবে না যে আপনি কিছুটা ব্যবহার করতে পারবেন। সুরক্ষা একটি জটিল বিষয় এবং আমরা যদি আরও দূরে চলে যাই তবে আমাদের লাইব্রেরিটি যেভাবেই করা হচ্ছে তা যাচাই করা উচিত, এমনকি আমরা এটি কপি করি :) আপনার মন্তব্যে আরও সুনির্দিষ্ট হওয়া ভাল: "আমি সেই লাইব্রেরির ব্যবহারের বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দিচ্ছি হাইপারলিঙ্ক থেকে "। আশা করি আপনি সম্মত হবেন, একটি ইঙ্গিতের জন্য ধন্যবাদ!
এভেরিক

2

এই ব্লগ পোস্টের উপর ভিত্তি করে https://8thlight.com/blog/dariusz-pasciak/2016/10/17/docker-compose-wait-for-d dependferences.html

আমি docker-compose.ymlনীচের মত আমার কনফিগার করেছেন :

version: "3.1"

services:
  rabbitmq:
    image: rabbitmq:3.7.2-management-alpine
    restart: always
    environment:
      RABBITMQ_HIPE_COMPILE: 1
      RABBITMQ_MANAGEMENT: 1
      RABBITMQ_VM_MEMORY_HIGH_WATERMARK: 0.2
      RABBITMQ_DEFAULT_USER: "rabbitmq"
      RABBITMQ_DEFAULT_PASS: "rabbitmq"
    ports:
      - "15672:15672"
      - "5672:5672"
    volumes:
      - data:/var/lib/rabbitmq:rw

  start_dependencies:
    image: alpine:latest
    links:
      - rabbitmq
    command: >
      /bin/sh -c "
        echo Waiting for rabbitmq service start...;
        while ! nc -z rabbitmq 5672;
        do
          sleep 1;
        done;
        echo Connected!;
      "

volumes:
  data: {}

তারপরে আমি দৌড়ের জন্য করব =>:

docker-compose up start_dependencies

rabbitmqডেমন মোডে পরিষেবা শুরু start_dependenciesহবে, কাজ শেষ করবে।


লল, এর মাধ্যমে আপনার জিজ্ঞাসা তৈরি করা "curl", "-f", "http://localhost:15672"দরকার যার জন্য আপনাকে managementপ্লাগইন ইনস্টল করতে হবে এবং স্বাস্থ্যচেক ব্যবহার করা উচিত যা ইতিমধ্যে অবনমিত হয়েছে - এর সেরা উত্তর। ncএর - ডাউনভোটের মাধ্যমে চেক সহ সাধারণ কাজের উদাহরণ । হা, ঠিক আছে ...
ইগর কোমার

উত্তরটি কোনও নেটিভ ডকার বৈশিষ্ট্য ব্যবহার করে না, এটি যদি আপনি কার্ল, এনসি বা অন্যান্য সরঞ্জাম ব্যবহার করেন তবে এটি অপ্রাসঙ্গিক। যখন! এনসি ইতিমধ্যে অন্যান্য উত্তরে পোস্ট হিসাবে একই।
সোভেনহর্নবার্গ

1
নেটিভ Docker অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে: 1. docs.docker.com/compose/startup-order 2. github.com/docker/compose/issues/5007 3. github.com/docker/compose/issues/374
ইগর Komar

1
@ ইগরকোমার, ধন্যবাদ মানুষ, আপনি আমার দিনটি বাঁচালেন! : 3 আমি মাইএসকিএল সার্ভারটি যাচাই করতে প্রায় একই মেকানিক ব্যবহার করেছি প্রকৃত প্রয়োগ শুরু হওয়ার আগে প্রস্তুত। ;) আমি অনুরূপ কমান্ড ক্ষণস্থায়ী করছিdocker-compose run --name app-test --rm "app" bash -l -c 'echo Waiting for mysql service start... && while ! nc -z db-server 3306; do sleep 1; done && echo Connected! && /bin/bash /script/ci_tests.sh'
TooroSan

1

একটি ডকার রচনা ফাইলের 3 সংস্করণে, আপনি RESTART ব্যবহার করতে পারেন ।

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

Docker-compose.yml

worker:
    build: myapp/.
    volumes:
    - myapp/.:/usr/src/app:ro
    restart: on-failure
    depends_on:
    - rabbitmq
rabbitmq:
    image: rabbitmq:3-management

নোট করুন যে আমি লিঙ্কগুলির পরিবর্তে depend_on ব্যবহার করেছি যেহেতু পরবর্তী সংস্করণ 3-এ অবনতিযুক্ত

যদিও এটি কাজ করে, আপনি প্রতিটি ব্যর্থতায় ডকারের ধারকটি পুনরায় চালু করার পরে এটি আদর্শ সমাধান হতে পারে না।

আর ইলিপিটিতেও একবার দেখুন । এটি আপনাকে পুনরায় চালু করার নীতিটি সূক্ষ্ম করতে দেয়।

আপনি যখন উত্পাদনে রচনা ব্যবহার করেন তখন পুনরায় আরম্ভের নীতিটি ব্যবহার করা ভাল best

পুনরায় চালু করার মতো পুনঃসূচনা নীতি নির্দিষ্ট করা: সর্বদা ডাউনটাইম এড়াতে


0

বিকল্প সমাধানগুলির মধ্যে একটি হ'ল কুবেরনেটসের মতো একটি ধারক অর্কেস্টেশন সমাধান ব্যবহার করা। কুবেরনেটসের সাথে ডিআইএন পাত্রে সমর্থন রয়েছে যা অন্যান্য পাত্রে শুরু হওয়ার আগে শেষ হয়। আপনি এসকিউএল সার্ভার 2017 লিনাক্স ধারক সহ একটি উদাহরণ খুঁজে পেতে পারেন যেখানে API কনটেইনার একটি ডেটাবেস আরম্ভ করার জন্য init পাত্র ব্যবহার করে

https://www.handsonarchitect.com/2018/08/understand-kubernetes-object-init.html


0

এখানে উদাহরণ রয়েছে যেখানে mainকন্টেইনারগুলি পিংসের workerপ্রতিক্রিয়া শুরু করার সময় অপেক্ষা করে :

version: '3'
services:
  main:
    image: bash
    depends_on:
     - worker
    command: bash -c "sleep 2 && until ping -qc1 worker; do sleep 1; done &>/dev/null"
    networks:
      intra:
        ipv4_address: 172.10.0.254
  worker:
    image: bash
    hostname: test01
    command: bash -c "ip route && sleep 10"
    networks:
      intra:
        ipv4_address: 172.10.0.11
networks:
  intra:
    driver: bridge
    ipam:
      config:
      - subnet: 172.10.0.0/24

তবে সঠিক উপায়টি হ'ল healthcheck(> = 2.1) ব্যবহার করা।


0

গুরুতর মোতায়েনের জন্য প্রস্তাবিত নয়, তবে এখানে মূলত একটি "অপেক্ষা এক্স সেকেন্ড" কমান্ড রয়েছে।

সঙ্গে docker-composeসংস্করণ 3.4একটি start_periodনির্দেশ যোগ করা হয়েছেhealthcheck । এর অর্থ আমরা নিম্নলিখিতগুলি করতে পারি:

docker-compose.yml:

version: "3.4"
services:
  # your server docker container
  zmq_server:
    build:
      context: ./server_router_router
      dockerfile: Dockerfile

  # container that has to wait
  zmq_client:
    build:
      context: ./client_dealer/
      dockerfile: Dockerfile
    depends_on:
      - zmq_server
    healthcheck:
      test: "sh status.sh"
      start_period: 5s

status.sh:

#!/bin/sh

exit 0

এখানে যা ঘটে তা হ'ল healthcheck5 সেকেন্ডের পরে প্রার্থনা করা। এটি status.shস্ক্রিপ্টকে কল করে , যা সর্বদা "কোনও সমস্যা হয় না" returns আমরা zmq_clientশুরু করার আগে মাত্র 5 সেকেন্ডের জন্য ধারকটি অপেক্ষা করেছি!

দ্রষ্টব্য: আপনার কাছে এটি গুরুত্বপূর্ণ version: "3.4"। যদি এটি .4না থাকে তবে ডকার-রচনা অভিযোগ করে।


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

পুনশ্চ. আরও জটিল সমাধানের জন্য, এভারেকের উত্তরটি দেখুন
ফিলিপ মলকজাক

এটা না কি start_periodআছে। এই কনফিগারেশনটির অর্থ এমন একটি সময়কাল রয়েছে যেখানে ব্যর্থ স্বাস্থ্য চেকগুলি পুনরায় চেষ্টা হিসাবে গণ্য হয় না। এটি যদি তাড়াতাড়ি সফল হয় তবে এটিকে স্বাস্থ্যকর বলে মনে করা হয়। শুরুর সময়ের পরে, একটি ব্যর্থতা পুনরায় চেষ্টা হিসাবে গণ্য হবে। দেখুন docs.docker.com/engine/reference/builder/#healthcheck
Capi Etheriel

-4

আমার কাছে মাত্র 2 টি রচনা ফাইল রয়েছে এবং পরে প্রথম এবং দ্বিতীয়টি শুরু করি। আমার স্ক্রিপ্টটি দেখতে এমন দেখাচ্ছে:

#!/bin/bash
#before i build my docker files
#when done i start my build docker-compose
docker-compose -f docker-compose.build.yaml up
#now i start other docker-compose which needs the image of the first
docker-compose -f docker-compose.prod.yml up

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