สร้างและเรียกใช้ Dockerfile ด้วยคำสั่งเดียว


138

เป็นไปได้ไหมที่จะสร้างอิมเมจจาก Dockerfile และเรียกใช้ด้วยคำสั่งเดียว?
มีคำสั่งเดียวdocker buildในการสร้าง Dockerfile และdocker run -itเรียกใช้อิมเมจ

มีคำสั่งทั้งสองรวมกันเพื่อให้ง่ายต่อการสร้างและเรียกใช้ด้วยคำสั่งเดียวหรือไม่?


หากคุณอธิบายอย่างละเอียดเกี่ยวกับกรณีการใช้งานของคุณอาจมีตัวเลือกที่ดีกว่าที่เราสามารถนำเสนอได้
Jonathon Reinhart

7
@JonathonReinhart กรณีการใช้งานของฉันคือการทำซ้ำอย่างรวดเร็วเมื่อฉันแก้ไข Dockerfile ที่ฉันกำลังทำงานอยู่
Shubham Chaudhary

คำตอบ:


157

ไม่มีไม่มีคำสั่งเดียว แต่ถ้าคุณติดแท็กรูปภาพของคุณในขณะที่สร้างมันจะง่ายกว่าที่จะเรียกใช้:

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

2
docker rmi fooคำตอบที่ดีเพราะคุณสามารถได้อย่างง่ายดายแล้วเอาภาพหากคุณต้องการ:
Sarkis Varozian

239

หากคุณต้องการหลีกเลี่ยงการแท็กให้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 อันที่จริงสิ่งนี้สร้างภาพในท้องถิ่นด้วย พวกเขาไม่ได้ติดแท็ก
Jonathon Reinhart

2
น่าเสียดายที่นี่ไม่ได้แสดงให้คุณเห็นผลลัพธ์การสร้างปกติจากdocker build: /
Lion

1
@ สิงโตว่าจุดของ-qตัวเลือก เพื่อให้เงียบให้ส่งออกเฉพาะแท็กที่สร้างขึ้นโดยอัตโนมัติ และนั่นแหล่ะ อย่าลังเลที่จะเปลี่ยน stdin นั้นตามที่คุณต้องการ
Salathiel Genèse

เพื่อให้ได้ผลลัพธ์ของงานสร้างคุณควรปรับคำตอบของ Viacheslav Shalamov :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool

5

หากคุณใช้ 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 แต่คุณจะได้รับเอาต์พุตการสร้างด้วย


5

ฉันใช้นักเทียบท่าเพื่อความสะดวกนี้เนื่องจากแอปส่วนใหญ่ที่ฉันกำลังสร้างกำลังพูดคุยกับบริการภายนอกไม่ช้าก็เร็วดังนั้นหากฉันจะใช้มันต่อไปทำไมไม่ใช้ตั้งแต่เริ่มต้น เพียงแค่มี docker-compose.yml เป็น:

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

จากนั้นเรียกใช้แอปด้วย:

docker-compose up --build app

มันจะสร้างอิมเมจใหม่หรือใช้คอนเทนเนอร์ซ้ำขึ้นอยู่กับว่ามีการเปลี่ยนแปลงนิยามของรูปภาพหรือไม่


0

พีซี Windows

สร้างrun.batไฟล์ จากนั้นในไฟล์ให้เพิ่มสิ่งนี้:

docker build -t foo . 
docker run -it foo

ในการเรียกใช้ไฟล์โดยใช้ powershell หรือ cmd ให้ทำสิ่งนี้:

./run.bat

0

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
}

0

คุณยังสามารถทำdocker buildและไพพ์ชื่ออิมเมจที่ส่งออกไปยังdocker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build จะให้ข้อความหลายบรรทัดแก่คุณ ... Successfully built 18e77bc0d83a
  • คุณจะได้รับบรรทัดสุดท้ายด้วย tail -n1
  • แยก' 'และรับ3rd word ด้วยcut -d' ' -f3
  • ส่งต่อเป็นอาร์กิวเมนต์runด้วยxargs -I{} docker run {}

เพิ่ม| tee /dev/ttyหลังจากที่docker build .จะได้รับผลลัพธ์เต็ม!
oliverpool

0

สำหรับใครก็ตามที่กำลังมองหาโซลูชันที่ใช้ซ้ำได้คุณสามารถติดตั้งปลั๊กอินนักเทียบท่าที่ฉันสร้างขึ้น: https://github.com/stasmihailov/docker-script

จากนั้นคุณสามารถสร้างและเรียกใช้ Dockerfile ได้ดังนี้:

docker script ./Dockerfile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.