ইতিমধ্যে বিদ্যমান ডকার পাত্রে আমি কীভাবে একটি কমান্ড চালাব?


492

আমি একটি ধারক তৈরি করেছি -dযাতে এটি ইন্টারেক্টিভ হয় না।

docker run -d shykes/pybuilder bin/bash

আমি দেখতে পাচ্ছি যে ধারকটি বেরিয়ে এসেছে:

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
d6c45e8cc5f0        shykes/pybuilder:latest   "bin/bash"          41 minutes ago      Exited (0) 2 seconds ago                        clever_bardeen

এখন আমি মেশিনে মাঝে মাঝে কমান্ড চালাতে এবং প্রস্থান করতে চাই। শুধু প্রতিক্রিয়া পেতে।

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

আমি প্রস্থান করার পরে ইন্টারেক্টিভ মোডে ফিরে যেতে চাই।

আমি চেষ্টা করেছিলাম:

docker attach d6c45e8cc5f0

তবে আমি পেয়েছি:

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first

তবে আমি যদি এটি শুরু করি তবে তা যাইহোক প্রস্থান করে। 22 ধরো। আমি জিততে পারি না।


আপনি কীভাবে জানলেন যে ডকারের ধারকটি বেরিয়ে এসেছিল? আপনি কোন আদেশ চালনা করেছেন?
থুফির


আপনার যদি কেবল ফাইল সিস্টেমের প্রয়োজন হয়: একটি পৃথক কমান্ডের সাহায্যে একটি থামানো ডকার পাত্রটি কীভাবে শুরু করবেন? (নোট করুন কনটেইনারটি বন্ধ হয়ে গেলে পরিবেশ পরিবর্তনশীল এবং মেমরির অন্যান্য জিনিস ইতিমধ্যে হারিয়ে গেছে।)
ফ্র্যাঙ্কলিন ইউ

উত্তর:


548

অক্টোবর ২০১৪-এ ডকার টিম docker execকমান্ড প্রবর্তন করেছিল : https://docs.docker.com/engine/references/commandline/exec/

সুতরাং এখন আপনি চলমান ধারকটিতে যে কোনও কমান্ড চালাতে পারবেন কেবল তার আইডি (বা নাম) জেনে:

docker exec -it <container_id_or_name> echo "Hello from container!"

নোট করুন যে execকমান্ডটি ইতিমধ্যে চলমান ধারকটিতে কাজ করে। যদি ধারকটি বর্তমানে থামানো হয় তবে আপনাকে প্রথমে নিম্নলিখিত কমান্ড দিয়ে চালানো দরকার:

docker run -it -d shykes/pybuilder /bin/bash

এখানে সর্বাধিক গুরুত্বপূর্ণ বিষয়টি হ'ল -dবিকল্পটি detached। এর মানে কমান্ড আপনাকে প্রথমে ধারক প্রদান করা ( /bin/bash) পটভূমিতে ধারক না করবে না চালানোর করা হবে স্টপ অবিলম্বে


120
এটি থামানো ধারকটিতে কাজ করে না, কেবল একটি চলমান। সুতরাং যদি আপনার কাছে এমন একটি ধারক থাকে যা অবিলম্বে নিজেকে থামিয়ে দেয়, যেমন প্রশ্ন,
ইন্টারফেক্ট

4
@ ইন্টারফেক্টটি সঠিক, এবং সিডিআর এলডিএন এর আরও ব্যাপক উত্তর রয়েছে।
ডাঃ জানু-ফিলিপ গেহর্ক্ক

6
@ জানুয়ারী-PhilipGehrcke Btw এই ব্যক্তির ব্যবহারকারীর নাম থেকে পরিবর্তিত হয়েছে CDR LDNথেকে cdrevনিচে উত্তর (জন্য stackoverflow.com/a/26181666/149428 )।
টেলর এডমিস্টন

3
কেন পাস হচ্ছে -it?
Iulian Onofrei

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

287

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

  • -i সংযুক্ত না থাকলেও STDIN খোলা রাখুন।
  • -t একটি সিডো-টিটিওয়াই বরাদ্দ করুন।

সুতরাং আপনার নতুন runআদেশটি হ'ল:

docker run -it -d shykes/pybuilder bin/bash

আপনি যদি ইতিমধ্যে চলমান ধারকটিতে সংযুক্ত করতে চান:

docker exec -it CONTAINER_ID /bin/bash

এই উদাহরণগুলিতে /bin/bashকমান্ড হিসাবে ব্যবহৃত হয়।


2
চেষ্টা করা docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"এবং মুদ্রিত খালি ভেরিয়েবল (প্রত্যাশিত 1)। আমি কী মিস করছি?
হলুদ 01

'ডকার এক্সিকিউটিভ-কনটনেট আইডি / বিন / ব্যাশ' চালানোর পরে এটি সঠিকভাবে ব্যাশে যায় তবে এটির সাথে ইন্টারঅ্যাক্ট করতে পারে না।
নীল মেঘ

1
তবে আমি যদি ডকার-রচনা ব্যবহার করছি তবে -itএটি উপলব্ধ নেই।
আদনানমুত্তালেব

120

সুতরাং আমি মনে করি উত্তরটি উপরোক্ত অনেক বিভ্রান্তিকর উত্তরের চেয়ে সহজ।

একটি বিদ্যমান ধারক শুরু করতে যা বন্ধ হয়ে গেছে

docker start <container-name/ID>

একটি চলমান ধারক থামাতে

docker stop <container-name/ID>

তারপরে একটি ধারকটির ইন্টারেক্টিভ শেলটিতে লগইন করতে

docker exec -it <container-name/ID> bash

একটি বিদ্যমান কন্টেইনার শুরু করতে এবং এটি একটি কমান্ডে সংযুক্ত করতে

docker start -ai <container-name/ID>

সাবধান, এটি প্রস্থান করার সময় পাত্রে থামবে। তবে সাধারণভাবে, আপনাকে কনটেইনারটি শুরু করতে হবে, আপনার কাজ শেষ হওয়ার পরে এটি সংযুক্ত এবং বন্ধ করতে হবে।


ডকার সংযুক্তি <ধারক-নাম / আইডি> যা চলছে
কুনমিং Xie

9
@ পিটার টি। প্রকৃতপক্ষে, আমি আপনার উত্তরটি অন্যদের সরবরাহের চেয়ে অনেক বেশি সংক্ষিপ্ত দেখতে পেয়েছি। আমি বুঝতে পারি না কেন লোকেরা খুব সাধারণ প্রশ্নকে জটিল করতে পছন্দ করে। ধন্যবাদ পিটার এই উত্তর।
হেলেন নীলি

1
এটির প্রয়োজন যে আপনি যখন ডকার তৈরি করেছিলেন, আপনি এটি- স্ট্যাকওভারফ্লো.com/Qqtions/45216612/… দিয়ে করেছিলেন অন্যথায় এটি শুরু হয় না .. সুতরাং আপনি ডকারের << কন্টেইনার- id> শুরু করুন এবং তারপরে ডক পিএস-এল করবেন এবং আপনি দেখতে পাবেন যে এটি শুরু হওয়ার পরে নেই। এবং তারপরে সংযুক্তি ব্যর্থ হবে। সুতরাং -ও এটি দিয়ে তৈরি করতে হবে।
বারলপ

1
@ পিটার সবচেয়ে প্রাসঙ্গিক উত্তর
নীলাঞ্জন সরকার

1
এটিই সবচেয়ে সঠিক উত্তর!
নগেন্দ্র547

91

ক্যাটরমারের উত্তরে প্রসারিত করার জন্য, যদি ধারকটি বন্ধ হয়ে যায় এবং কোনও ত্রুটির কারণে শুরু করা যায় না, আপনার commitএটির একটি চিত্রের প্রয়োজন। তারপরে আপনি নতুন ছবিতে ব্যাশ চালু করতে পারেন:

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image

1
এফওয়াইআই, আমি এটি এতটাই করেছি যে আমি dshellবিভিন্ন পরিস্থিতিতে স্বয়ংক্রিয়ভাবে এটি করার জন্য ডেকে আনা একটি আদেশ একসাথে রেখেছি
ভি

41

এখানে কয়েকটি উত্তর বিভ্রান্তিমূলক কারণ তারা যে ধারকগুলি চলছে তা বন্ধ রয়েছে concern

সোভেন ডাউইডিট ডকার ফোরামে ব্যাখ্যা করেছিলেন যে ধারকগুলি তাদের প্রক্রিয়াতে আবদ্ধ (এবং ডকার একটি থামানো ধারকটির প্রক্রিয়াটি পরিবর্তন করতে পারে না, সম্ভবত অন্তত এর অভ্যন্তরীণ কাঠামোর কারণে সম্ভবত: https://github.com/docker/docker/issues / 1437 )। সুতরাং, মূলত একমাত্র বিকল্পটি commitকোনও চিত্রের ধারক এবংrun এটি একটি পৃথক কমান্ড সহ।

Https://forums.docker.com/t/run-command-in-stopped-container/343 দেখুন
(আমি বিশ্বাস করি " ENTRYPOINTযুক্তিযুক্ত" পদ্ধতির কোনও কাজ হবে না, যেহেতু আপনি এখনও পরিবর্তন করতে পারবেন না থামানো ধারকটির পক্ষে যুক্তি)


2
বিজ্ঞপ্তি: bin/bashছাড়াই -itপাত্রে কোনও পরিবর্তন হবে না, সুতরাং এটির প্রতিশ্রুতি দেওয়া সত্যিই প্রয়োজনীয় নয় এবং সিডিআর এলডিএন অপের নির্দিষ্ট পরিস্থিতির জন্য সঠিক উত্তর দেয়। তবুও, commitধারক প্রক্রিয়াটি কীভাবে পরিবর্তন করা যায় তার প্রযুক্তিগত সমস্যার উত্তর।
katrmr

নিষ্ক্রিয় ধারক থেকে ভলিউম সহ একটি নিক্ষিপ্ত চিত্র ব্যবহার করার পরামর্শ দিয়ে রান-কমান্ড-ইন-স্টপড কনটেইনারটিতে মোমবাতিয়ের মন্তব্যটি আমার পক্ষে কাজ করেছে: কন্টেইনার -i বিজিবক্স টার সিও / ওয়ার / থেকে ডকার চালান --rm --volume- ডিআইআর | gzip -c> ~ / mydir_backup.tgz
ghেল ghEEz

এটিই জিজ্ঞাসিত প্রশ্নের আসল উত্তর। ধারকগুলি তাদের প্রক্রিয়াতে আবদ্ধ, যাতে আদেশটি পরিবর্তন করা যায় না।
সিজেসিমন

21

আমার কমান্ডটি চালাতে আমাকে বাশ-সি ব্যবহার করতে হয়েছিল: docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"


1
-সি আমার পক্ষে কাজ করেছেন। ভাবছেন কেন একা বাশ কাজ করবে না (প্রম্পট পাবে না)
আন্দ্রে ওয়ার্ল্যাং

18

একটি ধারক তৈরি করা এবং একে একে আদেশ পাঠানো:

docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command

এটি প্রশ্নের উত্তরের উত্তর। আপনি যদি তৈরির পরে কনটেইনারটি শুরু করতে চান এবং এতে "ডকার এক্সিকিউটিভ" কমান্ড সক্ষম করতে চান, আপনাকে ডকার ক্রিয়েড কমান্ডের "-it" পতাকা সহ এটি তৈরি করতে হবে।
joanlofe

8

এটি উপরে একটি সিডিআর এলডিএন উত্তর এবং আমি এখানে পেয়েছি উত্তর ব্যবহার করে তৈরি একটি সম্মিলিত উত্তর ।

নিম্নলিখিত উদাহরণটি একটি চিত্র থেকে একটি আর্চ লিনাক্স ধারক শুরু করে এবং তারপরে gitসেই pacmanসরঞ্জামটি ব্যবহার করে সেই ধারকটিতে ইনস্টল করে :

sudo docker run -it -d archlinux /bin/bash
sudo docker ps -l
sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"

এটাই সব।


5

আপনি যদি শেল স্ক্রিপ্ট চালানোর চেষ্টা করছেন তবে আপনার এটি ব্যাশ হিসাবে চালানো দরকার।

docker exec -it containerid bash -c /path/to/your/script.sh

4

স্টিডিনকে একটি কমান্ড পাইপ করুন

-tএটি কাজ করার জন্য অবশ্যই মুছে ফেলতে হবে :

echo 'touch myfile' | sudo docker exec -i CONTAINER_NAME bash

এটি আরও সুবিধাজনক হতে পারে যে কখনও কখনও সিএলআই বিকল্প ব্যবহার করে।

এর সাথে পরীক্ষিত:

sudo docker run --name ub16 -it ubuntu:16.04 bash

তারপরে অন্য শেলের উপর:

echo 'touch myfile' | sudo docker exec -i ub16 bash

তারপরে প্রথম শেলটিতে:

ls -l myfile

ডকার 1.13.1, উবুন্টু 16.04 হোস্টে পরীক্ষিত।


3

ধরে নেওয়া যায় যে চিত্রটি ডিফল্ট এন্ট্রিপয়েন্ট ব্যবহার করছে /bin/sh -c, দৌড়ন /bin/bashতত্ক্ষণাত ডেমন মোডে প্রস্থান করবে ( -d)। আপনি যদি এই ধারকটিকে একটি ইন্টারেক্টিভ শেল চালনা করতে চান তবে -itপরিবর্তে ব্যবহার করুন -d। আপনি যদি কোনও ধারকটিতে স্বেচ্ছাচারিত কমান্ডগুলি কার্যকর করতে চান যা সাধারণত অন্য প্রক্রিয়া চালায় তবে আপনি চেষ্টা করতে চাইতে পারেন nsenterবা nsinit। বিস্তারিত জানার জন্য https://blog.codecentric.de/en/2014/07/enter-docker-container/ দেখুন ।


3

দুর্ভাগ্যক্রমে এই লক্ষ্য অর্জনে তর্কগুলি ENTRYPOINTদিয়ে ওভাররাইড করা অসম্ভব docker run --entrypoint

দ্রষ্টব্য: আপনি ENTRYPOINT সেটিংটি --entryPoint ব্যবহার করে ওভাররাইড করতে পারেন তবে এটি কেবল বাইনারি নির্বাহ করতে পারে (কোনও sh -c ব্যবহার করা হবে না)।


3

আমি লক্ষ করতে চাই যে শীর্ষ উত্তরটি কিছুটা বিভ্রান্তিকর।

মৃত্যুদন্ড কার্যকর করার বিষয়টি docker runহ'ল প্রতিবারই একটি নতুন ধারক তৈরি করা হয়। যাইহোক, এমন কিছু ক্ষেত্রে রয়েছে যেখানে আমরা পুরানো পাত্রে পুনর্বিবেচনা করতে চাই বা নতুন ধারকগুলির সাথে স্থান গ্রহণ করতে চাই না।

(প্রদত্ত clever_bardeenকনটেইনারটির নাম দেওয়া আছে ...)

ওপি-র ক্ষেত্রে, নিশ্চিত করুন যে নীচের কমান্ডটি প্রয়োগ করে ডকার চিত্রটি প্রথমে চলছে:

docker start clever_bardeen

তারপরে, নিম্নলিখিত কমান্ডটি ব্যবহার করে ডকার পাত্রটি কার্যকর করুন:

docker exec -it clever_bardeen /bin/bash


1

সহজ উত্তর: একই সাথে শুরু করুন এবং সংযুক্ত করুন। এই ক্ষেত্রে আপনি যা চেয়েছিলেন ঠিক তাই করছেন exactly

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME> 

পরিবর্তন নিশ্চিত করুন <CONTAINER_ID/CONTAINER_NAME>



1

আমি উইন্ডোজ ধারক চালাচ্ছি এবং ফাইল এবং ফোল্ডার তৈরি এবং অনুলিপি করার জন্য ডকারের ধারকটির ভিতরে আমার সন্ধান করা উচিত।

এটি করার জন্য আমি ধারকটির অভ্যন্তরে কমান্ড প্রম্পটটি পেতে বা ধারকটির সাথে সংযুক্ত করার জন্য নিম্নলিখিত ডকার এন্ট্রিপয়েন্ট কমান্ডটি ব্যবহার করেছি।

ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"]

এটি আমাকে উভয়ই কমান্ডের প্রম্পট সংযুক্তিতে এবং ধারকটিকে লাইভ রাখতে সহায়তা করেছিল। :)


0

সর্বাধিক সরে যাওয়া কন্টেইনারটি আবার চালু এবং অ্যাক্সেসের দ্রুত উপায়:

docker start -a -i `docker ps -q -l`

0

আমি সাধারণত এটি ব্যবহার করি:

    docker exec -it my-container-name bash

একটি চলমান ধারক সঙ্গে ক্রমাগত ইন্টারঅ্যাক্ট।

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