it-swarm.asia

هل من الممكن بدء جلسة Shell في حاوية قيد التشغيل (بدون ssh)

كنت أتوقع بسذاجة أن يقوم هذا الأمر بتشغيل صدفة bash في حاوية جارية:

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

لذا ، إذا أردت تشغيل bash Shell في حاوية جارية (على سبيل المثال لأغراض التشخيص)

يجب علي تشغيل خادم SSH فيه وتسجيل الدخول عبر ssh؟

315
Max L.

تحرير: الآن يمكنك استخدام docker exec -it "id of running container" bash ( doc )

في السابق ، كان الجواب على هذا السؤال:

إذا كنت بحاجة فعلاً وكنت في بيئة تصحيح ، فيمكنك القيام بذلك: Sudo lxc-attach -n <ID> لاحظ أن المعرف يحتاج إلى أن يكون كامل (docker ps -notrunc).

ومع ذلك ، أوصي بشدة ضد هذا.

إشعار: -notrunc مهملة ، سيتم استبدالها بـ --no-trunc قريبًا.

259
creack

مع عامل الميناء 1.3 ، هناك أمر جديد docker exec . يسمح لك هذا بإدخال عامل تشغيل قيد التشغيل:

docker exec -it "id of running container" bash
598
Michael_Scharf

فقط افعل

docker attach container_name

كما ذكر في التعليقات ، للفصل من الحاوية دون إيقافه ، اكتب Ctrlpثم Ctrlq.

14
maxbellec

نظرًا لأن الأمور تتغير ، في الوقت الحالي ، تستخدم الطريقة الموصى بها للوصول إلى حاوية تشغيل nsenter.

يمكنك العثور على مزيد من المعلومات حول هذا مستودع جيثب . ولكن بشكل عام يمكنك استخدام 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>

يمكن العثور على شرح لطيف حول الموضوع في مدونة Jérôme Petazzoni في مدونة: لماذا لا تحتاج إلى تشغيل sshd في حاويات السفن الخاصة بك

10
Teudimundo

أول شيء لا يمكنك الركض

docker run "existing container" command

لأن هذا الأمر يتوقع صورة وليس حاوية وسيؤدي على أي حال إلى ظهور حاوية جديدة (لذلك لا تريد أن تنظر إليها)

وأنا أتفق مع حقيقة أنه مع عامل الميناء يجب أن ندفع أنفسنا إلى التفكير بطريقة مختلفة (لذلك يجب أن تجد طرقًا بحيث لا تحتاج إلى تسجيل الدخول إلى الحاوية) ، لكن ما زلت أجدها مفيدة وهذه هي الطريقة التي أعمل بها حولها.

أركض الأوامر من خلال المشرف في وضع DEAMON.

ثم أقوم بتنفيذ ما أسميه 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 وسوف تسقط في قذيفة تسمح لك بإلقاء نظرة خاطفة كما لو كان نظامًا طبيعيًا.

الرجاء أيضًا مراعاة أن هذا النظام غير آمن مثل وجود الحاوية دون وجود قشرة ، لذلك اتبع جميع الخطوات اللازمة لتأمين الحاوية الخاصة بك.

8
Alessandro

راقب طلب السحب هذا: https://github.com/docker/docker/pull/7409

التي تنفذ الأداة docker exec <container_id> <command> القادمة. عندما يكون ذلك متاحًا ، يجب أن يكون من الممكن على سبيل المثال بدء وإيقاف خدمة ssh داخل حاوية تشغيل.

يوجد أيضًا nsinit للقيام بذلك: "nsinit يوفر طريقة سهلة للوصول إلى Shell داخل مساحة اسم الحاوية قيد التشغيل" ، ولكن يبدو من الصعب تشغيلها. https://Gist.github.com/ubergarm/ed42ebbea293350c30a6

4
foz

يمكنك استخدام

docker exec -it <container_name> bash
3
antikytheraton

من المفيد تعيين اسم عند تشغيل الحاوية. لا تحتاج الرجوع الحاويات.

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

1
Matsumoto Kazuya

هناك بالفعل طريقة لجعل Shell في الحاوية.

افترض أن /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
kolypto

ها هو الحل

جزء من DOckerfile:

...
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

بعد بناء الصورة لديك خياران باستخدام exec وإرفاق:

  1. مع exec (الذي أستخدمه) ، قم بتشغيل:

تشغيل عامل ميناء - اسم $ CONTAINER_NAME - $ $ IMAGE_NAME

ثم

عامل ميناء exec -it $ CONTAINER_NAME/bin/bash

واستخدامها

CTRL + D للفصل

  1. مع إرفاق ، تشغيل:

تشغيل عامل ميناء - اسم $ CONTAINER_NAME - $ $ IMAGE_NAME

ثم

عامل ميناء إرفاق $ CONTAINER_NAME

واستخدامها

CTRL + P و CTRL + Q للفصل

الفرق بين الخيارات في المعلمة -i

1
tim

هناك طريقتان.

مع إرفاق

$ Sudo docker attach 665b4a1e17b6 #by ID

مع exec

$ Sudo docker exec - -t 665b4a1e17b6 #by ID
1
gurubelli

إذا كان الهدف هو التحقق من سجلات التطبيق ، فإن هذا المنشور يظهر بدء تشغيل Tomcat وخياطة السجل كجزء من CMD. سجل Tomcat متاح على المضيف باستخدام "سجلات عامل ميناء حاوية".

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

0
Mark K.

أولاً ، الحصول على معرف الحاوية الحاوية المطلوبة بواسطة

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

0
Umesh