Bouw en voer Dockerfile uit met één opdracht

Is het mogelijk om een ​​image van Dockerfile te bouwen en uit te voeren met een enkele opdracht?
Er is één opdracht docker buildom een ​​Dockerfile te bouwen en docker run -itom de afbeelding uit te voeren.

Is er een combinatie van deze twee opdrachten om het bouwen en uitvoeren met slechts één opdracht gemakkelijker te maken?


Antwoord 1, autoriteit 100%

Als je tagging wilt vermijden, geeft docker build -qniets anders af dan de final image hash, die je kunt gebruiken als argument voor docker run:

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

En voeg --rmtoe aan docker runals u wilt dat de container automatisch wordt verwijderd wanneer deze wordt afgesloten.

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

Antwoord 2, autoriteit 65%

Nee, er is niet één commando. Maar als u uw afbeelding tagt terwijl u deze maakt, is deze gemakkelijker uit te voeren:

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

Antwoord 3, autoriteit 11%

Ik gebruik docker-compose voor dit gemak, aangezien de meeste apps die ik aan het bouwen ben, vroeg of laat met externe services praten, dus als ik het toch ga gebruiken, waarom zou ik het dan niet vanaf het begin gebruiken. Gebruik docker-compose.yml als:

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

en voer de app dan gewoon uit met:

docker-compose up --build app

Het zal de afbeelding opnieuw opbouwen of de container opnieuw gebruiken, afhankelijk van of er wijzigingen zijn aangebracht in de afbeeldingsdefinitie.


Antwoord 4, autoriteit 2%

Onlangs kreeg ik een promobericht over het gebruik van docker scanna elke build.

Gebruik ‘docker-scan’ om Snyk-tests uit te voeren op afbeeldingen om kwetsbaarheden te vinden en te leren hoe u deze kunt oplossen

Dit is wat ik gebruikteom te doen:

docker build -q .

en dit is wat nu werkt:

docker build -q . | head -n1

Antwoord 5, autoriteit 2%

Als je Makefile gebruikt, vind ik dit fragment nuttig:

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

Je hebt geen tagging nodig, zoals in het antwoord van @jonathon-reinhart, maar je krijgt ook de build-output.


Antwoord 6

U kunt ook docker builddoen en de afbeeldingsnaam pipen die het uitvoert naar docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker buildgeeft u tekst met meerdere regels ... Successfully built 18e77bc0d83a
  • je krijgt de laatste regel met tail -n1
  • gesplitst door ' 'en krijg 3de woord met cut -d' ' -f3
  • geef het als argument door aan runmet xargs -I{} docker run {}

Antwoord 7

Iedereen die op zoek is naar een herbruikbare oplossing, zou deze docker-plug-in kunnen installeren die ik heb gemaakt:
https://github.com/stasmihailov/docker-script

Dan zou je als volgt een Dockerfile kunnen bouwen en uitvoeren:

docker script ./Dockerfile

Antwoord 8

docker-build-and-run

Ik heb een kleine helperopdracht gemaakt voor bouwen en uitvoeren, in één enkele opdracht. Op Linux of Mac kun je dit toevoegen aan je ~/.bash_profileom het beschikbaar te maken in de Terminal.

Gebruik:

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

Voorbeelden:

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

Het script:

Voeg dit toe aan een .sh-bestand, of voeg het toe aan je ~/.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
}

Antwoord 9

Windows-pc

Maak een run.bat-bestand. Voeg dan in het bestand dit toe:

docker build -t foo . 
docker run -it foo

Om het bestand uit te voeren met powershell of cmd, doe dit:

./run.bat

Other episodes