क्या डॉकरफाइल से छवि बनाना और इसे एक ही कमांड से चलाना संभव है? Dockerfile बनाने और छवि को चलाने के लिए
एक आदेश docker buildहै docker run -it।
क्या इन दोनों आदेशों का कोई संयोजन केवल एक आदेश के साथ निर्माण करना और चलाना आसान है?
क्या डॉकरफाइल से छवि बनाना और इसे एक ही कमांड से चलाना संभव है? Dockerfile बनाने और छवि को चलाने के लिए
एक आदेश docker buildहै docker run -it।
क्या इन दोनों आदेशों का कोई संयोजन केवल एक आदेश के साथ निर्माण करना और चलाना आसान है?
जवाबों:
नहीं, एक भी आदेश नहीं है। लेकिन अगर आप अपनी छवि को टैग करते हैं, जैसा कि आप इसे बनाते हैं, तो इसे चलाना आसान होगा:
docker build -t foo . && docker run -it foo
docker rmi foo:।
यदि आप टैगिंग से बचना चाहते हैं, docker build -qतो अंतिम छवि हैश के अलावा कुछ भी नहीं है , जिसे आप तर्क के रूप में उपयोग कर सकते हैं docker run:
docker run -it $(docker build -q .)
और जोड़ने --rmके लिए docker runयदि आप जब यह बाहर निकल जाता है कंटेनर अपने आप निकाल दिया चाहते हैं।
docker run --rm -it $(docker build -q .)
docker build/:
-qविकल्प का बिंदु । इसे शांत करने के लिए, केवल ऑटोजेनरेटेड टैग को आउटपुट करने के लिए। और बस। आप जैसा चाहें वैसा स्टड बदलना बेझिझक लें।
docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
यदि आप मेकफाइल का उपयोग करते हैं, तो मुझे यह स्निपेट उपयोगी लगता है:
build:
@docker build . | tee .buildlog
bash: build
@docker run --rm -it $(shell grep "Successfully built" .buildlog | cut -d ' ' -f 3) /bin/bash
आपको टैगिंग की जरूरत नहीं है, जैसे @ jonathon-reinhart जवाब में, लेकिन आपको बिल्ड आउटपुट भी मिलता है।
मैं इस सुविधा के लिए डॉकटर-कंपोज़ का उपयोग करता हूं, क्योंकि मैं जिन ऐप्स का निर्माण कर रहा हूं उनमें से ज्यादातर बाहरी सेवाओं से जल्दी या बाद में बात कर रहे हैं, इसलिए अगर मैं इसे किसी भी तरह से उपयोग करने जा रहा हूं, तो शुरू से ही इसका उपयोग क्यों न करें। बस docker-compose.yml इस प्रकार है:
version: "3"
services:
app:
build: .
और उसके बाद ही एप्लिकेशन चलाएं:
docker-compose up --build app
यह छवि को फिर से बनाएगा या कंटेनर का पुन: उपयोग करेगा यदि छवि परिभाषा में किए गए परिवर्तन थे।
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
}
तुम भी कर सकते हैं docker buildऔर छवि नाम पाइप जो यह करने के लिए आउटपुट docker run:
docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
docker build आपको मल्टी-लाइन टेक्स्ट देगा ... Successfully built 18e77bc0d83atail -n1' 'और 3साथ rd शब्द मिलता हैcut -d' ' -f3runसाथ पास करेंxargs -I{} docker run {}| tee /dev/ttyबाद जोड़ें docker build .!
एक पुन: प्रयोज्य समाधान की तलाश में किसी के लिए, आप इस डॉकटर प्लगइन को स्थापित कर सकते हैं जो मैंने बनाया था: https://github.com/stasmihailov/docker-script
फिर आप निम्न प्रकार से एक डॉकरीफाइल बना और चला सकते हैं:
docker script ./Dockerfile