Создайте и запустите Dockerfile с помощью одной команды

138

Можно ли собрать образ из Dockerfile и запустить его с помощью одной команды?
Есть одна команда docker buildдля создания Dockerfile и docker run -itзапуска образа.

Есть ли какая-либо комбинация этих двух команд, чтобы упростить сборку и запуск с помощью одной команды?

мерцать
источник
Если вы подробно расскажете о своем сценарии использования, мы можем предложить лучшие варианты.
Джонатон Рейнхарт
7
@JonathonReinhart Мой вариант использования - быстро перебирать, когда я редактирую файл Docker, над которым я работаю.
Shubham Chaudhary

Ответы:

159

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

docker build -t foo . && docker run -it foo
Джонатон Рейнхарт
источник
2
Хороший ответ , потому что вы можете легко удалить изображение , если вы хотите: docker rmi foo.
Саркис Варозян
240

Если вы хотите избежать тегирования, docker build -qвыводит только окончательный хэш изображения , который можно использовать в качестве аргумента для docker run:

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

И добавить --rmк , docker runесли вы хотите, чтобы контейнер автоматически удаляется при выходе.

docker run --rm -it $(docker build -q .)
starthal
источник
9
Лучше, чем принятый ответ, поскольку он не загромождает локальный репозиторий изображений
InsOp
18
@InsOp На самом деле, это тоже создает локальные изображения. Они просто не помечены.
Джонатон Рейнхарт
2
К сожалению, это не показывает вам стандартный вывод сборки docker build: /
Lion
1
@Lion, что точка -qопции. Чтобы было тихо, выводить только автоматически сгенерированный тег. И это все. Не стесняйтесь трансформировать этот стандартный ввод по своему усмотрению.
Salathiel Genèse,
Чтобы получить результат сборки, вы должны адаптировать ответ Вячеслава Шаламова :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool
6

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

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

а затем просто запустите приложение с помощью:

docker-compose up --build app

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

Деян Симич
источник
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, но вы также получаете результат сборки.

tavlima
источник
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 .чтобы получить полный вывод!
Оливерпуль
0

Для тех, кто ищет многоразовое решение, вы можете установить этот плагин докера, который я создал: https://github.com/stasmihailov/docker-script

Затем вы можете собрать и запустить Dockerfile следующим образом:

docker script ./Dockerfile
Денис Бабоченко
источник