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

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

Twinkle

Ответов: 9

Ответы (9)

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

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

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

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

версия: «3»
Сервисы:
  приложение:
    строить: .

, а затем просто запустите приложение с:

docker-compose up - build app

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

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

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

docker script ./Dockerfile

Вы также можете выполнить сборку докера и имя образа канала, которое он выводит на запуск докера:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build даст вам многострочный текст ... Успешно построенный 18e77bc0d83a
  • вы получите последнюю строку с tail -n1
  • разделить на '' и получить 3первое слово с помощью cut -d '' -f3
  • передать его как аргумент в run с xargs -I {} docker run {}

ПК с Windows

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

docker build -t foo . 
docker run -it foo

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

./run.bat

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

Используйте «сканирование докеров» для запуска тестов Snyk на изображениях, чтобы найти уязвимости и узнать, как их исправить.

Вот что я использовал для выполнения:

сборка докера -q.

и вот что сейчас работает:

сборка докера -q. | голова -n1

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

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

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

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

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 - узел server.js

Скрипт:

Добавьте это в файл .sh или добавьте его в свой ~ / .bash_profile:

TERM_GREEN = "\ 033 [1; 32м"
TERM_BLUE = "\ 033 [1; 34 м"
TERM_NC = "\ 033 [0 м"
docker-build-and-run () {
    если [[-z "$ @"]]; тогда
        эхо "
            Использование:
                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 - узел server.js
        "
        возвращение
    фи

    # Извлекаем отрезки между тире:
    BEFORE_THE_DASHES =
    while (("$ #")); делать
        если [["$ 1" = "-"]]; тогда
            сдвиг
            ломать
        фи
        BEFORE_THE_DASHES = "$ BEFORE_THE_DASHES $ 1"
        сдвиг
    Выполнено
    SEGMENT_1 = $ BEFORE_THE_DASHES

    BEFORE_THE_DASHES =
    while (("$ #")); делать
        если [["$ 1" = "-"]]; тогда
            сдвиг
            ломать
        фи
        BEFORE_THE_DASHES = "$ BEFORE_THE_DASHES $ 1"
        сдвиг
    Выполнено
    SEGMENT_2 = $ BEFORE_THE_DASHES

    SEGMENT_3 = $ @


    BUILD_ARGS = $ SEGMENT_1
    RUN_ARGS = $ SEGMENT_2
    RUN_COMMAND = $ SEGMENT_3
    если [-z "$ RUN_COMMAND"]; тогда
      RUN_COMMAND = $ RUN_ARGS
      RUN_ARGS =
    фи


    TEMP_TAG = docker-build-and-run-temp

    docker rm -f $ TEMP_TAG 2> / dev / null
    printf "$ {TERM_GREEN} Создание контейнера Docker ($ {TERM_BLUE} сборка докера $ BUILD_ARGS $ {TERM_GREEN}) $ {TERM_NC} \ n" \
    && docker build --tag $ TEMP_TAG $ BUILD_ARGS \
    && printf "$ {TERM_GREEN} Запуск контейнера Docker ($ {TERM_BLUE} запуск докера $ RUN_ARGS $ RUN_COMMAND $ {TERM_GREEN}) $ {TERM_NC} \ n" \
    && docker run --rm -it $ RUN_ARGS --label $ TEMP_TAG $ TEMP_TAG $ RUN_COMMAND
}

2022 WebDevInsider