Is het mogelijk om een image van Dockerfile te bouwen en uit te voeren met een enkele opdracht?
Er is één opdracht docker build
om een Dockerfile te bouwen en docker run -it
om 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 -q
niets anders af dan de final image hash, die je kunt gebruiken als argument voor docker run
:
docker run -it $(docker build -q .)
En voeg --rm
toe aan docker run
als 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 scan
na 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 build
doen en de afbeeldingsnaam pipen die het uitvoert naar docker run
:
docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
docker build
geeft u tekst met meerdere regels... Successfully built 18e77bc0d83a
- je krijgt de laatste regel met
tail -n1
- gesplitst door
' '
en krijg3
de woord metcut -d' ' -f3
- geef het als argument door aan
run
metxargs -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_profile
om 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