Crea ed esegui Dockerfile con un solo comando


137

È possibile creare un'immagine da Dockerfile ed eseguirla con un singolo comando?
Esiste un comando docker buildper creare un file Docker ed docker run -iteseguire l'immagine.

Esiste una combinazione di questi due comandi per semplificare la creazione e l'esecuzione con un solo comando?


Se approfondisci il tuo caso d'uso, potrebbero esserci opzioni migliori che possiamo presentare.
Jonathon Reinhart,

7
@JonathonReinhart Il mio caso d'uso è iterare rapidamente quando sto modificando un Dockerfile su cui sto lavorando.
Shubham Chaudhary,

Risposte:


154

No, non esiste un singolo comando. Ma se tagghi la tua immagine mentre la costruisci, sarà più facile eseguirla:

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

2
Buona risposta, perché si può quindi facilmente rimuovere l'immagine se si desidera: docker rmi foo.
Sarkis Varozian,

237

Se si desidera evitare la codifica, docker build -qnon viene prodotto altro che l' hash dell'immagine finale , che è possibile utilizzare come argomento per docker run:

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

E aggiungere --rma docker runse si desidera che il contenitore rimosso automaticamente quando si esce.

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

9
Meglio della risposta accettata, poiché non ingombra il repository di immagini locale
InsOp

18
@InsOp In realtà, anche questo produce immagini locali. Non sono semplicemente taggati.
Jonathon Reinhart,

2
Purtroppo questo non ti mostra il normale output di build da docker build: /
Lion,

1
@Lion che il punto di -qopzione. Per renderlo silenzioso, emettere solo il tag generato automaticamente. E questo è tutto. Sentiti libero di trasformare quello stdin come preferisci.
Salathiel Genèse,

Per ottenere l'output della build, è necessario adattare la risposta di Viacheslav Shalamov :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool

5

Se usi Makefile, trovo questo frammento utile:

build:
    @docker build . | tee .buildlog

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

Non hai bisogno di taggare, come nella risposta @ jonathon-reinhart, ma ottieni anche l'output di compilazione.


5

Uso docker-compose per questa comodità poiché la maggior parte delle app che sto sviluppando parlano prima o poi con servizi esterni, quindi se lo userò comunque, perché non usarlo dall'inizio. Basta avere docker-compose.yml come:

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

e quindi esegui l'app con:

docker-compose up --build app

Ricostruirà l'immagine o riutilizzerà il contenitore a seconda che siano state apportate modifiche alla definizione dell'immagine.


0

PC Windows

Crea un run.batfile. Quindi nel file aggiungi questo:

docker build -t foo . 
docker run -it foo

Per eseguire il file usando powershell o cmd, procedere come segue:

./run.bat

0

docker-build-and-run

Ho creato un piccolo comando di aiuto per la costruzione e l'esecuzione, in un unico comando. Su Linux o Mac, puoi aggiungerlo al tuo ~/.bash_profileper renderlo disponibile nel Terminale.

Uso:

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

Esempi:

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

Il copione:

Aggiungi questo a un .shfile o aggiungilo a ~/.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

Puoi anche fare docker builde reindirizzare il nome dell'immagine a cui emette docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build ti darà un testo su più righe ... Successfully built 18e77bc0d83a
  • ottieni l'ultima riga con tail -n1
  • dividere per ' 'e ottenere la 3seconda parola concut -d' ' -f3
  • passalo come argomento runconxargs -I{} docker run {}

aggiungi | tee /dev/ttydopo docker build .per ottenere l'output completo!
oliverpool,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.