Bangun dan jalankan Dockerfile dengan satu perintah


136

Apakah mungkin untuk membangun gambar dari Dockerfile dan menjalankannya dengan satu perintah?
Ada satu perintah docker builduntuk membangun Dockerfile dan docker run -itmenjalankan gambar.

Apakah ada kombinasi dari kedua perintah ini untuk membuatnya lebih mudah untuk dibangun dan dijalankan hanya dengan satu perintah?


Jika Anda menguraikan kasus penggunaan Anda, mungkin ada opsi yang lebih baik yang bisa kami sajikan.
Jonathon Reinhart

7
@JonathonReinhart Kasus penggunaan saya adalah dengan cepat beralih saat saya sedang mengedit Dockerfile yang sedang saya kerjakan.
Shubham Chaudhary

Jawaban:


154

Tidak, tidak ada perintah tunggal. Tetapi jika Anda memberi tag pada gambar saat Anda membuatnya, akan lebih mudah dijalankan:

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

2
Jawaban yang baik karena Anda dapat dengan mudah menghapus gambar jika Anda ingin: docker rmi foo.
Sarkis Varozian

237

Jika Anda ingin menghindari pemberian tag, docker build -qtidak menghasilkan apa-apa selain hash gambar akhir , yang dapat Anda gunakan sebagai argumen untuk docker run:

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

Dan tambahkan --rmke docker runjika Anda ingin wadah dihapus secara otomatis ketika keluar.

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

9
Lebih baik daripada jawaban yang diterima, karena itu tidak mengacaukan repositori gambar lokal
InsOp

18
@InsOp Sebenarnya, ini menghasilkan gambar lokal juga. Mereka tidak ditandai.
Jonathon Reinhart

2
Sayangnya ini tidak menunjukkan kepada Anda output build reguler dari docker build: /
Lion

1
@ Singa itu titik -qpilihan. Untuk membuatnya senyap, untuk hanya menghasilkan tag yang dibuat secara otomatis. Dan itu saja. Jangan ragu untuk mengubah stdin itu sesuka Anda.
Salathiel Genèse

Untuk mendapatkan hasil pembuatan, Anda harus menyesuaikan jawaban Viacheslav Shalamov :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool

5

Jika Anda menggunakan Makefile, saya menemukan potongan ini berguna:

build:
    @docker build . | tee .buildlog

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

Anda tidak perlu memberi tag, seperti pada @ jonathon-reinhart jawaban, tetapi Anda juga mendapatkan hasil build.


5

Saya menggunakan docker-compose untuk kenyamanan ini karena sebagian besar aplikasi yang saya bangun berbicara dengan layanan eksternal cepat atau lambat, jadi jika saya tetap akan menggunakannya, mengapa tidak menggunakannya dari awal. Hanya perlu docker-compose.yml sebagai:

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

dan kemudian jalankan aplikasi dengan:

docker-compose up --build app

Ini akan membangun kembali gambar atau menggunakan kembali wadah tergantung jika ada perubahan pada definisi gambar.


0

PC Windows

Buat run.batfile. Kemudian dalam file tambahkan ini:

docker build -t foo . 
docker run -it foo

Untuk menjalankan file menggunakan powershell atau cmd, lakukan ini:

./run.bat

0

docker-build-and-run

Saya telah membuat perintah pembantu kecil untuk membangun dan menjalankan, dalam satu perintah. Di Linux atau Mac, Anda dapat menambahkan ini ke Anda ~/.bash_profileuntuk membuatnya tersedia di Terminal.

Pemakaian:

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

Contoh:

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

Naskah:

Tambahkan ini ke .shfile, atau tambahkan ke ~/.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

Anda juga dapat melakukan docker builddan mem-pipe nama gambar yang akan di-output ke docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build akan memberi Anda teks multi-baris ... Successfully built 18e77bc0d83a
  • Anda mendapatkan baris terakhir dengan tail -n1
  • dibagi ' 'dan dapatkan3 kata dengancut -d' ' -f3
  • meneruskannya sebagai argumen untuk rundenganxargs -I{} docker run {}

tambahkan | tee /dev/ttysetelah docker build .untuk mendapatkan hasil lengkap!
oliverpool

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.