Dockerfile'ı tek komutla oluşturun ve çalıştırın


138

Dockerfile'dan imaj oluşturup tek bir komutla çalıştırmak mümkün müdür? Dockerfile oluşturmak ve imajı çalıştırmak için
bir komut vardır .docker builddocker run -it

Tek bir komutla derlemeyi ve çalıştırmayı kolaylaştırmak için bu iki komutun herhangi bir kombinasyonu var mı?


Kullanım durumunuzu detaylandırırsanız, sunabileceğimiz daha iyi seçenekler olabilir.
Jonathon Reinhart

7
@JonathonReinhart Benim kullanım durumum, üzerinde çalıştığım bir Dockerfile'ı düzenlerken hızlıca yinelemek.
Shubham Chaudhary

Yanıtlar:


157

Hayır, tek bir komut yok. Ancak resminizi oluştururken etiketlerseniz, çalıştırması daha kolay olacaktır:

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

2
İsterseniz İyi cevap daha sonra kolayca resmi kaldırmak çünkü: docker rmi foo.
Sarkis Varozian

239

Etiketlemeden kaçınmak istiyorsanız, aşağıdakileri yapmak için bağımsız değişken olarak kullanabileceğiniz son görüntü karması dışındadocker build -q hiçbir şey çıktı vermezdocker run :

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

Ve eklemek --rmiçin docker runbunu çıktığında konteyner otomatik olarak kaldırılır istiyorum.

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

9
Kabul edilen cevaptan daha iyi, çünkü yerel görüntü havuzunu karıştırmıyor
InsOp

18
@InsOp Aslında bu da yerel görüntüler üretir. Sadece etiketlenmemişler.
Jonathon Reinhart

2
Maalesef bu size şu normal derleme çıktısını göstermiyor docker build: /
Lion

1
@ Aslan -qseçeneği noktası . Sessiz hale getirmek için, yalnızca otomatik olarak oluşturulmuş etiketin çıktısını almak için. Ve bu kadar. Bu stdin'i istediğiniz gibi dönüştürmekten çekinmeyin.
Salathiel Genèse

Yapının çıktısını almak için , Viacheslav Shalamov'un cevabını uyarlamalısınız :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool

5

Makefile kullanıyorsanız, bu pasajı yararlı buluyorum:

build:
    @docker build . | tee .buildlog

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

@ Jonathon-reinhart cevabındaki gibi etiketlemeye ihtiyacınız yoktur, ancak aynı zamanda derleme çıktısını da alırsınız.


5

Bu kolaylık için docker-compose kullanıyorum çünkü geliştirdiğim uygulamaların çoğu er ya da geç harici hizmetlerle konuşuyor, bu yüzden yine de kullanacaksam, neden en baştan kullanmayalım? Docker-compose.yml dosyasını şu şekilde bulundurmanız yeterlidir:

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

ve ardından uygulamayı şununla çalıştırın:

docker-compose up --build app

Görüntü tanımında yapılan değişikliklere bağlı olarak görüntüyü yeniden oluşturacak veya kabı yeniden kullanacaktır.


0

Windows PC

Bir run.batdosya oluşturun. Ardından dosyaya şunu ekleyin:

docker build -t foo . 
docker run -it foo

Dosyayı powershell veya cmd kullanarak çalıştırmak için şunu yapın:

./run.bat

0

docker-build-and-run

Tek bir komutla inşa etmek ve çalıştırmak için küçük bir yardımcı komut oluşturdum. Linux veya Mac'te, ~/.bash_profileTerminal'de kullanılabilir hale getirmek için bunu hesabınıza ekleyebilirsiniz .

Kullanımı:

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

Örnekler:

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

Senaryo:

Bunu bir .shdosyaya veya şuraya ekleyin ~/.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

Ayrıca docker build, çıktı aldığı görüntü adını yapabilir ve yönlendirebilirsiniz docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build size çok satırlı metin verecek ... Successfully built 18e77bc0d83a
  • ile son satırı al tail -n1
  • bölmek ' 've 3rd kelimesini almakcut -d' ' -f3
  • runile argüman olarak iletmekxargs -I{} docker run {}

tam çıktı elde etmek için | tee /dev/ttysonra ekleyin docker build .!
oliverpool

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.