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

349

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

是否有任何这两个命令的组合方式可以更轻松地使用一个命令来构建和运行?


如果您详细说明您的用例,我们可能会提供更好的选项。 - Jonathon Reinhart
24
我的用途是在编辑 Dockerfile 时快速迭代。请问需要翻译什么其他内容吗? - Shubham Chaudhary
10个回答

577

如果您想避免打标签,docker build -q将仅输出最终映像哈希,您可以将其用作docker run的参数:

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

如果你希望容器在退出时自动删除,请在docker run命令中添加--rm参数。

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

18
比起被接受的答案更好,因为它不会使本地图像存储库杂乱无章。 - InsOp
42
实际上,这也会生成本地图像,只是它们没有标记。 - Jonathon Reinhart
8
遗憾的是,这无法显示 docker build 的常规构建输出 :/ - Lion
6
"-q" 选项的作用是让程序静默运行,仅输出自动生成的标签。没有其他输出。您可以随意处理stdin的内容。 - Salathiel Genèse
3
这个答案是一个很好的技巧!我使用了一段时间,但后来意识到它在需要在末尾添加运行时命令的情况下是不可取的,比如 docker run ... $(docker build -q .) python foo.py。问题是,如果 "docker build ..." 部分意外出现错误,那么 "docker run ..." 部分实际上会忽略构建错误,并继续并将下一个单词(在这种情况下是 "python")当作镜像名称来处理。换句话说,现在它试图用名为 "python" 的镜像运行 foo.py,这不是你想要的。 - RayLuo
显示剩余5条评论

317
不,没有单个命令。但是,如果在构建镜像时对其进行标记,运行起来会更容易:
docker build -t foo . && docker run -it foo

10
好的答案,因为你可以很容易地删除图像(如果需要):docker rmi foo - Sarkis Varozian

79

出于方便考虑,我使用docker-compose来构建大多数应用程序,因为它们中的大多数在早期或晚期都需要与外部服务进行通信,所以如果我还要使用它,为什么不从一开始就使用呢?只需将docker-compose.yml放在以下位置:

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

然后只需使用以下命令运行应用程序:

docker-compose up --build app
它将重新构建镜像,或根据镜像定义是否有更改来重用容器。

它将重新构建镜像,或根据镜像定义是否有更改来重用容器。


8

最近我的每次构建完成后都会收到一条关于使用docker scan的推广信息。

使用“docker scan”运行Snyk测试以查找漏洞并学习如何修复它们

这是我以前的做法:

docker build --quiet .

以下是目前正在运作的内容:

docker build --quiet . | head -n1

5
请参考 https://github.com/docker/scan-cli-plugin/issues/149#issuecomment-823969364 中的方法,永久禁用该消息。export DOCKER_SCAN_SUGGEST=false - Tobias
2
@bozdoz 一个促销信息与一条命令构建和运行有什么关系? - AlxVallejo
@AlxVallejo 请参考上面的评论。Docker在每次构建后都会打印一行关于使用Snyk的内容。因此,根据我的回答,我以前所做的事情不再起作用了(因为docker build不再仅打印图像哈希)。 - bozdoz
1
我不确定为什么这被发布为单独的答案。就像AlxVallejo一样,我也感到困惑,特别是因为这个回复出现在主题中的第一个。 - Sridhar Sarnobat

7
如果您使用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的回答中一样进行标记,但您也可以获得构建输出。


6

您还可以执行docker build并将其输出的镜像名称传递给docker run

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build会输出多行文本,其中包含 ... Successfully built 18e77bc0d83a
  • 使用tail -n1获取最后一行
  • 使用cut -d' ' -f3将其按照空格分割,并获取第三个单词
  • 将其作为参数传递给run,并使用 xargs -I{} docker run {}

3
docker build .后面加上| tee /dev/tty,以获取完整的输出! - oliverpool

3

如果您正在寻找可重复使用的解决方案,您可以安装我创建的此Docker插件: https://github.com/stasmihailov/docker-script

然后,您可以按照以下方式构建和运行Dockerfile:

docker script ./Dockerfile

2

构建并运行docker

我创建了一个小工具命令,可以用单个命令构建和运行docker。在Linux或Mac上,您可以将其添加到~/.bash_profile中,以在终端中使用。

用法:

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

脚本:

将此内容添加到.sh文件中,或者将其添加到您的~/.bash_profile中:


Translated:
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
}


1

Windows PC

创建一个run.bat文件。然后在文件中添加以下内容:

docker build -t foo . 
docker run -it foo

使用PowerShell或CMD运行文件,请执行以下操作:

./run.bat

0

考虑自动为生成的图片命名:

alias docker-up=docker build -t $(basename $PWD) . && docker run -it $(basename $PWD)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接