ডকার রচনা চালিয়ে চালিয়ে যান


94

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

আমি "কমান্ড: [" ঘুম "," 60 "]" এবং অন্যান্য জিনিসগুলি ডকার-কমপোজ.আইএমএলে যুক্ত করার চেষ্টা করেছি তবে যখনই আমি "কমান্ড: ..." আমি কল করতে পারি না "ডকার-কমপোজ আপ" যেহেতু আমি বার্তাটি পাব "পাত্রে শুরু করা যায় না ..... সিস্টেম ত্রুটি: অবৈধ অক্ষর 'কে' মানের শুরু খুঁজছেন"

আমি "সিএমডি স্লিপ 60" যুক্ত করার চেষ্টা করেছিলাম এবং ডকফাইলে নিজেই হোয়াট নট কিন্তু এই আদেশগুলি কার্যকর হয়েছে বলে মনে হয় না।

ধারকটি বাঁচিয়ে রাখার বা আমার যে কোনও সমস্যা সমাধানের সহজ উপায় আছে?

সম্পাদনা: আমি যে রচনাটি চালাতে চাইছি তা এখানে রইল:

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

এটি ঠিক আছে যদি আমি ওএস এক্স এর অধীনে ডকার-রচনা দিয়ে এটি শুরু করি তবে আমি যদি উবুন্টু 16.04 এর অধীনে একই চেষ্টা করি তবে এটি আমাকে ত্রুটির বার্তা দেয় gives

আমি যদি ডকফাইফিলের সাথে পদ্ধতির চেষ্টা করি তবে ডকফাইফিলটি দেখতে এরকম দেখাচ্ছে:

FROM ubuntu:latest
CMD ["sleep", "60"]

যা কিছু করার মনে হয় না

সম্পাদনা 2: আমাকে নিজেকে সংশোধন করতে হবে, ডকফাইফিল এবং ডকর-রচনাটির ক্ষেত্রে একই সমস্যা ছিল তা প্রমাণিত হয়েছে: প্রতিবার আমি ডকফাইফিলের সাথে "সিএমডি ..." যুক্ত করি বা "কমান্ড ..." যুক্ত করি রচনা ফাইল, আমি অবৈধ অক্ষরের সাথে ত্রুটি পেয়েছি। যদি আমি উভয় কমান্ড অপসারণ করি তবে এটি নির্দোষভাবে কাজ করে।


4
দয়া করে ডকার-কমপোজ.আইএমএল, ডকফেরফাইল এবং যে কোনও স্ক্রিপ্ট আপনি ডিবাগ করার চেষ্টা করছেন include
বিএমইচ

উত্তর:


118

আপনি যখন এটি শুরু করবেন তখন কোনও ধারক চালিয়ে যেতে docker-compose, নিম্নলিখিত কমান্ডটি ব্যবহার করুন

command: tail -F anything

সুতরাং আপনার ডকার-কমপোজ.আইএমএল হয়ে যায়

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

এবং আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে পাত্রে প্রবেশ করতে একটি শেল চালাতে পারেন run

docker exec -i -t composename_my-test_1 bash

composenameএমন নামটি যেখানে docker-composeআপনার ধারকগুলিতে প্রিপেন্ড হয়।


4
আপনি যখন পাত্রে এটি সম্পন্ন করবেন তখন কীভাবে থামবেন? Ctrl + C, Ctrl + Z টাইপ কমান্ড আছে? এখনই আমাকে প্রস্থান করতে টার্মিনালটি বন্ধ করতে হবে।
mac10688

আপনি যদি ধারকটির ভিতরে থাকেন তবে আপনি exitআপনার হোস্ট মেশিনে ফিরে যেতে টাইপ করতে পারেন। আপনি যদি আপনার হোস্টে থাকেন তবে ডকার ( docker stop composename_my-test_1) বা ডকার কমপোজ ( docker-compose stop) ব্যবহার করে আপনি ধারকটি থামাতে পারেন ।
নিক সেত্তজে

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

4
@ mac10688 আছে যদি আপনার সংযুক্ত ধারক সেশনে কোন প্রম্পট তারপর Ctrl-ঘ চেষ্টা বিচ্ছিন্ন করতে
স্টার্ক

4
/dev/nullanythingলেজ কমান্ড রেফের জন্য জায়গায় ভাল হবে । stackoverflow.com/a/48732671/248616
নাম জি ভিউ

80

আপনি ttyকনফিগারেশন বিকল্প ব্যবহার করতে পারেন ।

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

দ্রষ্টব্য: আপনি যদি চিত্রের জন্য এবং ডকফাইফিলে ডকফাইফিল ব্যবহার CMDকরেন তবে এই বিকল্পটি কাজ করবে না; তবে, আপনি entrypointরচনা ফাইলটিতে বিকল্পটি ব্যবহার করতে পারেন যা CMDডকফায়াইল থেকে সাফ করে ।


7
এটি কাজ করে, এবং কম হ্যাকি মনে হচ্ছে tail -f /dev/null। এটির সাহায্যে আমি একটি পোস্টগ্রিজ ডাটাবেসের মাধ্যমে একটি ধারকযুক্ত পরিবেশ পরিবেশ চালাতে সক্ষম docker-compose upহয়ে অন্য টার্মিনালটি ব্যবহার করে শেল চালাতে সক্ষম docker exec
সিসিলোক

4
বর্তমানে ভাল নথিভুক্ত। এটি এমন একটি সরকারী বিকল্প যা এই হিসাবে একই প্রভাব অর্জন করবে tail -f /dev/nullবা tail -f anythingদেখুন, এখানে দেখুন: ডকস.ডোকার.com
compose

4
@ এ বি এম রুমান ও সিসিলোক, এটি তখনই কাজ করবে যখন আপনি ডকার-কমপোজ.আইএমএল ফাইলটিতে "কমান্ড" ব্যবহার করবেন না। "কমান্ড" ব্যবহার করার সময় আপনার আর একটি হ্যাক প্রয়োজন - সুতরাং লেজ -F হ্যাকটি এখানে উপযুক্ত।
আসফেল

আপনি ডকফাইফিল এ এন্ট্রিপয়েন্ট ব্যবহার করেন এটি অবশ্যই সেরা উত্তর হতে হবে।
DDKV587

53

26 আগস্ট, 2015 গিটহাব-এ @anand এর মন্তব্যের ভিত্তিতে , কেউ ধারকটি চালিয়ে যেতে tail -f /dev/nullডকার-রচনায় ব্যবহার করতে পারে ।

ডকার-কমপোজ.আইএমএল উদাহরণ

version: '3'
services:
  some-app:
    command: tail -f /dev/null

কেন এই আদেশ?

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


4
কেন ঠিক এই আদেশ? এটি অন্যের চেয়ে ভাল কি করে? আমার ক্ষেত্রে কেবল বাশ শুরু করাই কৌতুকটি করেছিল ...
N4ppeL

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

17
  • বলা একটি ফাইল তৈরি করুন docker-compose.yml
  • ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • একই ডিরেক্টরিতে থাকা, docker-compose up -dটার্মিনাল থেকে চালানো
  • চালান docker psধারক আইডি বা নাম পেতে
  • আপনি চালাতে পারেন docker inspect $container_id
  • আপনি ধারকটি প্রবেশ করতে পারেন এবং একটি বাশ শেল চলমান পেতে পারেন docker-compose exec ubuntu /bin/bashবাdocker-compose exec ubuntu /bin/sh
  • হয়ে গেলে, নিশ্চিত হয়ে নিন যে আপনি ধারকটির বাইরে আছেন এবং চালাবেন docker-compose down

my-docker-shell.shডকার কম্পোজ ফাইল তৈরি করতে, ধারকটি চালাতে, ধারকটিতে লগইন করতে হবে এবং লক আউট করার পরে অবশেষে ডকারের ধারক এবং ডকার কম্পোজ ফাইলটি পরিষ্কার করতে এখানে একটি ছোট বাশ স্ক্রিপ্ট ( ) রয়েছে' s

#!/bin/bash

cat << 'EOF' > ./docker-compose.yml
---

version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    command: /bin/bash
    # tty: true

...
EOF

printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down

rm -v ./docker-compose.yml

4
যদিও এটি প্রশ্নের প্রকৃত উত্তর ছিল না, আমি এটি অত্যন্ত মূল্যবান বলে মনে করেছি! আমি এই পদ্ধতির জন্য গ্লোবাল বাশার্ক ফাংশনগুলি ব্যবহার করতে আরও এগিয়ে গিয়েছিলাম: জিস্ট.github.com/loopmode/4d59a4e9a0a2ffacaec2dd14d44ee8bd
লুপমোড

8

ডকফাইফিলে আপনি কমান্ডটি ব্যবহার করতে পারেন:

{CMD sleep infinity}

2

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


0

শুধু একটি দ্রুত নোট

আমি এর উপর ভিত্তি করে একক চিত্র পরীক্ষা করেছি golang, তাই যখন আমি docker-compose downএখানে যা কল করি তখন যা পাবেন:

version: "3.1"
...
command: tail -f /dev/null   # stopping container takes about 10 sec.
tty: true                    # stopping container takes about 2 sec.

আমার সিস্টেম তথ্য:

Ubuntu 18.04.4 LTS (64-bit)
Docker version 19.03.6, build 369ce74a3c
docker-compose version 1.26.0, build d4451659

-3

ঠিক আছে আমি আমার ভুল খুঁজে পেয়েছি। রচনার জন্য ব্যবহৃত চিত্রটির জন্য ডকফেরে আমি উল্লেখ করেছি যে বেস চিত্রটি উবুন্টু হওয়া উচিত: সর্বশেষ, তবে আমি আগে আমার নিজের দ্বারা উবুন্টু নামে একটি চিত্র তৈরি করেছি এবং সেই চিত্রটি কার্যকর হয়নি। সুতরাং আমি মূল উবুন্টু চিত্রটি ব্যবহার করি নি বরং আমার নিজের ইমেজের একটি দূষিত সংস্করণকে ওবুন্টুও বলে।

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