【问题标题】:Build and run Dockerfile with one command使用一个命令构建和运行 Dockerfile
【发布时间】:2017-12-21 19:45:58
【问题描述】:

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

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

【问题讨论】:

  • 如果您详细说明您的用例,我们可能会提供更好的选择。
  • @JonathonReinhart 我的用例是在编辑正在处理的 Dockerfile 时快速迭代。

标签: docker dockerfile


【解决方案1】:

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

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

如果您希望容器在退出时自动删除,请将--rm 添加到docker run

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

【讨论】:

  • 比公认的答案更好,因为它不会弄乱本地图像存储库
  • @InsOp 实际上,这也会生成本地图像。他们只是没有被标记。
  • 遗憾的是,这并没有显示来自docker build 的常规构建输出:/
  • @Lion 表示-q 选项的点。为了让它安静,只输出自动生成的标签。就是这样。随意转换该标准输入。
  • 这个答案是一个很好的技巧!我使用了一段时间,但后来意识到每当我需要在最后附加一个运行时命令时它是不可取的,例如docker run ... $(docker build -q .) python foo.py。问题是,如果“docker build ...”部分意外出错,结果“docker run ...”部分将有效地忽略构建错误,并继续处理下一个单词(在这种情况下, “python”)就好像它是一个图像名称。换句话说,它现在尝试使用名为python 的图像运行foo.py。这不是你想要的。
【解决方案2】:

不,没有单一的命令。但是如果你在构建图像时标记它,它会更容易运行:

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

【讨论】:

  • 很好的答案,因为您可以根据需要轻松删除图像:docker rmi foo
【解决方案3】:

我使用 docker-compose 是为了方便起见,因为我正在构建的大多数应用程序迟早都会与外部服务通信,所以如果我还是要使用它,为什么不从一开始就使用它。只需将 docker-compose.yml 设置为:

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

然后运行应用程序:

docker-compose up --build app

它将根据是否对图像定义进行更改来重建图像或重用容器。

【讨论】:

    【解决方案4】:

    最近我开始收到关于每次构建后使用docker scan促销消息。

    使用 'docker scan' 对图像运行 Snyk 测试以发现漏洞并了解如何修复它们

    这是我使用做的:

    docker build -q .
    

    下面是现在的工作:

    docker build -q . | head -n1
    

    【讨论】:

    【解决方案5】:

    如果你使用 Makefile,我觉得这个 sn-p 很有用:

    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
      • ' ' 分割并得到3rd 单词和cut -d' ' -f3
      • 将其作为参数传递给runxargs -I{} docker run {}

      【讨论】:

      • docker build . 之后添加| tee /dev/tty 以获得完整输出!
      【解决方案7】:

      对于寻找可重用解决方案的任何人,您可以安装我创建的这个 docker 插件: https://github.com/stasmihailov/docker-script

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

      docker script ./Dockerfile
      

      【讨论】:

        【解决方案8】:

        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
        }
        
        

        【讨论】:

          【解决方案9】:

          Windows 电脑

          制作一个run.bat 文件。然后在文件中添加:

          docker build -t foo . 
          docker run -it foo
          

          要使用 powershell 或 cmd 运行文件,请执行以下操作:

          ./run.bat
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 2021-01-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多