Побудувати та запустити Dockerfile за допомогою однієї команди


136

Чи можна створити зображення з Dockerfile і запустити його за допомогою однієї команди?
Існує одна команда docker buildдля створення Dockerfile та docker run -itзапуску зображення.

Чи є комбінація цих двох команд, щоб полегшити побудову та запуск лише однією командою?


Якщо ви докладно розглядаєте випадки використання, ми можемо представити кращі варіанти.
Джонатан Райнхарт

7
@JonathonReinhart Моя справа використання - це швидка ітерація під час редагування Dockerfile, над яким я працюю.
Shubham Chaudhary

Відповіді:


154

Ні, жодної команди немає. Але якщо ви позначите своє зображення під час його створення, це буде легше запустити:

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

2
Хороший відповідь , тому що ви можете легко видалити зображення , якщо ви хочете: docker rmi foo.
Саркіс Варозян

237

Якщо ви хочете уникати тегів, docker build -qне виводиться нічого, крім кінцевого хеша зображення , який ви можете використовувати як аргумент для docker run:

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

І додати --rmдо , docker runякщо ви хочете, щоб контейнер автоматично видаляється при виході.

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

9
Краще, ніж прийнята відповідь, оскільки вона не захаращує локальне сховище зображень
InsOp

18
@InsOp Насправді це створює і локальні зображення. Вони просто не помічені.
Джонатан Райнхарт

2
На жаль, це не показує вам регулярний вихід збірки з docker build: /
Лев

1
@ Лев, що точка -qваріанту. Щоб зробити це тихо, вивести лише автогенерований тег. І це все. Не соромтеся трансформувати цей стдин, як вам подобається.
Салатієль Генезе

Щоб отримати результат збірки, вам слід адаптувати відповідь В’ячеслава Шаламова :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool

5

Якщо ви використовуєте Makefile, я вважаю цей фрагмент корисним:

build:
    @docker build . | tee .buildlog

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

Вам не потрібно тегування, як у відповіді @ jonathon-reinhart, але ви також отримаєте вихід збірки.


5

Я використовую docker-compose для цієї зручності, оскільки більшість програм, які я будую, рано чи пізно спілкуються із зовнішніми службами, тому, якщо я все одно буду користуватися ним, чому б не використовувати його з самого початку. Просто майте docker-compose.yml як:

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

а потім просто запустіть додаток за допомогою:

docker-compose up --build app

Він відновить зображення або повторно використовувати контейнер залежно від того, чи були внесені зміни у визначення зображення.


0

ПК з Windows

Складіть run.batфайл. Потім у файл додайте це:

docker build -t foo . 
docker run -it foo

Щоб запустити файл за допомогою powershell або cmd, виконайте це:

./run.bat

0

docker-build-and-run

Я створив невелику помічну команду для створення та запуску в одній команді. На Linux або Mac ви можете додати це до свого, ~/.bash_profileщоб зробити його доступним у Терміналі.

Використання:

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

Приклади:

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

Сценарій:

Додайте це до .shфайлу або додайте його до свого ~/.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

Ви також можете зробити docker buildі назвати зображення зображення, яке воно видає docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build дасть вам багаторядковий текст ... Successfully built 18e77bc0d83a
  • ви отримуєте останній рядок із tail -n1
  • розділити на ' 'і отримати 3слово зcut -d' ' -f3
  • передати його в якості аргументу runзxargs -I{} docker run {}

додати | tee /dev/ttyпісля, docker build .щоб отримати повний вихід!
оліверпуль

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.