Xây dựng và chạy Dockerfile với một lệnh


136

Có thể xây dựng hình ảnh từ Dockerfile và chạy nó bằng một lệnh duy nhất không?
Có một lệnh docker buildđể xây dựng Dockerfile và docker run -itchạy hình ảnh.

Có sự kết hợp nào của hai lệnh này để giúp xây dựng và chạy dễ dàng hơn chỉ với một lệnh không?


Nếu bạn giải thích chi tiết về trường hợp sử dụng của mình, chúng tôi có thể đưa ra các tùy chọn tốt hơn.
Jonathon Reinhart

7
@JonathonReinhart Trường hợp sử dụng của tôi là lặp lại nhanh chóng khi tôi đang chỉnh sửa Dockerfile mà tôi đang làm việc.
Shubham Chaudhary

Câu trả lời:


154

Không, không có lệnh duy nhất. Nhưng nếu bạn gắn thẻ hình ảnh của mình khi bạn xây dựng nó, nó sẽ dễ chạy hơn:

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

2
Câu trả lời tốt vì sau đó bạn có thể dễ dàng xóa hình ảnh nếu bạn muốn : docker rmi foo.
Sarkis Varozian

237

Nếu bạn muốn tránh gắn thẻ, sẽ docker build -qkhông tạo ra gì ngoài hàm băm hình ảnh cuối cùng mà bạn có thể sử dụng làm đối số cho docker run:

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

Và thêm --rmvào docker runnếu bạn muốn loại bỏ container tự động khi nó thoát.

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

9
Tốt hơn câu trả lời được chấp nhận, vì nó không làm lộn xộn kho lưu trữ hình ảnh cục bộ
InsOp

18
@InsOp Trên thực tế, điều này cũng tạo ra hình ảnh địa phương. Họ chỉ không được gắn thẻ.
Jonathon Reinhart

2
Đáng buồn thay, điều này không cho bạn thấy đầu ra bản dựng thường xuyên từ docker build: /
Lion

1
@Lion rằng điểm của -qtùy chọn. Để làm cho nó yên lặng, chỉ xuất ra thẻ tự phát. Và đó là nó. Hãy thoải mái biến đổi stdin đó như bạn muốn.
Salathiel Genèse

Để có được đầu ra của bản dựng, bạn nên điều chỉnh câu trả lời của Viacheslav Shalamov :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool

5

Nếu bạn sử dụng Makefile, tôi thấy đoạn trích này hữu ích:

build:
    @docker build . | tee .buildlog

bash: build
    @docker run --rm -it $(shell grep "Successfully built" .buildlog | cut -d ' ' -f 3) /bin/bash

Bạn không cần gắn thẻ, như trong câu trả lời @ jonathon-reinhart, nhưng bạn cũng có được kết quả đầu ra.


5

Tôi sử dụng docker-compose để thuận tiện cho việc này vì hầu hết các ứng dụng tôi đang xây dựng đều nói chuyện với các dịch vụ bên ngoài sớm hơn, vì vậy nếu tôi sẽ sử dụng nó ngay từ đầu, tại sao không sử dụng nó ngay từ đầu. Chỉ cần có docker-compose.yml là:

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

và sau đó chỉ cần chạy ứng dụng với:

docker-compose up --build app

Nó sẽ xây dựng lại hình ảnh hoặc sử dụng lại container tùy theo nếu có thay đổi đối với định nghĩa hình ảnh.


0

Máy tính Windows

Tạo một run.battập tin. Sau đó trong tệp thêm này:

docker build -t foo . 
docker run -it foo

Để chạy tệp bằng powershell hoặc cmd, hãy làm điều này:

./run.bat

0

docker-build-and-run

Tôi đã tạo một lệnh trợ giúp nhỏ để xây dựng và chạy, trong một lệnh duy nhất. Trên Linux hoặc Mac, bạn có thể thêm phần này vào của bạn ~/.bash_profileđể làm cho nó có sẵn trong Terminal.

Sử dụng:

docker-build-and-run BUILD_ARGS [-- RUN_ARGS] [-- RUN_COMMAND]

Ví dụ:

docker-build-and-run . -- npm run test
docker-build-and-run --file ./Dockerfile . -- -v ~/volume:/var/volume -- node server.js

Kịch bản:

Thêm phần này vào một .shtệp hoặc thêm nó vào ~/.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

Bạn cũng có thể làm docker buildvà đặt tên hình ảnh mà nó xuất ra docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build sẽ cung cấp cho bạn văn bản nhiều dòng ... Successfully built 18e77bc0d83a
  • bạn có được dòng cuối cùng với tail -n1
  • chia ra ' 'và nhận được 3từ thứ vớicut -d' ' -f3
  • vượt qua nó như là đối số runvớixargs -I{} docker run {}

thêm | tee /dev/ttysau docker build .để có được đầu ra đầy đủ!
oliverpool

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.