"ডকার রান-ডি" এর পরে ডকারের ধারক স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে


333

আমি এখনও অবধি পড়া টিউটোরিয়াল অনুসারে, ব্যবহার " docker run -d" চিত্র থেকে একটি ধারক শুরু করবে এবং ধারকটি পটভূমিতে চলবে। এটি দেখতে কেমন দেখাচ্ছে, আমরা দেখতে পাচ্ছি যে ইতিমধ্যে আমাদের ধারক আইডি রয়েছে।

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

তবে আমি যদি দৌড়ে " docker ps" যাই , তবে কিছুই ফিরে আসে না।

সুতরাং আমি চেষ্টা করেছি " docker ps -a", আমি ইতিমধ্যে কন্টেইনারটি দেখতে পেয়েছি:

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

আমি কিছু ভুল করেছি? আমি কীভাবে এই সমস্যাটি সমাধান করব?


1
"ডকার রান হ্যালো-ওয়ার্ল্ড" <== পুরোপুরি কাজ করে তবে আমি যদি "ডকার রান-হ্যালো-ওয়ার্ল্ড" চালাই তবে আমি চলমান ধারক পেতে পারি না।
জে জন

5
আমার অনুরূপ সমস্যা ছিল তবে আমি এটি ব্যবহার করে এটি কাজ করেছিলাম এটি docker run -it -d <image> /bin/bashএকটি ব্যাশ শেল ইন্টারেক্টিভভাবে শুরু করে এবং ধারকটি বন্ধ করে দেয় না কারণ শেল প্রক্রিয়া সক্রিয় রয়েছে।
Rtsne42

উত্তর:


495

CentOS dockerfile একটি ডিফল্ট কমান্ড রয়েছে bash

তার অর্থ, ব্যাকগ্রাউন্ডে চালিত হওয়ার পরে ( -d) শেলটি তত্ক্ষণাত্ প্রস্থান করে।

আপডেট 2017

Docker অনুমোদন এর আরো সাম্প্রতিক সংস্করণে উভয় একটি ধারক চালানোর জন্য বিচ্ছিন্ন মোড এবং মধ্যে ফোরগ্রাউন্ড মোড ( -t, -iবা -it)

সেক্ষেত্রে আপনার অতিরিক্ত কমান্ডের দরকার নেই এবং এটি যথেষ্ট:

docker run -t -d centos

ব্যাশ পটভূমিতে অপেক্ষা করবে।
যে প্রাথমিকভাবে রিপোর্ট পেশ করে কল্যাণী-chaudhari এর উত্তর এবং বিস্তারিত জার্সি শিম এর উত্তর

vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

নোট যে জন্য আলপাইন , Marinos একটি রিপোর্ট মন্তব্য :

docker run -t -d alpine/gitপ্রক্রিয়া চালিয়ে যায় না।
করতে হয়েছিল:docker run --entrypoint "/bin/sh" -it alpine/git


আসল উত্তর (২০১৫)

এই নিবন্ধে উল্লিখিত হিসাবে :

সঙ্গে চললে পরিবর্তে docker run -i -t image your-commandব্যবহার -dবাঞ্ছনীয় কারণ আপনার শুধু একটা কমান্ড সঙ্গে আপনার ধারক চালাতে পারেন এবং আঘাত দ্বারা আপনাকে পাত্রের আলাদা টার্মিনাল প্রয়োজন হবে না Ctrl+ + P+ + Q

তবে -dবিকল্পের সাথে সমস্যা আছে । কমান্ডগুলি অগ্রভাগে চলমান না থাকলে আপনার ধারকটি অবিলম্বে থামবে
অগ্রভাগে চলমান রাখার জন্য ডকারের আপনার কমান্ডের প্রয়োজন। অন্যথায়, এটি মনে করে যে আপনার অ্যাপ্লিকেশনগুলি কন্টেনারটি বন্ধ করে বন্ধ করবে।

সমস্যাটি হ'ল কিছু অ্যাপ্লিকেশন অগ্রভাগে চালিত হয় না। কীভাবে আমরা এটি আরও সহজ করতে পারি?

এই পরিস্থিতিতে, আপনি tail -f /dev/nullআপনার কমান্ড যুক্ত করতে পারেন ।
এটি করে, আপনার প্রধান কমান্ডটি পটভূমিতে চলতে থাকলেও, আপনার ধারকটি থামবে না কারণ পূর্বে অগ্রভাগে লেজ চলমান রয়েছে।

সুতরাং এটি কাজ করবে:

docker run -d centos tail -f /dev/null

docker psসেন্টো কনটেইনারটি এখনও চলমান দেখায়।

সেখান থেকে আপনি এটিকে সংযুক্ত করতে বা এটি থেকে বিচ্ছিন্ন করতে (বা docker execকিছু আদেশ) commands


দুঃখিত, আরও একটি প্রশ্ন, আমার একটি স্ক্রিপ্ট শুরুতে চালানো দরকার, দেখে মনে হচ্ছে /etc/rc.d/rc.local আর কাজ করে না (আমার মানসিকতা এখনও ওএসের মতো ডকারের সাথে চিকিত্সা করছে), আমি ধরে নিই যে ডকার ফাইলটি এতে আরও ভাল বিকল্প কেস?
জে জন

5
@ গুরুপ্রসাদজিভি এটি প্রত্যাশিত ডকার সংযুক্তি ব্যবহারের পরিবর্তে ব্যবহার করুন docker exec -it <yourContainer> bash
ভোনসি

3
আপনি যদি কোনও এন্ট্রিপয়েন্ট ফাইলের শেষে টেল কমান্ড যুক্ত করেন তবে এটিও কাজ করে।
ইয়ারা

2
আমি sshd কে আমার শেষ (দীর্ঘকালীন) কমান্ড হিসাবে ব্যবহার করেছি। তারপরে আপনি কোনও ভিএম-তে যেমন আপনার কন্টেইনারটি চালাতে পারেন (একবার আপনি .ssh / अधिकृत_কিগুলি ইত্যাদি সেট করেন) ... আপনি উত্তরীয় ব্যবহার করে ধারকটি কনফিগার করতেও যেতে পারেন।
অ্যান্ড্রু পেট

1
আমি আমার কমান্ডটি এবং উপরে তালিকাভুক্ত পুরানো ফিক্স কার্যকর করতে এই কাজটি শেষ করেছি: ডকার চালিত চিত্র_নাম / বিন / বাশ -c "আমার / কমান্ড & লেজ -f / দেব / নাল"
জর্ডি

58

এই উত্তর অনুসারে , -tপতাকা যুক্ত করা পটভূমিতে চলার সময় ধারকটিকে প্রস্থান করতে বাধা দেবে। তারপরে আপনি docker exec -i -t <image> /bin/bashশেল প্রম্পটে প্রবেশ করতে ব্যবহার করতে পারেন।

docker run -t -d <image> <command>

দেখে মনে হচ্ছে যে -t বিকল্পটি খুব ভালভাবে নথিভুক্ত করা হয়নি , যদিও সহায়তা বলেছে যে এটি "সিডো-টিটিওয়াই বরাদ্দ করে।"


10
খুশী হলাম। অ্যাডেন্ডিংয়ের চেয়ে কম হ্যাকি মনে হচ্ছেtail -f /dev/null
Scarysize

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

2
docker run -t -d --name mysql -p 3306:3306 mysql- আমার পক্ষে কাজ করে না (উবুন্টু 14.04.5): STATUS = প্রস্থানিত (1) 4 সেকেন্ড আগে
পুত্নিক

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

43

পটভূমি

একটি ডকার ধারক একটি প্রক্রিয়া চালায় ("কমান্ড" বা "এন্ট্রিপয়েন্ট") যা এটিকে জীবিত রাখে। কমান্ড চালানো অবধি চালক চালিয়ে যাবে The

আপনার ক্ষেত্রে, কমান্ডটি ( /bin/bash, ডিফল্টরূপে, centos:latestঅনতিবিলম্বেই) বের হচ্ছে (যেমন বাশ যখন এটি টার্মিনালের সাথে সংযুক্ত না থাকে এবং চালানোর মতো কিছুই থাকে না)।

সাধারণত, আপনি যখন ডিমন মোডে (সাথে -d) একটি ধারক চালান, তখন ধারকটি কিছু ধরণের ডেমন প্রক্রিয়া চালিত করে (যেমন httpd)। এই ক্ষেত্রে, যতক্ষণ না httpd ডিমন চলমান থাকবে ততক্ষণ কনটেইনারটি বেঁচে থাকবে।

আপনি যা করার চেষ্টা করছেন বলে মনে হচ্ছে তা হ'ল কনটেইনারটি ডেমোন প্রক্রিয়া ব্যতীত কনটেইনারটি বাঁচিয়ে রাখা। এটি কিছুটা অদ্ভুত (কারণ ধারক এটির সাথে কার্যকর না হওয়া অবধি কার্যকর কিছু করতে পারে না docker exec), তবে এমন কিছু ঘটনা রয়েছে যেখানে এটি এরকম কিছু করার জন্য বোধগম্য হতে পারে।

(আপনি কি ধারকটির ভিতরে বাশ প্রম্পটে পৌঁছানোর অর্থ দিয়েছিলেন? এটি সহজ! docker run -it centos:latest)

সমাধান

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

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

বিকল্প সমাধান

সিজেসিমন দ্বারা নির্দেশিত হিসাবে, -tবিকল্পটি "সিডো-টিটি" বরাদ্দ করে। এই ঠাট কারণ এটি মনে করে এটি একটি ইন্টারেক্টিভ tty (যদিও আপনি এই বিশেষ পির TTY সাথে যোগাযোগ করার জন্য যদি আপনি পাস না কোন উপায় আছে সাথে সংযুক্ত করা হয় অনির্দিষ্টকালের জন্য চালানো অব্যাহত মধ্যে bash -i)। যাইহোক, এটিও কৌশলটি করা উচিত:

$ docker run -t -d centos:latest

-tঅন্যান্য অদ্ভুত মিথস্ক্রিয়া উত্পাদন করবে কিনা তা 100% নিশ্চিত নয় ; যদি এটি করে তবে নীচে একটি মন্তব্য দিন।


মনে রাখবেন যে ব্যাসিবক্সের ঘুম গ্রহণ না করে এটি আলপাইনটিতে কাজ করে না infinity
জন কুগেলম্যান

এটি আমাকে একটি অ্যামাজন-লিনাক্স চিত্রটি সমস্যা সমাধানে সহায়তা করেছে, আপনাকে ধন্যবাদ
প্রভাবশালী

18

হাই এই সমস্যাটি হ'ল কারণ পাত্রে কোনও চলমান অ্যাপ্লিকেশন না থাকলে ডকার পাত্রে প্রস্থান করা হবে।

-d 

ডিমন মোডে কেবল একটি ধারক চালানো বিকল্প।

সুতরাং আপনার ধারককে অবিচ্ছিন্নভাবে চালানোর কৌশলটি ডকারে থাকা একটি শেল ফাইলের দিকে নির্দেশ করা যা আপনার অ্যাপ্লিকেশনটি চালিয়ে রাখবে You আপনি একটি স্টার্ট.শ ফাইল দিয়ে চেষ্টা করতে পারেন

Eg: docker run -d centos sh /yourlocation/start.sh

এই start.sh একটি শেষ না হওয়া অ্যাপ্লিকেশন নির্দেশ করা উচিত।

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

শুভকামনা


12

আপনি যা চান তা পূরণ করতে পারেন:

docker run -t -d <image-name>

অথবা

docker run -i -d <image-name>

অথবা

docker run -it -d <image-name>

অন্যান্য উত্তরের পরামর্শ অনুসারে কমান্ড প্যারামিটার (যেমন টেল -f / dev / নাল) সম্পূর্ণ optionচ্ছিক, এবং আপনার পাত্রটি পটভূমিতে চলতে না পাওয়ার প্রয়োজন হয় না।

এছাড়াও ডকার ডকুমেন্টেশন নোট করুন পরামর্শ দেয় যে -i এবং -t বিকল্পগুলি একত্রিত করার ফলে এটি শেলের মতো আচরণ করবে।

দেখা:

https://docs.docker.com/engine/reference/run/#foreground


9

ENTRYPOINTআমার ডকার ফাইলটিতে এই কোড স্নিপেট চালানো আছে :

while true
do
    echo "Press [CTRL+C] to stop.."
    sleep 1
done

বিল্ট ডকার চিত্রটি এইভাবে চালান:

docker run -td <image name>

ধারক শেলটিতে লগ ইন করুন:

docker exec -it <container id> /bin/bash

আপনি কি এর জন্য অসীম লুপটি সমাধান করেছেন এটিই কি সমাধান? : ডি
মুহাম্মদ সলম্যান

8

নিম্নলিখিত আদেশ কমান্ড:

docker run -t -d <image-name>

আপনি যদি পোর্ট নির্দিষ্ট করতে চান তবে নীচের মত কমান্ড দিন:

docker run -t -d -p <port-no> <image-name>

নিম্নলিখিত কমান্ডটি ব্যবহার করে চলমান ধারকটি যাচাই করুন:

docker ps

আমি আসলে এই উত্তরটি সবচেয়ে ভাল পছন্দ করি, কারণ সর্বাধিক জনপ্রিয় উত্তর থেকে বোঝা যায় যে আপনার একটি কমান্ডের প্রয়োজন (যেমন টেইল -f / দেব / নাল)। কমান্ডটি সম্পূর্ণ alচ্ছিক। এখানে কীটি ব্যবহার করতে হবে। আমি -t এর জায়গায় আমি -i কাজও পেয়েছি, অথবা আপনি উভয়-এটি সম্মিলিতও ব্যবহার করতে পারেন (ডকুমেন্টেশন হিসাবে এটি শেল হিসাবে চলবে)।
জার্সি শিম

-t -dবনাম ব্যবহারের কোনও সুবিধা আছে কি -i -d? দুটোই ধারক চালিয়ে রাখবে।
উইসবাকি

5

অগ্রভাগে চলমান রাখার জন্য ডকারের আপনার কমান্ডের প্রয়োজন। অন্যথায়, এটি মনে করে যে আপনার অ্যাপ্লিকেশনগুলি কন্টেনারটি বন্ধ করে বন্ধ করবে।

সুতরাং যদি আপনার ডকার এন্ট্রি স্ক্রিপ্টটি নীচের মত একটি পটভূমি প্রক্রিয়া:

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &

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

tail -f server.log

touchআপনি যদি কোনও লগ ফাইল খুঁজে না পান তবে প্রথমে সেই ফাইলটি করতে চান ।
স্যামুয়েল এলহ

সাধারণত আমি যে লেগ ফাইলটি লেজ করি তা হ'ল বর্তমান সার্ভার লগ বা পুনঃনির্দেশ আউটপুট, যা প্রক্রিয়া শুরু হওয়ার পরে ইতিমধ্যে সেখানে উপস্থিত হওয়া উচিত।
হুম

4

ভিতরে কাজটি সম্পন্ন হলে ডকারের ধারকটি প্রস্থান করে, সুতরাং যদি কোনও কাজ না থাকে বা ইতিমধ্যে সেগুলি শেষ করেও আপনি এটিকে বাঁচিয়ে রাখতে চান আপনি তা করতে পারেন docker run -di image। আপনি docker container lsএটি করার পরে আপনি এটি চলমান দেখতে পাবেন।


3

হতে পারে এটি কেবলমাত্র আমি কিন্তু সেন্টোস .3.৩.১11১১ এবং ডকার ১.১২.২ এ, তবে আমি নির্ভরযোগ্যভাবে এটির কাজ পেতে @ ভনসি এবং @ ক্রিসটফার সাইমন দ্বারা পোস্ট করা উত্তরগুলির সংমিশ্রণটি ব্যবহার করে শেষ করেছি। সফলভাবে সিএমডি চালানোর পরে কন্টেনারটি বের হওয়ার আগে এটি করার আগে আমি কিছুই করি নি। আমি ওরাকল-এক্সে -11 জিআর 2 এবং এসএসডি শুরু করছি।

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

তারপরে -d -t এবং -i যোগ করুন

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

অবশেষে ঘন্টার পর ঘন্টা আমার দেওয়ালের বিরুদ্ধে মাথা ঠেকানো

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

লেজ -f সরানো থাকলে, বা -t -d -i বিকল্পগুলির কোনও বাদ দেওয়া থাকলে উপরের সিএমডি সম্পাদনের পরে উপরের যে কারণেই না হয়।



1

আমার একই সমস্যা ছিল, কেবলমাত্র এটির জন্য ব্যাশ দিয়ে অন্য একটি টার্মিনাল খোলার বিষয়টি আমার পক্ষে কাজ করেছিল:

ধারক তৈরি করুন:

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

শুরু পাত্রে:

docker start 52bbc9b30557

ধারক চালিয়ে যেতে বাশ শুরু করুন:

docker exec -it 52bbc9b30557 bash

আপনার প্রয়োজনীয় প্রক্রিয়া শুরু করুন:

docker exec -it 52bbc9b30557 /path_to_cool_your_app

1

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

&& /bin/bash

সংক্ষিপ্তভাবে আপনার ডকফাইফিলের শেষটি দেখতে এর মতো কিছু দেখাবে।

...

CMD ls && ... && /bin/bash

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


1

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

ইন্টারেক্টিভ মোড সহ এবং ছাড়াই চিত্র চালানোর উদাহরণ এখানে

চৈত্র @ আরএসকে-আইএনডি-বিএলআর-এল06: ~ / ডকর্সরা $ সুডো ডকার রান-ডি-টিট-আই টেস্ট_গেইন 1.0 বি 6 বি 9 এ 942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18

চৈত্র @ RSK-IND-BLR-L06: 6 / ডকর্স kers সুডো ডকার পিএস

কন্টেইনার আইডি ইমেজ কম্যান্ড তৈরি স্ট্যাটাস পোর্টস নাম

চৈত্র @ আরএসকে-আইএনডি-বিএলআর-এল06: ~ / ডকর্সরা $ সুডো ডকার চালিত -ড-টি -আই টেস্ট_গেইন 1.0 বাশ সি 3 ডি 6 এ 9529fd70c5b2dc2d7e90fe662d19c6 داد 8549 e9c812fb2b7ce2105d7ff5

চৈত্র @ RSK-IND-BLR-L06: 6 / ডকর্স kers সুডো ডকার পিএস

কনটেনার আইডি ইমেজ কম্যান্ড ক্রেডিটড স্ট্যাটাস পোর্টস নাম সিএসডি 3 এএল 9529fd7 টেস্ট_গেইন 1.0 "বাশ" 2 সেকেন্ড আগে উপরে 1 সেকেন্ড অসাধারণ_হৈবত


0

আপনি যদি ধারকটিতে চালনা করতে চান তবে এটিকে বাঁচিয়ে রাখতে আপনার অগ্রভাগে চালানো দরকার।


-1

আর্গুমেন্ট অর্ডার বিষয়

জার্সি বিনের উত্তর (সমস্ত 3 উদাহরণ) আমার পক্ষে কাজ করেছে। বেশ খানিকটা বিচার এবং ত্রুটির পরে আমি বুঝতে পারি যে আর্গুমেন্টের ক্রমটি গুরুত্বপূর্ণ।

পটভূমিতে পাত্রে চলমান রাখে: docker run -t -d <image-name>

অগ্রণীতে পাত্রে চলমান রাখে: docker run <image-name> -t -d

পাওয়ারশেল ব্যাকগ্রাউন্ড থেকে আসা আমার পক্ষে স্পষ্ট ছিল না।

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