ডকার-রচনা ব্যবহার করে, একাধিক কমান্ড কীভাবে কার্যকর করা যায়


498

আমি এই জাতীয় কিছু করতে চাই যেখানে আমি একাধিক কমান্ডগুলি ক্রমে চালাতে পারি।

db:
  image: postgres
web:
  build: .
  command: python manage.py migrate
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db

উত্তর:


858

এটি খুঁজে বের করে, ব্যবহার bash -c

উদাহরণ:

command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"

মাল্টিলিনগুলিতে একই উদাহরণ:

command: >
    bash -c "python manage.py migrate
    && python manage.py runserver 0.0.0.0:8000"

বা:

command: bash -c "
    python manage.py migrate
    && python manage.py runserver 0.0.0.0:8000
  "

6
@ পেড্রাম নিশ্চিত করুন যে আপনি এমন একটি চিত্র ব্যবহার করছেন যা আসলে বাশ ইনস্টল করা আছে। কিছু চিত্রের জন্য /bin/bash
বশ

5
যদি কোনও বাশ ইনস্টল না করা থাকে তবে আপনি sh -c "আপনার কমান্ড" চেষ্টা করতে পারেন
কেওস্টে

নিশ্চিত হন যে আপনি বাশগুলিতে যাওয়ার সময় আপনার আদেশগুলি উদ্ধৃতিতে মুড়ে রাখছেন এবং ডিবিটি নিশ্চিত হওয়ার জন্য আমাকে একটি "ঘুম 5" স্লিপ করতে হয়েছিল, তবে এটি আমার পক্ষে কার্যকর হয়েছিল।
ট্র্যাডে

74
আলপাইন-ভিত্তিক চিত্রগুলিতে আসলে কোনও বাশ ইনস্টল করা নেই বলে মনে হচ্ছে - @ চাওস্টের প্রস্তাব এবং এর shপরিবর্তে ব্যবহার করুন:[sh, -c, "cd /usr/src/app && npm start"]
ফ্লোরিয়িয়ান লচ

1
ঠিক ash
জনাথন

160

আমি প্রি-স্টার্টআপ স্টাফগুলি যেমন পৃথক ইফেমেরাল পাত্রে স্থানান্তরের মতো চালিত করি (নোট, রচনা ফাইলটি সংস্করণ '2' টাইপের হতে হবে):

db:
  image: postgres
web:
  image: app
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db
  depends_on:
    - migration
migration:
  build: .
  image: app
  command: python manage.py migrate
  volumes:
    - .:/code
  links:
    - db
  depends_on:
    - db

এটি জিনিসগুলি পরিষ্কার এবং পৃথক রাখতে সহায়তা করে। দুটি বিষয় বিবেচনা করুন:

  1. আপনাকে সঠিক প্রারম্ভিক ক্রমটি নিশ্চিত করতে হবে (depend_on ব্যবহার করে)

  2. আপনি একাধিক বিল্ড এড়াতে চান যা বিল্ড এবং চিত্র ব্যবহার করে প্রথমবারের মতো এটি ট্যাগ করে প্রাপ্ত হয়; আপনি তখন অন্য পাত্রে চিত্রটি উল্লেখ করতে পারেন


2
এটি আমার কাছে সেরা বিকল্প হিসাবে মনে হচ্ছে এবং আমি এটি ব্যবহার করতে চাই। আপনি একাধিক বিল্ড এড়ানোর জন্য আপনার ট্যাগিং সেটআপটি বিশদভাবে বলতে পারেন? আমি অতিরিক্ত পদক্ষেপ এড়াতে পছন্দ করব, সুতরাং এর যদি কিছু দরকার হয় তবে আমি bash -cউপরে যেতে পারি ।
স্ট্যাভ্রোস করোকিঠাকিস

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

25
যদিও আমি এটির ধারণাটি পছন্দ করি, সমস্যাটি হ'ল নির্ভর করে_ কেবলমাত্র তারা ক্রমটি শুরু করে তা নিশ্চিত করে, তারা এই ক্রমে প্রস্তুত নয়। অপেক্ষা- for-it.sh সমাধান হতে পারে কিছু লোকের প্রয়োজন need
ট্র্যাডে

2
এটি একেবারে সঠিক এবং কিছুটা লজ্জার বিষয় যে ডকার-রচনাটি কোনও পাত্রে প্রস্থান করার জন্য অপেক্ষা করা বা কোনও বন্দরে শুনতে শুরু করার মতো কোনও সূক্ষ্ম দানাদার নিয়ন্ত্রণকে সমর্থন করে না। তবে হ্যাঁ, একটি কাস্টম স্ক্রিপ্ট এটি সমাধান করে, ভাল পয়েন্ট!
বুজোর্ন স্টিল

1
এই উত্তরটি নির্ভর করে কীভাবে কাজ করে সে সম্পর্কে ভুল এবং সম্ভাব্য ধ্বংসাত্মক তথ্য দেয়।
অ্যান্টোনেস্টাম

96

আমি এর shবিপরীতে ব্যবহার করার পরামর্শ দিচ্ছি bashকারণ এটি বেশিরভাগ ইউনিক্স ভিত্তিক চিত্রগুলিতে (আলপাইন ইত্যাদি) সহজেই উপলব্ধ।

এখানে একটি উদাহরণ docker-compose.yml:

version: '3'

services:
  app:
    build:
      context: .
    command: >
      sh -c "python manage.py wait_for_db &&
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"

এটি নিম্নলিখিত কমান্ডগুলিকে ক্রমে কল করবে:

  • python manage.py wait_for_db - ডিবি প্রস্তুত হওয়ার জন্য অপেক্ষা করুন
  • python manage.py migrate - যে কোনও মাইগ্রেশন চালান
  • python manage.py runserver 0.0.0.0:8000 - আমার বিকাশ সার্ভার শুরু করুন

2
ব্যক্তিগতভাবে এটি আমার প্রিয়, এবং সবচেয়ে পরিষ্কার, সমাধান।
বাগহান্টরুক

1
আমারও. @ লন্ডন অ্যাপডেভ পয়েন্ট-আউট হিসাবে, স্থানটি অনুকূলিতকরণের জন্য সমস্ত পাত্রে ডিফল্টরূপে ব্যাশ পাওয়া যায় না (যেমন, আলপাইন লিনাক্সের শীর্ষে নির্মিত বেশিরভাগ পাত্রে)
ewilan

2
আমাকে
মাল্টিলাইন

@ আন্ড্রেভানজুইডাম হুমম এটি আশ্চর্যজনক, আমার এটি করার দরকার ছিল না। আপনি কি উদ্ধৃতি দিয়ে ঘিরেছেন? আপনি কোন ডকারের গন্ধটি চালাচ্ছেন?
লন্ডন অ্যাপদেভ

2
@oligofren >(দেখুন একটি মাল্টি-লাইন ইনপুট শুরু করার জন্য ব্যবহার করা হয় stackoverflow.com/a/3790497/2220370 )
LondonAppDev

39

এটি আমার পক্ষে কাজ করে:

version: '3.1'
services:
  db:
    image: postgres
  web:
    build: .
    command:
      - /bin/bash
      - -c
      - |
        python manage.py migrate
        python manage.py runserver 0.0.0.0:8000

    volumes:
      - .:/code
    ports:
      - "8000:8000"
    links:
      - db

ডকার-রচনাটি কমান্ডটি চালানোর আগে ভেরিয়েবলকে ডিগ্রিফার করার চেষ্টা করে , তাই আপনি যদি ভেরিয়েবলগুলি পরিচালনা করতে বাশ করতে চান তবে ডাবল-চিহ্নগুলি দ্বিগুণ করে পালিয়ে যেতে হবে ...

    command:
      - /bin/bash
      - -c
      - |
        var=$$(echo 'foo')
        echo $$var # prints foo

... অন্যথায় আপনি একটি ত্রুটি পাবেন:

"ওয়েব" পরিষেবাতে "কমান্ড" বিকল্পের জন্য অবৈধ প্রবৃত্তি বিন্যাস:


ও হে বন্ধু. আমি একটি সমস্যার মুখোমুখি হয়েছি: `` re অপরিজ্ঞাত যুক্তি: / বিন / বাশ-সি পাইথন 3 / ইউএসআর / লোকাল / এয়ারফ্লো /__init__.py -C লোকাল-টি উইন্ডোজ `` `আমার ডকার-কম্পোজ.আইএমএল-এর কমান্ডটি: - / বিন / বাশ - -সি - | পাইথন 3 / এএসআর / লোকাল / মায়ারফ্লো /__ইনিট__.py -C $ {ক্লায়েন্ট} -টি $ {প্রকারগুলি you আপনি কীভাবে এটি ঠিক করতে জানেন? আমি আমার .env ফাইলে ক্লায়েন্ট এবং প্রকার যুক্ত করি।
নিউট

আপনার জন্য এখানে একটি নথি রয়েছে: docs.docker.com/compose/compose-file/#variable-substedia আমি মনে করি যা ঘটছে তা হ'ল আপনার .env ফাইলটি কনটেইনার পরিবেশে সেই পরিবর্তনশীল রাখে, তবে ডকার-কম্পোজ আপনার শেল পরিবেশে সন্ধান করছে । পরিবর্তে চেষ্টা করুন $${Types}এবং $${Client}। আমি মনে করি এটি ডকার রচনাগুলি সেই ভেরিয়েবলগুলি ব্যাখ্যা করতে এবং আপনি ডকর-রচনাটি যে কোনও শেল থেকে অনুরোধ করছেন তাতে তার মানগুলি সন্ধান করতে বাধা দেবে, যার অর্থ দাঁড়াবে যে তারা এখনও বাশকে তাদের ডিফারেন্স করতে পারে ( ডকারার আপনার ফাইলটি প্রক্রিয়া করার পরে.env )।
ম্যাট্রিক্সম্যানএটিআইআরসেবা

আপনার মন্তব্যের জন্য ধন্যবাদ. আপনি বাস্তবে যা বলেছিলেন আমি তা করেছি। সুতরাং আমি ত্রুটি তথ্য I (ক্লায়েন্ট) পেয়েছি। অজগরে os.getenv ব্যবহার করার জন্য আমি পরিবেশের ভেরিয়েবলগুলি পড়ার উপায় পরিবর্তন করেছি, যা সহজ। যাই হোক ধন্যবাদ.
নিউট

23

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

শেল স্ক্রিপ্ট ফাইলটি এতে docker-entrypoint.shনিম্নলিখিত বিষয়বস্তুর সাথে (নাম কোনও বিষয় নয়) তৈরি করতে পারে।

#!/bin/bash
python manage.py migrate
exec "$@"

ডকার-কমপোজ.আইএমএল ফাইলটিতে পিএস entrypoint: /docker-entrypoint.shহিসাবে এটি ব্যবহার করুন এবং কমান্ডটি নিবন্ধ করুন command: python manage.py runserver 0.0.0.0:8000: docker-entrypoint.shআপনার কোডের সাথে অনুলিপি করতে ভুলবেন না ।


মনে রাখবেন যে আপনি যখন করবেন তখন এটি কার্যকর হবেdocker-compose run service-name ....
thisismydesign

18

আরেকটি ধারণা:

যদি এই ক্ষেত্রে, আপনি ধারকটি তৈরি করেন তবে এটিতে একটি প্রারম্ভিক স্ক্রিপ্ট রাখুন এবং এটি কমান্ড দিয়ে চালান run অথবা ভলিউম হিসাবে স্টার্টআপ স্ক্রিপ্ট মাউন্ট করুন।


হ্যাঁ, শেষে আমি একটি রান.শ স্ক্রিপ্ট তৈরি করেছি: #!/bin/bash \n python manage.py migrate \n python manage.py runserver 0.0.0.0:8000( কুরুচিপূর্ণ অনলাইন )
ফেরো

9

* হালনাগাদ *

আমি কিছু কমান্ড চালানোর সর্বোত্তম উপায়টি আবিষ্কার করেছি হ'ল একটি কাস্টম ডকফেরফিল লিখুন যা ছবিটি থেকে অফিসিয়াল সিএমডি চালানোর আগে যা করতে চাই তার সবকিছু করে।

Docker-compose.yaml:

version: '3'

# Can be used as an alternative to VBox/Vagrant
services:

  mongo:
    container_name: mongo
    image: mongo
    build:
      context: .
      dockerfile: deploy/local/Dockerfile.mongo
    ports:
      - "27017:27017"
    volumes:
      - ../.data/mongodb:/data/db

Dockerfile.mongo:

FROM mongo:3.2.12

RUN mkdir -p /fixtures

COPY ./fixtures /fixtures

RUN (mongod --fork --syslog && \
     mongoimport --db wcm-local --collection clients --file /fixtures/clients.json && \
     mongoimport --db wcm-local --collection configs --file /fixtures/configs.json && \
     mongoimport --db wcm-local --collection content --file /fixtures/content.json && \
     mongoimport --db wcm-local --collection licenses --file /fixtures/licenses.json && \
     mongoimport --db wcm-local --collection lists --file /fixtures/lists.json && \
     mongoimport --db wcm-local --collection properties --file /fixtures/properties.json && \
     mongoimport --db wcm-local --collection videos --file /fixtures/videos.json)

এটি সম্ভবত এটি করার সবচেয়ে পরিষ্কার উপায়।

* পুরানো উপায় *

আমি আমার কমান্ডগুলি দিয়ে একটি শেল স্ক্রিপ্ট তৈরি করেছি। এই ক্ষেত্রে আমি শুরু করতে চেয়েছিলাম mongod, এবং চালাতে চাইছি mongoimportতবে mongodআপনাকে বাকিগুলি চালানো থেকে বিরত রাখতে হবে।

ডকার-কমপোজ.আইএমএল :

version: '3'

services:
  mongo:
    container_name: mongo
    image: mongo:3.2.12
    ports:
      - "27017:27017"
    volumes:
      - ./fixtures:/fixtures
      - ./deploy:/deploy
      - ../.data/mongodb:/data/db
    command: sh /deploy/local/start_mongod.sh

start_mongod.sh :

mongod --fork --syslog && \
mongoimport --db wcm-local --collection clients --file /fixtures/clients.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json && \
mongoimport --db wcm-local --collection content --file /fixtures/content.json && \
mongoimport --db wcm-local --collection licenses --file /fixtures/licenses.json && \
mongoimport --db wcm-local --collection lists --file /fixtures/lists.json && \
mongoimport --db wcm-local --collection properties --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection videos --file /fixtures/videos.json && \
pkill -f mongod && \
sleep 2 && \
mongod

সুতরাং এটি মঙ্গো কাঁটাচামচ করে, মনোগিম্পোর্ট করে এবং তারপরে কাঁটাযুক্ত মঙ্গোকে বিচ্ছিন্ন করে মেরে ফেলে, এবং এটি বিচ্ছিন্ন না করে আবার শুরু করে। কোনও কাঁটাযুক্ত প্রক্রিয়া সংযুক্ত করার উপায় আছে কিনা তা নিশ্চিত নয় তবে এটি কাজ করে।

দ্রষ্টব্য: আপনি যদি কিছু প্রাথমিক ডিবি ডেটা কঠোরভাবে লোড করতে চান তবে এটি করার উপায় এটি:

mongo_import.sh

#!/bin/bash
# Import from fixtures

# Used in build and docker-compose mongo (different dirs)
DIRECTORY=../deploy/local/mongo_fixtures
if [[ -d "/fixtures" ]]; then
    DIRECTORY=/fixtures
fi
echo ${DIRECTORY}

mongoimport --db wcm-local --collection clients --file ${DIRECTORY}/clients.json && \
mongoimport --db wcm-local --collection configs --file ${DIRECTORY}/configs.json && \
mongoimport --db wcm-local --collection content --file ${DIRECTORY}/content.json && \
mongoimport --db wcm-local --collection licenses --file ${DIRECTORY}/licenses.json && \
mongoimport --db wcm-local --collection lists --file ${DIRECTORY}/lists.json && \
mongoimport --db wcm-local --collection properties --file ${DIRECTORY}/properties.json && \
mongoimport --db wcm-local --collection videos --file ${DIRECTORY}/videos.json

mongo_fixtures / *। json ফাইলগুলি mongoexport কমান্ডের মাধ্যমে তৈরি করা হয়েছিল।

Docker-compose.yaml

version: '3'

services:
  mongo:
    container_name: mongo
    image: mongo:3.2.12
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db:cached
      - ./deploy/local/mongo_fixtures:/fixtures
      - ./deploy/local/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh


volumes:
  mongo-data:
    driver: local

5

যদি আপনার একাধিক ডিমন প্রক্রিয়া চালানো প্রয়োজন হয় তবে ডকার ডকুমেন্টেশনে সুপারভাইজারকে একটি আন-ডিচাচ মোডে ব্যবহার করার জন্য একটি পরামর্শ রয়েছে যাতে সমস্ত সাব-ডেমোন স্টাডআউটে চলে আসবে will

অন্য একটি প্রশ্ন থেকে, আমি আবিষ্কার করেছি যে আপনি চাইল্ড প্রসেসগুলি আউটপুটকে স্টাডাউটে পুনর্নির্দেশ করতে পারেন। এইভাবে আপনি সমস্ত আউটপুট দেখতে পারেন!


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


1

ওয়েট -ফর- ইট বা ডকারাইজ করার মতো একটি সরঞ্জাম ব্যবহার করুন । এগুলি ছোট ছোট র‍্যাপার স্ক্রিপ্ট যা আপনি নিজের অ্যাপ্লিকেশনের চিত্রটিতে অন্তর্ভুক্ত করতে পারেন। অথবা আরও বেশি অ্যাপ্লিকেশন-নির্দিষ্ট কমান্ডগুলি সম্পাদন করতে আপনার নিজের র‍্যাপার স্ক্রিপ্ট লিখুন। অনুসারে: https://docs.docker.com/compose/startup-order/


0

জেনকিন্স ব্যবহারকারী হিসাবে ডকার পাত্রে তৈরি করার জন্য আমার জিনকিনস ধারকটি সেট আপ করার চেষ্টা করার সময় আমি এতে ছুটে এসেছি।

আমি পরে ডকার-রচনা ফাইলটিতে লিঙ্ক করার সাথে সাথে ডকফাইলে ডকার.সক ফাইলটি স্পর্শ করা দরকার। আমি প্রথমে এটি স্পর্শ না করলে এটি এখনও উপস্থিত ছিল না। এটি আমার পক্ষে কাজ করেছে।

Dockerfile:

USER root
RUN apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; 
echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
RUN groupmod -g 492 docker && \
usermod -aG docker jenkins  && \
touch /var/run/docker.sock && \
chmod 777 /var/run/docker.sock

USER Jenkins

Docker-compose.yml:

version: '3.3'
services:
jenkins_pipeline:
    build: .
    ports:
      - "8083:8083"
      - "50083:50080"
    volumes:
        - /root/pipeline/jenkins/mount_point_home:/var/jenkins_home
        - /var/run/docker.sock:/var/run/docker.sock

এটি বিভিন্ন প্রশ্নের উত্তরের মতো বলে মনে হচ্ছে।
কেনারব

-7

";" ব্যবহার করে দেখুন কমান্ডগুলি পৃথক করতে যদি আপনি দুটি ভার্শনে থাকেন

command: "sleep 20; echo 'a'"

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