เป็นไปได้ไหมที่จะสร้างอิมเมจจาก Dockerfile และเรียกใช้ด้วยคำสั่งเดียว?
มีคำสั่งเดียวdocker build
ในการสร้าง Dockerfile และdocker run -it
เรียกใช้อิมเมจ
มีคำสั่งทั้งสองรวมกันเพื่อให้ง่ายต่อการสร้างและเรียกใช้ด้วยคำสั่งเดียวหรือไม่?
เป็นไปได้ไหมที่จะสร้างอิมเมจจาก Dockerfile และเรียกใช้ด้วยคำสั่งเดียว?
มีคำสั่งเดียวdocker build
ในการสร้าง Dockerfile และ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
ตัวเลือก เพื่อให้เงียบให้ส่งออกเฉพาะแท็กที่สร้างขึ้นโดยอัตโนมัติ และนั่นแหล่ะ อย่าลังเลที่จะเปลี่ยน stdin นั้นตามที่คุณต้องการ
docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
หากคุณใช้ Makefile ฉันคิดว่าตัวอย่างข้อมูลนี้มีประโยชน์:
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
มันจะสร้างอิมเมจใหม่หรือใช้คอนเทนเนอร์ซ้ำขึ้นอยู่กับว่ามีการเปลี่ยนแปลงนิยามของรูปภาพหรือไม่
สร้างrun.bat
ไฟล์ จากนั้นในไฟล์ให้เพิ่มสิ่งนี้:
docker build -t foo .
docker run -it foo
ในการเรียกใช้ไฟล์โดยใช้ powershell หรือ cmd ให้ทำสิ่งนี้:
./run.bat
docker-build-and-run
ฉันได้สร้างคำสั่งผู้ช่วยเล็ก ๆ น้อย ๆ สำหรับการสร้างและเรียกใช้ในคำสั่งเดียว บน Linux หรือ Mac คุณสามารถเพิ่มสิ่งนี้ลงในเครื่อง~/.bash_profile
เพื่อให้ใช้งานได้ใน Terminal
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 18e77bc0d83a
tail -n1
' '
และรับ3
rd word ด้วยcut -d' ' -f3
run
ด้วยxargs -I{} docker run {}
| tee /dev/tty
หลังจากที่docker build .
จะได้รับผลลัพธ์เต็ม!
สำหรับใครก็ตามที่กำลังมองหาโซลูชันที่ใช้ซ้ำได้คุณสามารถติดตั้งปลั๊กอินนักเทียบท่าที่ฉันสร้างขึ้น: https://github.com/stasmihailov/docker-script
จากนั้นคุณสามารถสร้างและเรียกใช้ Dockerfile ได้ดังนี้:
docker script ./Dockerfile