使用一个命令构建并运行Dockerfile


136

是否可以从Dockerfile构建映像并使用单个命令运行它?
有一个命令docker build可以构建Dockerfile并docker run -it运行映像。

这两个命令是否有任何组合,以使仅使用一个命令就可以更轻松地构建和运行它?


如果您详细说明用例,我们可能会提供更好的选择。
乔纳森·莱因哈特

7
@JonathonReinhart我的用例是在编辑正在处理的Dockerfile时快速迭代。
Shubham乔杜里

Answers:


154

不,没有单个命令。但是,如果您在构建图像时对其进行标记,则将更易于运行:

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

2
好的答案,因为您可以根据需要轻松删除图像:docker rmi foo
Sarkis Varozian'1

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实际上,这也会产生本地图像。他们只是没有被标记。
乔纳森·莱因哈特

2
不幸的是,这并没有向您显示常规的构建输出docker build:/
Lion

1
@Lion就是-q选择的重点。为了使其安静,仅输出自动生成的标签。就是这样。随意转换您喜欢的标准输入。
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

我在一个命令中创建了一个用于构建和运行的辅助命令。在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
  • 将其作为参数传递给runwithxargs -I{} docker run {}

加入| tee /dev/ttydocker build .获得完整的输出!
奥利弗浦

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.