टी एल-DR
docker ps --no-trunc
और docker inspect CONTAINER
कंटेनर को शुरू करने के लिए निष्पादित एंट्रीपॉइंट प्रदान करें, जिसके साथ कमांड को पारित किया गया है, लेकिन यह कुछ हिस्सों को याद कर सकता है जैसे ${ANY_VAR}
कि कंटेनर पर्यावरण चर को हल नहीं किया गया है।
उस पर काबू पाने के लिए, docker inspect CONTAINER
एक फायदा है क्योंकि यह Config.Env
संपत्ति से कंटेनर में परिभाषित अलग-अलग एनवी चर और उनके मूल्यों को पुनः प्राप्त करने की अनुमति देता है ।
docker ps
और docker inspect
निष्पादित प्रविष्टि और उसके आदेश के बारे में जानकारी प्रदान करें। अक्सर, यह एक आवरण प्रविष्टि स्क्रिप्ट ( .sh
) और कंटेनर द्वारा शुरू किए गए "वास्तविक" कार्यक्रम नहीं है। उस पर जानकारी प्राप्त करने के लिए, प्रक्रिया की जानकारी के साथ ps
या /proc/1/cmdline
मदद का अनुरोध करें ।
1) docker ps --no-trunc
यह एंट्रीपॉइंट और सभी रनिंग कंटेनरों के लिए निष्पादित कमांड को प्रिंट करता है। हालांकि यह एंट्रीपॉइंट को पारित कमांड को प्रिंट करता है (यदि हम इसे पास करते हैं), तो यह docker env वेरिएबल्स (जैसे $FOO
या ${FOO}
) का मान नहीं दिखाता है ।
यदि हमारे कंटेनर एनवी चर का उपयोग करते हैं, तो यह पर्याप्त नहीं हो सकता है।
उदाहरण के लिए, अल्पाइन कंटेनर चलाएँ:
docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'
जब docker -ps का उपयोग करें जैसे:
docker ps -a --filter नाम = अल्पाइन-उदाहरण --no-trunc
यह प्रिंट करता है:
कंटेनर आईडी इमेजेज बनाई गई स्टेटस पोर्टल नाम
5b064a6de6d8417 ... अल्पाइन: नवीनतम "sh -c 'ls $ MY_VAR'" 2 मिनट पहले बाहर निकलें (0) 2 मिनट पहले अल्पाइन-उदाहरण
हम एंट्रीपॉइंट को पास की गई कमांड देखते हैं: sh -c 'ls $MY_VAR'
लेकिन $MY_VAR
वास्तव में हल नहीं हुई है।
2) docker inspect CONTAINER
जब हम अल्पाइन-उदाहरण कंटेनर का निरीक्षण करते हैं:
docker inspect alpine-example | grep -4 Cmd
कमांड भी है, लेकिन हम अभी भी एनवी चर मूल्य नहीं देखते हैं:
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
],
वास्तव में, हम इन डॉकटर कमांड के साथ प्रक्षेपित चर नहीं देख सकते थे।
ट्रेड-ऑफ के रूप में, हम डॉकटर निरीक्षण के साथ कंटेनर के लिए अलग से कमांड और एनवी चर दोनों को प्रदर्शित कर सकते हैं:
docker inspect alpine-example | grep -4 -E "Cmd|Env"
वह प्रिंट:
"Env": [
"MY_VAR=/var",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
]
एक और अधिक डॉक करने का तरीका यह होगा कि रेंडर करने के लिए JSON विशेषताओं को निर्दिष्ट करने के लिए --format
ध्वज का उपयोग किया जाए docker inspect
:
docker inspect --format '{{.Name}} {{.Config.Cmd}} {{ (.Config.Env) }}' alpine-example
यह आउटपुट:
/ अल्पाइन-उदाहरण [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / बिन: / sbin: / bin]
3) चल रहे कंटेनरों के लिए कंटेनर से ही शुरू की गई प्रक्रिया को पुनः प्राप्त करें
Docker द्वारा निष्पादित एंट्रीपॉइंट और कमांड मददगार हो सकती है लेकिन कुछ मामलों में, यह पर्याप्त नहीं है क्योंकि यह केवल एक रैपर एंट्रीपॉइंट स्क्रिप्ट ( .sh
) है जो वास्तविक / कोर प्रक्रिया शुरू करने के लिए जिम्मेदार है।
उदाहरण के लिए जब मैं नेक्सस कंटेनर चलाता हूं, तो कमांड को निष्पादित किया जाता है और कंटेनर को चलाने के लिए दिखाया जाता है "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"
।
PostgreSQL के लिए है "docker-entrypoint.sh postgres"
।
अधिक जानकारी प्राप्त करने के लिए, हम एक रनिंग कंटेनर पर निष्पादित कर सकते हैं
docker exec CONTAINER ps aux
।
यह अन्य प्रक्रियाओं को मुद्रित कर सकता है जो हमें रुचि नहीं दे सकते हैं।
एंट्रीपॉइंट द्वारा शुरू की गई प्रारंभिक प्रक्रिया को संकीर्ण करने के लिए, हम कर सकते हैं:
docker exec CONTAINER ps -1
मैं निर्दिष्ट करता हूं 1
क्योंकि प्रविष्टि बिंदु द्वारा निष्पादित प्रक्रिया आम तौर पर 1
आईडी के साथ एक है ।
बिना ps
, हम अभी भी /proc/1/cmdline
(अधिकांश लिनक्स डिस्ट्रोस में लेकिन सभी नहीं) में जानकारी पा सकते हैं । उदाहरण के लिए :
docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo
अगर हमारे पास कंटेनर शुरू करने वाले डॉकटर होस्ट तक पहुंच है, तो एंट्रीपॉइंट द्वारा निष्पादित प्रक्रिया की पूरी कमान प्राप्त करने के लिए एक और विकल्प है:: निष्पादित करें ps -PID
जहां कंटेनर चलाने के लिए डॉक डेमॉन द्वारा बनाई गई पीआईडी स्थानीय प्रक्रिया है जैसे:
ps -$(docker container inspect --format '{{.State.Pid}}' CONTAINER)
Docker ps के साथ उपयोगकर्ता के अनुकूल स्वरूपण
docker ps --no-trunc
हमेशा पढ़ना आसान नहीं होता है।
स्तंभों को मुद्रित करने और एक सारणीबद्ध प्रारूप में निर्दिष्ट करने से यह बेहतर हो सकता है:
docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"
एक उपनाम बनाने में मदद मिल सकती है:
alias dps='docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'