1つのコマンドでDockerfileをビルドして実行する


136

Dockerfileからイメージをビルドし、単一のコマンドで実行することは可能ですか?Dockerfileをビルドしてイメージを実行する
コマンドが1つあります。docker builddocker run -it

これらの2つのコマンドを組み合わせて、1つのコマンドだけでビルドと実行を簡単にする方法はありますか


ユースケースについて詳しく説明する場合は、より良いオプションが提示される可能性があります。
Jonathon Reinhart 2017

7
@JonathonReinhart私の使用例は、作業中のDockerfileを編集しているときにすばやく反復することです。
Shubham Chaudhary 2017

回答:


154

いいえ、単一のコマンドはありません。ただし、ビルド時にイメージにタグを付けると、実行が簡単になります。

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

2
必要に応じて画像を簡単に削除できるため、正解ですdocker rmi foo
Sarkis Varozian、

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実際には、これもローカルイメージを生成します。タグ付けされていないだけです。
Jonathon Reinhart

2
残念ながら、これは通常のビルド出力を表示しませんdocker build:/
Lion

1
@Lion -qオプションのポイント。静かにするには、自動生成されたタグのみを出力します。以上です。そのstdinを自由に変換してください。
SalathielGenèse

ビルドの出力を取得するには、適応すべきViacheslav Shalamovの答えを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 PC

run.batファイルを作成します。次に、ファイルに次を追加します。

docker build -t foo . 
docker run -it foo

powershellまたはcmdを使用してファイルを実行するには、次のようにします。

./run.bat

0

docker-build-and-run

ビルドと実行のための小さなヘルパーコマンドを1つのコマンドで作成しました。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
  • 分割し' '3rdワードを取得cut -d' ' -f3
  • 引数として渡すrunxargs -I{} docker run {}

完全な出力を得るために| tee /dev/ttydocker build .に追加してください!
オリバープール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.