एक डॉक कंटेनर के रन कमांड को कैसे दिखाया जाए


106

मैं एक docker कंटेनर सेटअप करने के लिए एक तीसरी पार्टी GUI (Synology डॉकर पैकेज) का उपयोग करता हूं। हालांकि, यह सीमा है मुझे कमांड लाइन से कंटेनर चलाने की आवश्यकता है। (मैं पोर्ट को बांधने के लिए एक और होस्ट आईपी मैप करना चाहता हूं)

अब, चूंकि बहुत सारी सेटिंग्स हैं जो पहले से ही हो चुकी हैं, मैं इस कंटेनर को शुरू करने वाले मूल रन कमांड को पुनः प्राप्त करना चाहूंगा, फिर मैं पोर्ट मैपिंग पोर्ट को नए में बदल सकता हूं। जैसे। " docker run -p 80:8080 gitlab"

मुझे ऐसा करने का तरीका नहीं मिल रहा है, ईवेंट का उपयोग "डॉक इंस्पेक्ट", ऐसी कोई जानकारी नहीं दी गई है।

कृपया इस समस्या को हल करने के लिए कुछ सलाह दें।



6
@capitalistpug यह सवाल इस एक के ठीक विपरीत है - यह कंटेनर के अंदर कमांड के बारे में है , यह कंटेनर को लॉन्च करने के लिए उपयोग किए जाने वाले के बारे में है ।
नील्स केयूरेंटजेस

इतिहास | grep 'docker run'
एड्रियन मे

1
यह आश्चर्यजनक है कि डॉकर के पास इसके लिए एक अंतर्निहित विकल्प नहीं है।
13

जवाबों:


134

तो इंजीनियरिंग डॉक कमांड चलाने के लिए कैसे रिवर्स?

एक गीथॉब रिपॉजिटरी है जो इंजीनियरिंग डॉक रन कमांड को रिवर्स करने की कोशिश करता है, लेकिन यह वर्तमान में सही नहीं है, संस्करण है 0.1.2। आपको अपडेट करने के लिए इसका पालन करना चाहिए। हो सकता है कि एक दिन आप इसे सही रन कमांड प्राप्त करने के लिए उपयोग कर सकते हैं।

$ sudo pip install runlike

# run the ubuntu image
$ docker run -ti ubuntu bash

$ docker ps -a  
# suppose you get the container ID 1dfff2ba0226

# Run runlike to get the docker run command. 
$ runlike 1dfff2ba0226
docker run --name=elated_cray -t ubuntu bash

गितुब भंडार: रनवे

अपडेट:

स्थापित किए बिना चलाएँ (धन्यवाद @tilo)

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER

या उर्फ ​​सेट करें

alias runlike="docker run --rm -v/var/run/docker.sock:/var/run/docker.sock 
 assaflavie/runlike"

runlike YOUR-CONTAINER

1
Synology DSM पर रनवे को सेटअप करना थोड़ा कठिन है, लेकिन मैं इसे आज़माऊंगा। धन्यवाद!
जैक यू

1
मुझे sudo pip install runlike का इस्तेमाल करना था
सिमोन

@ JackYu क्या आपने इसे Sysnology में स्थापित करने के लिए हासिल किया था?
xedo

runlike हमें बहुत समय बचाता है =>
saves

21
रन docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
लाइक

35

डॉक निरीक्षण का उपयोग करें :

$ docker inspect foo/bar
[
    {
        # …
        "Config": {
            # …
            "Cmd": [
                "/usr/local/bin/script.sh"
            ],
            # …
        }
    }
]

आप प्रोग्राम को jq के साथ पार्स कर सकते हैं :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh

1
हाँ, मैं भी jq पसंद करता हूँ, कमांड पर एक मामूली ट्विक (IMHO टाइप करने और पढ़ने में थोड़ा आसान है): docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
पॉल कैरोल

1
"Cmd": null,हो सकता है कि यह केवल तभी काम करता है जब कंटेनर स्वचालित रूप से डोकर डेमॉन शुरू नहीं हुआ था?
माइकल 23

25

मैंने docker runमौजूदा कंटेनर से कमांड उत्पन्न करने के लिए एक सरल नोड-आधारित सीएलआई उपकरण लिखा था ।

https://www.npmjs.com/package/rekcod

यहाँ एक उदाहरण है:

$ npm i -g rekcod
$ rekcod redis_container

docker run -d --name redis_container --restart always -h a44159e148e1 \
--expose 6379/tcp -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
-e REDIS_VERSION=3.0.7 -e REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.7.tar.gz \
-e REDIS_DOWNLOAD_SHA1=e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c \
--entrypoint "/entrypoint.sh" redis "redis-server"

लिंक और माउंटेड वॉल्यूम और अन्य सामान भी संभालती है।

इस समय सुपर मजबूत नहीं है, लेकिन बताई गई कुछ अन्य चीजों की तुलना में अधिक संभालती है, और यह वह था जो मैं देख रहा था।

संपादित करें: किसी भी सॉफ़्टवेयर को स्थापित किए बिना एक ही आदेश में:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container

6

एक सरल (?) विकल्प इस डॉक इंस्पेक्टर टेम्प्लेट को चलाने के लिए है , जो docker runसंगत कमांड को आउटपुट करने के लिए बिलिन गो टेंपलेटिंग क्षमताओं का उपयोग करता है । टेम्पलेट केवल सबसे सामान्य कमांड-लाइन विकल्प को कवर करता है, लेकिन इसे आसानी से बढ़ाया जा सकता है।

इस समाधान में अन्य उपकरण पर कोई निर्भरता नहीं है, केवल docker को छोड़कर।


5

सभी कंटेनरों के लिए तर्क प्राप्त करने के लिए निम्नलिखित कमांड का प्रयोग करें -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)


1
यह कंटेनर के अंदर चलने वाले व्हाट्स के लिए कमांड और तर्कों को सूचीबद्ध करता है , न कि कंटेनर को कैसे शुरू किया गया था (यानी इस सवाल का जवाब आपने रन के उत्तर को 4 मिनट बाद पोस्ट किया है! :))।
ओजगुर

4

वर्तमान में ऐसा लगता है कि हमें 'docker निरीक्षण' करना है और फिर मैन्युअल रूप से रन कमांड को फिर से बनाना है।

मैंने किसी को ऐसा करने के लिए बैश स्क्रिप्ट लिखने का प्रयास करते पाया है: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

लेकिन यह अधूरा है और jq पर निर्भर करता है।


3

" डॉक रन" के साथ शुरू होने वाली कमांड्स को पकड़ने के लिए बैश-प्रीसेक्स जैसे कुछ का उपयोग करने के लिए एक सरल (मजबूत) विकल्प हो सकता है । आप इन आदेशों को कहीं स्टोर कर सकते हैं और बाद में उन्हें पुनः प्राप्त कर सकते हैं।

उदाहरण के लिए, आप अपने bash प्रोफ़ाइल में कुछ इस तरह जोड़ सकते हैं:

[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
docker_run_history=~/.docker_run_history
docker_clear_history(){
    echo -n > $docker_run_history
}
docker_search_history(){
    search_for="$@"
    [[ -z $search_for ]] && search_for=".*"
    \cat $docker_run_history | grep "$search_for" | tail -1
}
docker_ps_mod(){
    for c in $(docker ps --format "{{.Image}}"); do 
        echo "Container $c was run using:"
        echo -e "\t$(docker_search_history $c)"
    done
}
docker_hook(){
    if [[ $@ =~ ^"docker run".*$ ]]; then
        \echo "$@" >> $docker_run_history 
    fi
}
preexec(){ 
    docker_hook $@
}

तब आप बस अपनी चीजें चला सकते थे:

source ~/.bash_profile
docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
docker run -d daemon
docker_ps_mod

कौन से आउटपुट:

Container image was run using:
    docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
Container daemon was run using:
    docker run -d daemon

दिलचस्प विकल्प। +1
VONC

यह बेतुका है कि डॉक कमांड इतिहास को रिकॉर्ड नहीं करता है और बस इस तरह से पाइपिंग करता है।
मैक विंडो

3

यदि आप अपने मौजूदा रनिंग डॉकर सर्वर सेटअप में कुछ भी इंस्टॉल नहीं करना चाहते हैं, तो आप बस निष्पादित कर सकते हैं ( $CONTAINER_NAMEकंटेनर नाम जिसे आप रन तर्क रखना चाहते हैं) से प्रतिस्थापित करें:

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache nodejs nodejs-npm && npm i -g rekcod && rekcod $CONTAINER_NAME"

( rekcodविधि के लिए )

या

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache py-pip && pip install runlike && runlike $CONTAINER_NAME"

( runlikeविधि के लिए )


2

वह डॉक रन कमांड डॉकफाइल या किसी अन्य डॉक-संबंधित दस्तावेजों में निर्दिष्ट नहीं है।

या तो आपको अपने कंटेनर से जुड़े दस्तावेज़ में एक उदाहरण मिलता है, या आप अनुमान लगा सकते हैं कि डॉक के साथ (कम से कम कमांड और पोर्ट मैपिंग के लिए) ए docker ps -a(लेकिन यह आपको संभावित --volumes-fromविकल्प नहीं देगा )

जांच भी कराएं /usr/syno/etc/packages/Docker-GitLab/config

यह स्वयं गिट्टैब कॉन्फिगरेशन से भिन्न है, जो कि Synology पर उपलब्ध है/usr/syno/etc/packages/Docker/synology_gitlab.config


Synology डॉकर के विन्यास फ़ाइल स्थान का उल्लेख करने के लिए धन्यवाद। लेकिन कॉन्‍फ़िगर बहुत अधिक मदद नहीं कर सकता है। यह सामग्री वैसी ही है जैसी आप वेब यूआई से कंटेनर निर्यात करते हैं।
जैक यू


0

सभी docker फाइलें यहां हैं, जैसे आप cmd और mounts पा सकते हैं उदाहरण के लिए ls -la /proc/1 इसे कैट

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.