Twórz i uruchamiaj Dockerfile za pomocą jednego polecenia

150

Czy można zbudować obraz z Dockerfile i uruchomić go jednym poleceniem?
Jest jedno polecenie, docker buildaby zbudować plik Dockerfile i docker run -ituruchomić obraz.

Czy istnieje jakaś kombinacja tych dwóch poleceń, aby ułatwić tworzenie i uruchamianie za pomocą tylko jednego polecenia?

Migotanie
źródło
Jeśli rozwiniesz swój przypadek użycia, mogą istnieć lepsze opcje, które możemy przedstawić.
Jonathon Reinhart,
8
@JonathonReinhart Moim przypadkiem jest szybkie iterowanie podczas edytowania pliku Dockerfile, nad którym pracuję.
Shubham Chaudhary

Odpowiedzi:

174

Nie, nie ma jednego polecenia. Ale jeśli otagujesz swój obraz podczas jego tworzenia, łatwiej będzie go uruchomić:

docker build -t foo . && docker run -it foo
Jonathon Reinhart
źródło
2
Dobra odpowiedź, ponieważ można następnie łatwo usunąć zdjęcie, jeśli chcesz: docker rmi foo.
Sarkis Varozian
260

Jeśli chcesz uniknąć tagowania, docker build -qwyświetla tylko końcowy skrót obrazu , którego możesz użyć jako argumentu do docker run:

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

Dodaj --rmdo, docker runjeśli chcesz, aby kontener był automatycznie usuwany po wyjściu.

docker run --rm -it $(docker build -q .)
starthal
źródło
9
Lepsza niż zaakceptowana odpowiedź, ponieważ nie zaśmieca lokalnego repozytorium obrazów
InsOp
21
@InsOp Właściwie to również tworzy obrazy lokalne. Po prostu nie są oznaczeni.
Jonathon Reinhart
2
Niestety nie pokazuje to zwykłego wyniku kompilacji z docker build: /
Lion
1
@Lion to punkt -qwyjścia. Aby było cicho, wyświetla tylko automatycznie wygenerowany tag. I to wszystko. Możesz dowolnie zmieniać to stdin.
Salathiel Genèse
1
Aby uzyskać wynik kompilacji, należy dostosować odpowiedźdocker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
Wiaczesława Szalamowa
11

Używam docker-compose dla tej wygody, ponieważ większość aplikacji, które tworzę, prędzej czy później komunikuje się z usługami zewnętrznymi, więc jeśli i tak mam zamiar go używać, dlaczego nie użyć go od początku. Wystarczy mieć plik docker-compose.yml jako:

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

a następnie po prostu uruchom aplikację z:

docker-compose up --build app

Odbuduje obraz lub ponownie użyje kontenera w zależności od tego, czy wprowadzono zmiany w definicji obrazu.

Dejan Simic
źródło
5

Jeśli używasz Makefile, ten fragment jest przydatny:

build:
    @docker build . | tee .buildlog

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

Nie potrzebujesz tagowania, jak w odpowiedzi @ jonathon-reinhart, ale otrzymujesz również wynik kompilacji.

tavlima
źródło
1

Możesz również wykonać docker buildi potokować nazwę obrazu, który wyświetla do docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build wyświetli tekst wielowierszowy ... Successfully built 18e77bc0d83a
  • dostajesz ostatnią linię z tail -n1
  • podziel się ' 'i otrzymaj 3rd słowo za pomocącut -d' ' -f3
  • przekazać to jako argument do runwithxargs -I{} docker run {}
Viacheslav Shalamov
źródło
1
dodaj | tee /dev/ttypo, docker build .aby uzyskać pełną wydajność!
oliverpool
0

Komputer z systemem Windows

Utwórz run.batplik. Następnie w pliku dodaj to:

docker build -t foo . 
docker run -it foo

Aby uruchomić plik za pomocą programu PowerShell lub cmd, wykonaj następujące czynności:

./run.bat
Obrabować
źródło
0

docker-build-and-run

Stworzyłem małe polecenie pomocnicze do budowania i uruchamiania w jednym poleceniu. W systemie Linux lub Mac możesz dodać to do swojego, ~/.bash_profileaby było dostępne w terminalu.

Stosowanie:

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

Przykłady:

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

Scenariusz:

Dodaj to do .shpliku lub dodaj do ~/.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
}

Scott Rippey
źródło
0

Dla każdego, kto szuka rozwiązania wielokrotnego użytku, możesz zainstalować tę wtyczkę dockera, którą stworzyłem: https://github.com/stasmihailov/docker-script

Następnie możesz zbudować i uruchomić plik Dockerfile w następujący sposób:

docker script ./Dockerfile
Denis Babochenko
źródło