Erstellen Sie Dockerfile und führen Sie es mit einem Befehl aus

136

Ist es möglich, ein Image aus Dockerfile zu erstellen und es mit einem einzigen Befehl auszuführen?
Es gibt einen Befehl docker buildzum Erstellen einer Docker-Datei und docker run -itzum Ausführen des Images.

Gibt es eine Kombination dieser beiden Befehle, um das Erstellen und Ausführen mit nur einem Befehl zu vereinfachen?

Funkeln
quelle
Wenn Sie Ihren Anwendungsfall näher erläutern, können wir Ihnen möglicherweise bessere Optionen vorstellen.
Jonathon Reinhart
7
@ JonathonReinhart Mein Anwendungsfall besteht darin, schnell zu iterieren, wenn ich eine Docker-Datei bearbeite, an der ich arbeite.
Shubham Chaudhary

Antworten:

154

Nein, es gibt keinen einzigen Befehl. Wenn Sie Ihr Image jedoch beim Erstellen mit Tags versehen, ist die Ausführung einfacher:

docker build -t foo . && docker run -it foo
Jonathon Reinhart
quelle
2
Gute Antwort, da Sie das Bild dann einfach entfernen können, wenn Sie möchten : docker rmi foo.
Sarkis Varozian
236

Wenn Sie das Taggen vermeiden möchten, wird docker build -qnur der endgültige Bild-Hash ausgegeben , den Sie als Argument für Folgendes verwenden können docker run:

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

Und fügen Sie hinzu --rm, docker runwenn der Container beim Beenden automatisch entfernt werden soll.

docker run --rm -it $(docker build -q .)
erschreckend
quelle
9
Besser als die akzeptierte Antwort, da das lokale Image-Repository nicht
überladen ist
18
@InsOp Eigentlich erzeugt dies auch lokale Bilder. Sie sind einfach nicht markiert.
Jonathon Reinhart
2
Leider zeigt dies nicht die reguläre Build-Ausgabe von docker build: /
Lion
1
@ Löwe, dass der Punkt der -qOption. Um es leise zu machen, geben Sie nur das automatisch generierte Tag aus. Und das ist es. Fühlen Sie sich frei, dieses stdin zu verwandeln, wie Sie möchten.
Salathiel Genèse
Um die Ausgabe des docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
Builds
5

Wenn Sie Makefile verwenden, finde ich dieses Snippet nützlich:

build:
    @docker build . | tee .buildlog

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

Sie müssen nicht markiert werden, wie in der Antwort von @ jonathon-reinhart, aber Sie erhalten auch die Build-Ausgabe.

Tavlima
quelle
5

Ich verwende Docker-Compose für diese Bequemlichkeit, da die meisten Apps, die ich erstelle, früher oder später mit externen Diensten sprechen. Wenn ich es also trotzdem verwenden werde, warum nicht von Anfang an. Haben Sie einfach docker-compose.yml als:

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

und dann einfach die App ausführen mit:

docker-compose up --build app

Das Image wird neu erstellt oder der Container wird wiederverwendet, je nachdem, ob Änderungen an der Image-Definition vorgenommen wurden.

Dejan Simic
quelle
0

Windows PC

Machen Sie eine run.batDatei. Fügen Sie dann in der Datei Folgendes hinzu:

docker build -t foo . 
docker run -it foo

Gehen Sie folgendermaßen vor, um die Datei mit Powershell oder Cmd auszuführen:

./run.bat
rauben
quelle
0

docker-build-and-run

Ich habe einen kleinen Hilfsbefehl zum Erstellen und Ausführen in einem einzigen Befehl erstellt. Unter Linux oder Mac können Sie dies zu Ihrem hinzufügen ~/.bash_profile, um es im Terminal verfügbar zu machen.

Verwendung:

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

Beispiele:

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

Das Drehbuch:

Fügen Sie dies einer .shDatei hinzu oder fügen Sie es Ihrer hinzu ~/.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
quelle
0

Sie können auch den Bildnamen docker buildausführen und weiterleiten, an den er ausgegeben wird docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build erhalten Sie mehrzeiligen Text ... Successfully built 18e77bc0d83a
  • Sie erhalten die letzte Zeile mit tail -n1
  • geteilt durch ' 'und 3rd Wort mit bekommencut -d' ' -f3
  • Übergeben Sie es als Argument an runmitxargs -I{} docker run {}
Viacheslav Shalamov
quelle
hinzufügen , | tee /dev/ttynachdem docker build .die volle Leistung zu erhalten!
Oliverpool
0

Für alle, die nach einer wiederverwendbaren Lösung suchen, können Sie dieses Docker-Plugin installieren, das ich erstellt habe: https://github.com/stasmihailov/docker-script

Dann können Sie eine Docker-Datei wie folgt erstellen und ausführen:

docker script ./Dockerfile
Denis Babochenko
quelle