하나의 명령으로 Dockerfile 빌드 및 실행


136

Dockerfile에서 이미지를 빌드하고 단일 명령으로 이미지를 실행할 수 있습니까? Dockerfile을 빌드 하고 이미지를 실행 하는
명령이 하나 있습니다 .docker builddocker run -it

하나의 명령으로 쉽게 빌드하고 실행할 수 있도록이 두 명령의 조합이 있습니까?


사용 사례를 자세히 설명하면 더 나은 옵션을 제시 할 수 있습니다.
Jonathon Reinhart

7
@ JonathonReinhart 내 유스 케이스는 내가 작업중 인 Dockerfile을 편집 할 때 신속하게 반복하는 것입니다.
Shubham Chaudhary

답변:


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 .)

그리고 추가 --rmdocker run당신이 종료 할 때 컨테이너가 자동으로 제거합니다.

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

9
로컬 이미지 저장소를 어지럽히 지 않기 때문에 허용 된 답변보다 낫습니다
InsOp

18
@InsOp 실제로 이것은 로컬 이미지도 생성합니다. 그들은 단지 태그가 없습니다.
Jonathon Reinhart 2018

2
안타깝게도 다음과 같은 일반 빌드 출력을 보여주지 않습니다 docker build: /
Lion

1
@ 라이온 그 선택의 포인트 -q. 자동 생성 된 태그 만 출력하려면 조용히하십시오. 그리고 그게 다야. 원하는대로 stdin을 자유롭게 변환하십시오.
Salathiel Genè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

윈도우 PC

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
  • 나누고 rd 단어를 ' '얻을3cut -d' ' -f3
  • 에 인수로 전달 runxargs -I{} docker run {}

추가 | tee /dev/ttydocker build .전체 출력을 얻을!
oliverpool

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.