Dockerfile को एक कमांड से बनाएँ और चलाएं


136

क्या डॉकरफाइल से छवि बनाना और इसे एक ही कमांड से चलाना संभव है? Dockerfile बनाने और छवि को चलाने के लिए
एक आदेश docker buildहै docker run -it

क्या इन दोनों आदेशों का कोई संयोजन केवल एक आदेश के साथ निर्माण करना और चलाना आसान है?


यदि आप अपने उपयोग-मामले के बारे में विस्तार से बताते हैं, तो हमारे सामने बेहतर विकल्प हो सकते हैं।
जोनाथन रेनहार्ट

7
@JonathonReinhart मेरा उपयोग मामला जल्दी से पुनरावृत्त करने के लिए है जब मैं एक डॉकफाइल संपादित कर रहा हूं जिस पर मैं काम कर रहा हूं।
शुभम चौधरी

जवाबों:


154

नहीं, एक भी आदेश नहीं है। लेकिन अगर आप अपनी छवि को टैग करते हैं, जैसा कि आप इसे बनाते हैं, तो इसे चलाना आसान होगा:

docker build -t foo . && docker run -it foo

2
अच्छा जवाब क्योंकि आप तब आसानी से छवि को हटा सकते हैं यदि आप चाहें docker rmi foo:।
सरकिस वरोजियन

237

यदि आप टैगिंग से बचना चाहते हैं, docker build -qतो अंतिम छवि हैश के अलावा कुछ भी नहीं है , जिसे आप तर्क के रूप में उपयोग कर सकते हैं docker run:

docker run -it $(docker build -q .)

और जोड़ने --rmके लिए docker runयदि आप जब यह बाहर निकल जाता है कंटेनर अपने आप निकाल दिया चाहते हैं।

docker run --rm -it $(docker build -q .)

9
स्वीकार किए गए उत्तर से बेहतर है, क्योंकि यह स्थानीय छवि भंडार को बंद नहीं करता है
InsOp

18
@InsOp वास्तव में, यह स्थानीय चित्र भी बनाता है। वे सिर्फ टैग नहीं हैं।
जोनाथन रेनहार्ट

2
दुर्भाग्य से यह आप से नियमित रूप से निर्माण उत्पादन प्रदर्शित नहीं करता है docker build/:
शेर

1
@ -qविकल्प का बिंदु । इसे शांत करने के लिए, केवल ऑटोजेनरेटेड टैग को आउटपुट करने के लिए। और बस। आप जैसा चाहें वैसा स्टड बदलना बेझिझक लें।
सलाथिल जीनस

बिल्ड का आउटपुट प्राप्त करने के लिए, आपको वायाचेस्लाव शाल्मोव के उत्तर को अनुकूलित करना चाहिए :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
ओलिवपूल

5

यदि आप मेकफाइल का उपयोग करते हैं, तो मुझे यह स्निपेट उपयोगी लगता है:

build:
    @docker build . | tee .buildlog

bash: build
    @docker run --rm -it $(shell grep "Successfully built" .buildlog | cut -d ' ' -f 3) /bin/bash

आपको टैगिंग की जरूरत नहीं है, जैसे @ jonathon-reinhart जवाब में, लेकिन आपको बिल्ड आउटपुट भी मिलता है।


5

मैं इस सुविधा के लिए डॉकटर-कंपोज़ का उपयोग करता हूं, क्योंकि मैं जिन ऐप्स का निर्माण कर रहा हूं उनमें से ज्यादातर बाहरी सेवाओं से जल्दी या बाद में बात कर रहे हैं, इसलिए अगर मैं इसे किसी भी तरह से उपयोग करने जा रहा हूं, तो शुरू से ही इसका उपयोग क्यों न करें। बस docker-compose.yml इस प्रकार है:

version: "3"
services:
  app:
    build: .

और उसके बाद ही एप्लिकेशन चलाएं:

docker-compose up --build app

यह छवि को फिर से बनाएगा या कंटेनर का पुन: उपयोग करेगा यदि छवि परिभाषा में किए गए परिवर्तन थे।


0

विंडोज पीसी

एक run.batफ़ाइल बनाओ । फिर फ़ाइल में इसे जोड़ें:

docker build -t foo . 
docker run -it foo

फ़ाइल को पॉवरशेल या cmd का उपयोग करके चलाने के लिए:

./run.bat

0

docker-build-and-run

मैंने एक ही कमांड में बिल्डिंग और रनिंग के लिए थोड़ा हेल्पर कमांड बनाया है। लिनक्स या मैक पर, आप ~/.bash_profileइसे टर्मिनल में उपलब्ध कराने के लिए इसे अपने साथ जोड़ सकते हैं ।

उपयोग:

docker-build-and-run BUILD_ARGS [-- RUN_ARGS] [-- RUN_COMMAND]

उदाहरण:

docker-build-and-run . -- npm run test
docker-build-and-run --file ./Dockerfile . -- -v ~/volume:/var/volume -- node server.js

लिपी:

इसे एक .shफ़ाइल में जोड़ें, या इसे अपने में जोड़ें ~/.bash_profile:

TERM_GREEN="\033[1;32m"
TERM_BLUE="\033[1;34m"
TERM_NC="\033[0m"
docker-build-and-run() {
    if [[ -z "$@" ]]; then
        echo "
            Usage:
                docker-build-and-run BUILD_ARGS [-- RUN_ARGS] [-- RUN_COMMAND]
            Examples:
                docker-build-and-run . -- npm run test
                docker-build-and-run --file ./Dockerfile . -- -v ~/volume:/var/volume -- node server.js
        "
        return
    fi

    # Extract the segments between the dashes:
    BEFORE_THE_DASHES=
    while (( "$#" )); do
        if [[ "$1" = "--" ]]; then
            shift
            break
        fi
        BEFORE_THE_DASHES="$BEFORE_THE_DASHES $1"
        shift
    done
    SEGMENT_1=$BEFORE_THE_DASHES

    BEFORE_THE_DASHES=
    while (( "$#" )); do
        if [[ "$1" = "--" ]]; then
            shift
            break
        fi
        BEFORE_THE_DASHES="$BEFORE_THE_DASHES $1"
        shift
    done
    SEGMENT_2=$BEFORE_THE_DASHES

    SEGMENT_3=$@


    BUILD_ARGS=$SEGMENT_1
    RUN_ARGS=$SEGMENT_2
    RUN_COMMAND=$SEGMENT_3
    if [ -z "$RUN_COMMAND" ]; then
      RUN_COMMAND=$RUN_ARGS
      RUN_ARGS=
    fi


    TEMP_TAG=docker-build-and-run-temp

    docker rm -f $TEMP_TAG 2>/dev/null
    printf "${TERM_GREEN}Building Docker container (${TERM_BLUE}docker build $BUILD_ARGS${TERM_GREEN})${TERM_NC}\n" \
    && docker build --tag $TEMP_TAG $BUILD_ARGS \
    && printf "${TERM_GREEN}Running Docker container (${TERM_BLUE}docker run $RUN_ARGS $RUN_COMMAND${TERM_GREEN})${TERM_NC}\n" \
    && docker run --rm -it $RUN_ARGS --label $TEMP_TAG $TEMP_TAG $RUN_COMMAND
}

0

तुम भी कर सकते हैं docker buildऔर छवि नाम पाइप जो यह करने के लिए आउटपुट docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build आपको मल्टी-लाइन टेक्स्ट देगा ... Successfully built 18e77bc0d83a
  • आपको अंतिम पंक्ति मिलती है tail -n1
  • से विभाजित ' 'और 3साथ rd शब्द मिलता हैcut -d' ' -f3
  • इसे तर्क के runसाथ पास करेंxargs -I{} docker run {}

पूर्ण आउटपुट प्राप्त करने के | tee /dev/ttyबाद जोड़ें docker build .!
ओलिवपूल

0

एक पुन: प्रयोज्य समाधान की तलाश में किसी के लिए, आप इस डॉकटर प्लगइन को स्थापित कर सकते हैं जो मैंने बनाया था: https://github.com/stasmihailov/docker-script

फिर आप निम्न प्रकार से एक डॉकरीफाइल बना और चला सकते हैं:

docker script ./Dockerfile
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.