চলমান ধারক (শ্যাশ ছাড়াই) শেল সেশন শুরু করা কি সম্ভব?


341

আমি নির্বিকারভাবে এই কমান্ডটি চলমান ধারকটিতে ব্যাশ শেল চালানোর জন্য প্রত্যাশা করছিলাম:

docker run "id of running container" /bin/bash

দেখে মনে হচ্ছে এটি সম্ভব নয়, আমি ত্রুটিটি পেয়েছি:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

সুতরাং, যদি আমি চলমান ধারকটিতে বাশ শেলটি চালাতে চাই (নির্ণয়ের উদ্দেশ্যে প্রাক্তন)

আমাকে কী এতে একটি এসএসএইচ সার্ভার চালাতে হবে এবং এসএসএসের মাধ্যমে লগইন করতে হবে?


1
docker run CONTAINER1.0
kolypto

7
যেহেতু ডকার ১.৩ আপনার উত্তরটি
তেমনই করা

1
ঠিকdocker attach container_name
ম্যাক্সবেল্লিক

1
এটি দেখে বোঝা যাচ্ছে যে দ্বিতীয় উত্তরটি আজকাল অ্যাক্সেস করা উত্তরটির চেয়ে অনেক ভাল - আপনি কি গৃহীত উত্তর পরিবর্তন করে পুনর্বিবেচনা করতে পারবেন?
jsbueno

উত্তর:


285

সম্পাদনা: এখন আপনি docker exec -it "id of running container" bash( ডক ) ব্যবহার করতে পারেন

পূর্বে, এই প্রশ্নের উত্তর ছিল:

আপনার যদি সত্যই আবশ্যক এবং আপনি কোনও ডিবাগ পরিবেশে রয়েছেন তবে আপনি এটি করতে পারেন: sudo lxc-attach -n <ID> নোট করুন যে আইডিটি পুরো হওয়া দরকার ( docker ps -notrunc)।

তবে আমি এর বিরুদ্ধে দৃ strongly়ভাবে সুপারিশ করছি recommend

বিজ্ঞপ্তি: -notruncহ্রাস করা হয়েছে, --no-truncশীঘ্রই এটি প্রতিস্থাপন করা হবে।


1
কেন আপনি এর বিরুদ্ধে সুপারিশ করেন?
ম্যাক্স এল।

7
আমি এর বিপরীতে সুপারিশ করছি কারণ 1) এটির জন্য খুব সাম্প্রতিক কার্নেল প্রয়োজন, 2) আপনি ডকারের বাইরে কাজ করছেন যাতে আপনি এটি ট্র্যাক করতে পারবেন না (লগ, সংযুক্তি, ইত্যাদি)। এছাড়াও, ডকার এখনই lxc ব্যবহার করতে পারে তবে চিরকালের জন্য এটি করার কোনও ওয়ারেন্টি নেই।
ক্র্যাক

1
0.7.6 এ আপডেট করার চেষ্টা করুন। ডকার এখনই lxc ব্যবহার করছে এবং lxc-attachঠিক কাজ করা উচিত। আমি মাত্র চেক করে দ্বিগুণ হয়েছি এবং এটি আমার পক্ষে কাজ করে। (দ্রষ্টব্য যে এটি পূর্ববর্তী কার্নেলের সাথে 3.8 এর সাথে কাজ করবে না)।
ক্র্যাক

2
0.9 হিসাবে ডকার আর ডিফল্টরূপে LXC এর সাথে চলবে না। আপনার সাথে Docker deamon আরম্ভ করতে হবেdocker -d -e lxc
kevzettler

2
সর্বোচ্চ এল, আপনার ব্যবহারের ক্ষেত্রে ডেটা ভলিউম দিয়ে সমাধান করা যেতে পারে । পরীক্ষা নেই উদাহরণস্বরূপ: 1) ডাটা ভলিউম মধ্যে nginx লগ দিয়ে চালানো ধারক: docker run -v /var/log/nginx -name somename imagename command; 2) ডাটা ভলিউম কন্টেন্ট দেখতে অন্য ধারক সঞ্চালন করুন: docker run -volumes-from somename -i -t busybox /bin/sh
সিয়াসটেক

615

ডকার ১.৩ সহ একটি নতুন কমান্ড রয়েছে docker exec। এটি আপনাকে একটি চলমান ডকারে প্রবেশ করতে দেয়:

docker exec -it "id of running container" bash

2
এটি আমার জন্য কাজ করে মহান। ডকার রান খুব সহায়ক সংযোজন।
ওরসেরাটা

যদি আমি একটি চলমান ধারকটি কার্যকর করতে গিয়ে পরিবর্তনগুলি করেছি এবং অনলাইনে পরিবর্তনগুলি প্রতিবিম্বিত করতে চাইছি তবে কী হবে? সেরা অনুশীলন কি?
মিডিয়রুট

খুব দরকারী. আপনাকে ধন্যবাদ
luongnv89

docker psচলমান দৃষ্টান্তগুলির আইডি পেতে ব্যবহার করুন
মুন

দ্রষ্টব্য: ধারকটিতে বাশ নাও থাকতে পারে (»exec:" bash ": এক্সিকিউটেবল ফাইল খুঁজে পাওয়া যায় নি«)। docker inspect <image>কী শেল উপলব্ধ তা দেখতে ব্যবহার করুন । যেমন docker exec -it <container id> /bin/shপরিবর্তে রান ।
পিক্সেলব্রিকেট

14

শুধু কর

docker attach container_name

এটা বাঁধন ছাড়া ধারক থেকে মন্তব্য উল্লেখ করা হয়েছে, বিচ্ছিন্ন করতে টাইপ করুন Ctrlpতারপর Ctrlq


5
ধন্যবাদ !! এটা সাহায্য করেছিল. এবং আসল প্রশ্নের প্রসঙ্গে আমি কিছু যুক্ত করতে চাই। আমাদের কনটেইনারটি ডিবাগ করার পরে docker attach container_nameব্যবহার করুন ctrl pএবং ctrl qপরিবর্তে করুন exitexitকমান্ডটি ধারকটিকে থামায়, যেখানে কেবল ctrlpএবং ctrl qকেবল সেই ধারকটিকে আলাদা করে রাখে এবং চালিয়ে যায়
ফিনিক্স

10

যেহেতু জিনিসগুলি অচেনা হচ্ছে, এই মুহূর্তে একটি চলমান ধারক অ্যাক্সেসের প্রস্তাবিত উপায়টি ব্যবহার করছে nsenter

আপনি এই গিথুব সংগ্রহস্থল সম্পর্কে আরও তথ্য পেতে পারেন । তবে সাধারণভাবে আপনি এই জাতীয় ব্যবহার করতে পারেন:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

অথবা আপনি আবরণ ব্যবহার করতে পারেন docker-enter:

docker-enter <container_name_or_ID>

এই বিষয়টির একটি দুর্দান্ত ব্যাখ্যা জারুম পেটাজোনির ব্লগ এন্ট্রিতে পাওয়া যাবে: আপনার ডকারের পাত্রে কেন আপনাকে এসএসডি চালানোর দরকার নেই?


দুর্ভাগ্যক্রমে, এনভির ভেরিয়েবলগুলি এই পদ্ধতির সাহায্যে বিশৃঙ্খলাবদ্ধ হয় (যদি আপনি লিঙ্কের মাধ্যমে তৈরি ভেরিয়েবলগুলি পরীক্ষা করতে চান)। আমি করার পরামর্শ দিচ্ছি source /proc/*/environ
টমাস টোমেসেক

8

প্রথম জিনিস আপনি চালাতে পারবেন না

docker run "existing container" command

কারণ এই কমান্ডটি কোনও ধারক নয় একটি চিত্র প্রত্যাশা করছে এবং এর ফলে এটি একটি নতুন ধারক তৈরি হবে (সুতরাং আপনি যা দেখতে চেয়েছিলেন তা নয়)

আমি এই সত্যের সাথে একমত যে ডকার দিয়ে আমাদের নিজেদেরকে অন্যভাবে চিন্তা করার জন্য চাপ দেওয়া উচিত (সুতরাং আপনার এমন উপায় খুঁজে পাওয়া উচিত যাতে আপনার ধারকটিতে লগ ইন করার দরকার নেই), তবে আমি এখনও এটি দরকারী বলে মনে করি এবং এটিই আমি কীভাবে কাজ করি এটি প্রায়.

আমি ডিমানন মোডে তদারকির মাধ্যমে আমার কমান্ডগুলি পরিচালনা করি।

তারপরে আমি যা বলি তা সম্পাদন করি docker_loop.sh বিষয়বস্তুটি হ'ল এটি:

#!/bin/bash
/usr/bin/supervisord
/usr/bin/supervisorctl
while ( true )
    do
    echo "Detach with Ctrl-p Ctrl-q. Dropping to shell"
    sleep 1
    /bin/bash
done

এটি যা করে তা হ'ল এটি আপনাকে পাত্রে "সংযুক্ত" করতে দেয় supervisorctlএবং লগগুলি থামাতে / শুরু করতে / পুনরায় আরম্ভ করতে এবং পরীক্ষা করতে ইন্টারফেসের সাথে উপস্থাপিত হতে দেয় । যদি এটি পর্যাপ্ত না হয় তবে আপনি এটি করতে পারেন Ctrl+Dএবং আপনি এমন একটি শেল ফেলবেন যা আপনাকে চারপাশে উঁকি দেওয়ার অনুমতি দেবে যেন এটি একটি সাধারণ সিস্টেম।

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


5

এই টানার অনুরোধটির দিকে নজর রাখুন: https://github.com/docker/docker/pull/7409

যা আসন্ন docker exec <container_id> <command>ইউটিলিটি কার্যকর করে । এটি উপলব্ধ হলে উদাহরণস্বরূপ চলমান ধারকটির ভিতরে এসএসএস পরিষেবা শুরু করা এবং বন্ধ করা উচিত।

এটি করারও রয়েছে nsinit: "এনসিনিট চলমান ধারকটির নেমস্পেসের অভ্যন্তরে একটি শেল অ্যাক্সেস করার একটি সহজ উপায় সরবরাহ করে" তবে এটি চালানো কঠিন বলে মনে হচ্ছে। https://gist.github.com/ubergarm/ed42ebbea293350c30a6


docker execডকার ১.৩ এ অবতরণ করেছে, সুতরাং চলমান
ধারকটিতে


1

পাত্রে একটি শেল থাকার আসলে উপায় আছে।

আপনার /root/run.shপ্রসেস, প্রক্রিয়া পরিচালক (সুপারভাইজার), বা যাই হোক না কেন তা অনুমান করুন ।

/root/runme.shকিছু gnu- স্ক্রিন কৌশল দ্বারা তৈরি করুন :

# Spawn a screen with two tabs
screen -AdmS 'main' /root/run.sh
screen -S 'main' -X screen bash -l
screen -r 'main'

এখন, আপনার ট্যাব 0-এ আপনার ডেমন রয়েছে এবং ট্যাব 1 তে একটি ইন্টারেক্টিভ শেল রয়েছে docker attachযে কোনও সময়ে ধারকটির ভিতরে কী ঘটছে তা দেখতে।

আর একটি পরামর্শ হ'ল এই স্ক্রিন কৌশলটি সহ প্রয়োজনীয় সরঞ্জামাদি সহ প্রযোজনার চিত্রের শীর্ষে একটি "বান্ডিল" চিত্র তৈরি করা।


1

এখানে আমার সমাধান

ডকফেরফাইল অংশ:

...
RUN mkdir -p /opt
ADD initd.sh /opt/
RUN chmod +x /opt/initd.sh
ENTRYPOINT ["/opt/initd.sh"]

"initd.sh" এর অংশ

#!/bin/bash
...
/etc/init.d/gearman-job-server start
/etc/init.d/supervisor start
#very important!!!
/bin/bash

চিত্রটি তৈরি হওয়ার পরে আপনার কাছে এক্সিকিউটিভ এবং সংযুক্তি ব্যবহার করে দুটি বিকল্প রয়েছে:

  1. এক্সিকিউট সহ (যা আমি ব্যবহার করি), চালান:

ডকার রান - নাম $ CONTAINER_NAME -dt $ IMAGE_NAME

তারপর

ডকার এক্সিকিউটিভ ONT CONTAINER_NAME / বিন / বাশ

আর ব্যবহার করুন

বিচ্ছিন্ন করতে সিটিআরএল + ডি

  1. সংযুক্তি সহ, চালান:

ডকার চালান - নাম $ CONTAINER_NAME - সম্পাদনা করুন $ IMAGE_NAME

তারপর

ডকার সংযুক্তি $ CONTAINER_NAME

আর ব্যবহার করুন

বিচ্ছিন্ন করতে CTRL + P এবং CTRL + Q

অপশন মধ্যে পার্থক্য প্যারামিটার হয় -i


1

দুটি উপায় আছে।

সংযুক্তি সহ

$ sudo docker attach 665b4a1e17b6 #by ID

এক্সিকিউট সহ

$ sudo docker exec - -t 665b4a1e17b6 #by ID

0

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

http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/


0

কনটেইনার চলাকালীন এটি কার্যকর হ'ল নাম। আপনার ধারক_আইডি রেফার দরকার নেই।

docker run --name container_name yourimage docker exec -it container_name bash


0

প্রথমে, পছন্দসই ধারকটির ধারক আইডি পেয়ে যান

docker ps

আপনি এই জাতীয় কিছু পাবেন:

CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                          PORTS                    NAMES
3ac548b6b315        frontend_react-web     "npm run start"     48 seconds ago      Up 47 seconds                   0.0.0.0:3000->3000/tcp   frontend_react-web_1

এখন এই ধারক আইডিটি অনুলিপি করুন এবং নিম্নলিখিত কমান্ডটি চালান:

docker exec -it container_id sh

docker exec -it 3ac548b6b315 sh


-2

পাত্রে বিকাশকালে আপনি ভিএমএসের বিবেচনায় আমার মতো ভ্রান্ত হয়ে থাকতে পারেন। আমার পরামর্শ: না করার চেষ্টা করুন।

ধারকগুলি অন্য যে কোনও প্রক্রিয়ার মতোই। প্রকৃতপক্ষে আপনি ডিবাগিংয়ের উদ্দেশ্যে তাদের সাথে "সংযুক্ত" করতে চাইতে পারেন (/ proc // env বা strace -p সম্পর্কে ভাবেন) তবে এটি একটি খুব বিশেষ ক্ষেত্রে।

সাধারণত আপনি প্রক্রিয়াটি কেবল "চালান", সুতরাং আপনি যদি কনফিগারেশনটি পরিবর্তন করতে চান বা লগগুলি পড়তে চান তবে একটি নতুন ধারক তৈরি করুন এবং নিশ্চিত করুন যে আপনি স্ট্যান্ডআউটে লিখিতভাবে ডিরেক্টরিগুলি ভাগ করে এর বাইরে লগগুলি লিখেছেন (সুতরাং ডকার লগগুলি কাজ করে) বা এই জাতীয় কিছু।

ডিবাগিংয়ের উদ্দেশ্যে আপনি শেলটি শুরু করতে চাইতে পারেন, তারপরে আপনার কোডটি, তারপরে শেলটি অক্ষত রাখতে CTRL-p + CTRL-q টিপুন। এইভাবে আপনি আবার ব্যবহার করতে পারেন:

docker attach <container_id>

আপনি যদি ধারকটি ডিবাগ করতে চান কারণ এটি এমন কিছু করছেন যা আপনি প্রত্যাশা করেননি, তবে এটি ডিবাগ করার চেষ্টা করুন: /server/596994/how-can-i-debug-a-docker-container -আরম্ভ


এটি সম্পূর্ণ ভুল। আপনার অ্যাপ্লিকেশনটি যে LXC নেমস্পেসে চলছে সেটিকে অন্তর্স্পষ্ট করতে সক্ষম হওয়া একটি "খুব বিশেষ বিষয়" নয়, এটি কোনও বিকাশকারীর পক্ষে সাধারণ / নিত্য ক্রিয়াকলাপ।
স্লিপকালাল

@ ঘুমন্ত "কোনও বিকাশকারী" কিছুটা পক্ষপাতদুষ্ট শোনায়। যে কোনও ক্ষেত্রে আমি প্রক্রিয়াগুলির অন্তঃকরণ ব্যবহার করি তাই একই জিনিসটি পাত্রে প্রযোজ্য। এটি ডিবাগিংয়ের পিছনে ধারণা। আপনি প্রক্রিয়াটির সাথে একটি ডিবাগার সংযুক্ত করেন (যার কোনও ক্লিপ থাকতে পারে)। আপনি ধারকটিতে "লগ ইন" হয়ে আছেন তা ভেবে আমার এখনও বিভ্রান্ত করছে।
এস্তানি

-4

না এটি সম্ভব নয়। supervisordযদি প্রয়োজন হয় তবে এসএসএস সার্ভার পাওয়ার মতো কিছু ব্যবহার করুন । যদিও, আমি অবশ্যই প্রয়োজন প্রশ্ন।

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