ব্যাকগ্রাউন্ড মোডে চলমান ধারকটিতে কীভাবে বাশ বা এসএসএস পাবেন?


933

আমি চলমান ডকার পাত্রে এসএসএস বা বাশ করতে চাই। দয়া করে উদাহরণ দেখুন:

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

এখন আমি এই জাতীয় কিছু পেতে চাই (চলমান ধারক মধ্যে যেতে):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

আমি ভ্যাগ্র্যান্ট ব্যবহার করেছি এবং আমিও তেমন আচরণ করতে চাই vagrant ssh


বিকল্পভাবে sudo docker exec -i -t 665b4a1e17b6 /bin/sh
অ্যাপ্লিকেশন

1
নোট করুন যে চলমান ধারকটিতে এসএসএইচ ব্যবহার করা খারাপ অভ্যাস - এখানে যুক্তি দেখুন । sudo docker exec -i -t container-name /bin/bashএকটি উপায়।
patryk.beza

উত্তর:


1306

উত্তরটি ডকারের attachআদেশ। সুতরাং উপরে আমার উদাহরণের জন্য সমাধানটি হ'ল:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

ডকার সংস্করণ ১.৩ বা তার পরবর্তী সংস্করণের জন্য: ব্যবহারকারী ওয়াইআর 3 ডি এর জন্য ধন্যবাদ যিনি ধারক শেলটি পেতে আরও একটি উপায় প্রস্তাব করেছিলেন। আমরা যদি ব্যবহার attachকরি তবে আমরা কেবল শেলের একটি উদাহরণ ব্যবহার করতে পারি। সুতরাং যদি আমরা কোনও ধারকের শেলের নতুন উদাহরণ সহ একটি নতুন টার্মিনাল খুলতে চাই, আমাদের কেবল নিম্নলিখিতটি চালানো দরকার:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

অথবা

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

5
বিকল্পভাবে, কার্যকর করুনsudo docker attach loving_heisenberg
থিয়াগো পেরোত্তা

50
সংযুক্তি কমান্ডটি আমার পক্ষে কাজ করে না, এটি ডকারকে হিমশীতল করে তোলে .. কোনও ধারণা কেন এটি ঘটছে?
মো জে মুঘরবী

10
Boot2docker ব্যবহারকারীদের জন্য একটি অনুস্মারক: উবুন্টু অপসারণ :)
Henno

17
-i -tসমান-it
pasha.zhukov

46
এটি নির্বাচিত হওয়া এবং এত বেশি ভোট দেওয়া একটি বিপজ্জনক উত্তর। docker attachউদাহরণস্বরূপ, একটি মঙ্গোডিবি উদাহরণস্বরূপ ইঙ্গিতটি নিহত করবে। যেমন এই প্রশ্নে আরও বিশদে ব্যাখ্যা করা হয়েছে attachএবং execবিভিন্ন প্রাণী।
এফডাব্লুসি

674

ডকার থেকে 1.3 পরবর্তী:

docker exec -it <containerIdOrName> bash

মূলত, যদি ডকার পাত্রে /bin/bashকমান্ডটি ব্যবহার শুরু করা হয় তবে আপনি এটি ব্যবহার করে অ্যাক্সেস করতে পারবেন attach। যদি তা না হয়, তাহলে আপনি কমান্ড চালানো ধারক ব্যবহার ভিতরে ব্যাশ উদাহরণস্বরূপ তৈরি করতে হবে exec

বাশকে দুর্বৃত্ত প্রক্রিয়ায় চালিয়ে না ফেলে বাশকে প্রস্থান করতে:

exit

হ্যাঁ, এটা সহজ।


এখনও ন্যানো কীভাবে কাজ করতে যায় তা নির্ধারণ করতে পারেনি। ভাবুন যা ফিউশন থেকে ডকার-এসএসএস জড়িত থাকতে পারে
WiR3D

ডকার্সে ডিফল্টভাবে বাশ সেট করার কোনও উপায় আছে কি?
ipacocks 13

@ পাইককস হ্যাঁ, যদি ডকফেরফিলের RUNকমান্ডটি হয় /bin/bash। তবে আপনি যা বলতে চাইছেন তা নির্ভর করে। আপনি যদি -it
ধারকটি

10
ডকার গ্রুপ ব্যবহার করা খারাপ অভ্যাস। কোনও ব্যবহারকারী যা ডকার গ্রুপে রয়েছে মূলত মূলত অনুমোদনের সাথে sudo ব্যবহারের প্রয়োজন ছাড়া ব্যবহার করা হয়। projectatomic.io/blog/2015/08/…
মরি

1
আমি মনে করি যে কোনও হোস্ট সুরক্ষা দৃষ্টিকোণ থেকে, আপনি sudoবনাম dockerগ্রুপ ব্যবহার করেন কিনা তা খুব বেশি পার্থক্য রাখে না । যে কোনও উপায়েই, ডকারে নির্মিত একটি সুরক্ষা গর্ত রয়েছে যা অতিথির কাছ থেকে হোস্ট ফাইল সিস্টেমে পুরোপুরি সুযোগ-সুবিধা সরবরাহ করতে পারে - আপনি ডকার গ্রুপটি ব্যবহার করেন বা sudoকনটেইনারটি চালু না করেই নির্বিশেষে ।
নোটার

123

যদিও প্রশ্নের লেখক স্পষ্টভাবে বলেছেন যে তারা চলমান ধারকটিতে আগ্রহী, তবে এটিও লক্ষণীয় যে কনটেইনারটি চলমান না থাকলেও আপনি এটি চালাতে চান আপনার চারপাশে ছুটে যেতে পারে:

docker run -i -t --entrypoint /bin/bash <imageID>


10
এটি @ ক্র্যাকসরের উত্তরের মতো একটি আলাদা ধারক দেয়।
ব্লেজারব্লেড

27

এটা চেষ্টা কর:

sudo docker run -i -t webserver /bin/bash

সূত্র: https://docs.docker.com/articles/basics/#running-an-interactive-shell


14
এটি উপযুক্ত নয়, কারণ আমি আলাদা root@42f1e37bd0e5:/#root@665b4a1e17b6:/#
কন্টেইনার

লিঙ্কটি মারা গেছে, আপনার আপডেট করা উচিত
আহমেত করাকায়া

18

@ তৈমুরের উত্তরের ভিত্তিতে আমি নিম্নলিখিত হস্ত স্ক্রিপ্ট তৈরি করেছি

সেটআপ

নিম্নলিখিত বিষয়বস্তু দিয়ে docker-sshআপনার ফাইল রাখুন$PATH

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

উল্লেখ্য : কিছু ধারক থাকে না bash, কিন্তু ash, shইত্যাদি এই সব ক্ষেত্রে bashউপরে লিপিতে প্রতিস্থাপিত হইবে।

ব্যবহার

আপনার যদি কেবল একটি চলমান দৃষ্টান্ত থাকে তবে কেবল চালান

$> docker-ssh 

অন্যথায়, এটি আপনি docker ps(প্রথম কর্নাল) থেকে প্রাপ্ত একটি ডকার আইডি প্যারামিটার সরবরাহ করুন

$> docker-ssh 50m3r4nd0m1d

আমি জানতে পারি কেন আমাদের শেষে -l দরকার?
নাম জি ভিউ

লগইন শেল হিসাবে বাশ শুরু করতে, পরিবেশের প্যারামিটারগুলি পড়ার জন্য (কমান্ডের উপরের লাইনে বর্ণিত)
মাত্যাস

11

যদি আপনার ধারকটিতে ব্যাশ ইনস্টল না থাকে আপনি sh চেষ্টা করতে পারেন:

docker exec -it CONTAINER /bin/sh

অথবা প্রথমে / বিনে শেলগুলি সন্ধান করুন:

docker export CONTAINER|tar -t|egrep ^bin/

কি "কনসাল" ? আপনার কি এটির জন্য একটি রেফারেন্স আছে? আপনার অর্থ "কনসোল" ?
পিটার মর্টেনসেন

9

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

আপনার যদি 'ওয়েব-সার্ভার 1' নামের একটি ধারক থাকে। নিম্নলিখিত ডকার রান কমান্ডটি একটি দ্বিতীয় ধারক শুরু করবে যা প্রথম ধারকটির জন্য এসএসএইচ সরবরাহ করবে।

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

আরও পয়েন্টারগুলির জন্য, https://github.com/jeroenpeeters/docker-ssh দেখুন out


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
Nam

যাইহোক, আপনার সমাধানটি ব্যবহার করে আমরা কীভাবে .brcrc অটো লোড করতে পারি? গিথুব github.com/jeroenpeeters/docker-ssh/issues/30
নাম জি ভিইউ

6

এই বিষয় সম্পর্কে @ জাপাপাজ্জোর একটি দুর্দান্ত পোস্ট রয়েছে । সংক্ষিপ্ত উত্তরটি ব্যবহার করা হবে nsenter:

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

পিএস: পোস্টের মন্তব্যে আলোচনাটি পরীক্ষা করতে ভুলবেন না ...

চিয়ার্স


1
এটি একটি বরং পুরাতন পোস্ট যা এখন আর প্রয়োজন হয় না । @ ওয়াইআর 3 ডি এর docker execসমাধানটি আরও সুবিধাজনক।
ড্রেভিকো

4

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

এটি অ্যাপ্লিকেশন-নির্দিষ্ট কমান্ডের পরিবর্তে আরও "traditionalতিহ্যবাহী" (এসএসএস) docker attachহবে এবং শেষ পর্যন্ত এটি সিস্টেম এবং সংস্করণগুলিতে আরও 'পোর্টেবল' করে তুলবে।


দয়া করে এটি কীভাবে সহজ উপায় যুক্ত করুন। যদি সত্যি কথা বলতে হয় তবে আমার সত্যিই এটি দরকার তবে এর সহজ সমাধানটি অনুসন্ধান করার মতো আমার কাছে সময় নেই। আপনি কি এখানে আপনার উত্তর পোস্ট করতে পারেন? দুর্দান্ত লাগবে ..
তৈমুর ফয়েজরাখমানভ

2
এটি সম্পাদন করার 2 টি উপায় রয়েছে তবে এটি সহজ নয় এবং এটি একটি বড় পোস্টে পরিণত হয়। পাইপ ওয়ার্ক বা এই লিঙ্কটি ব্যবহার করার জন্য, আপনি এই লিঙ্কটি নিজেই পরীক্ষা করে দেখতে পারেন , ডাইনি মূলত পাইপওয়ার্কের মতোই কাজটি সম্পাদন করে এবং এটি আরও সহজ সরল, তবে আপনাকে এটি ম্যানুয়ালি করা দরকার। সুতরাং এটি নির্ভর করে কতগুলি সার্ভার যেখানে কথা বলছে। আপনি যদি আরও নির্দিষ্ট কিছু বের করতে না পারেন তবে আমাকে জানান। তবে আমার কাছে পুরো টিউটোরিয়াল লেখারও সময় নেই।
রেড্রিয়ান্স

আপনি ঠিক বলেছেন - এটি করার কোনও সুস্পষ্ট ও সহজ উপায় নেই (লিঙ্কগুলির জন্য ধন্যবাদ, আমি মনে করি আমি এটি পরে আবার ঘুরে
দেখব

3

কখনও কখনও এটি কোনও ডকার পাত্রে বিশেষত বিকাশের সময় ছাঁটাইতে সক্ষম হয়ে উঠবে। নিম্নলিখিত ডকার চিত্রটি একটি ব্যক্তিগত কী ব্যবহার করে একটি পাত্রে প্রবেশ করতে দেয়:

UbuntuWithSSH-Docker

ডকফেরাইলের সংক্ষিপ্তসারটি https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07



1

ভিতরে যাও

goinsideকমান্ড লাইন সরঞ্জামটি এর সাথে ইনস্টল করুন :

sudo npm install -g goinside

এবং এর সাথে সঠিক টার্মিনাল আকারের সাথে ডকারের ধারকের ভিতরে যান:

goinside docker_container_name

আরো বিস্তারিত জানার জন্য পরীক্ষা এই বাইরে।



0

শুধু তথ্যের জন্য. যদি আপনাকে কোনও সাধারণ পাত্রে লগইন করতে হয় যা ডেমন নয়, আপনার নিম্নলিখিত কমান্ডগুলি ব্যবহার করতে হবে:

docker start {id}
docker attach {id}

-1

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

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.