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

Возможно ли построить и запустить Dockerfile с помощью только одной команды, так как есть одна команда docker build для создания файла Docker и docker run -it для запуска команды.

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

ПК с Windows

Создайте файл run.bat. Затем в файле добавить это:

docker build -t foo . 
docker run -it foo

Чтобы запустить файл с помощью powershell или cmd, сделайте следующее:

./run.bat

Ответ 5

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 "[email protected]" ]]; 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

    [email protected]


    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
}