Dockerfile:构建并运行

Twi*_*kle 94 docker dockerfile

是否可以在一个命令的帮助下构建和运行Dockerfile,因为有一个命令docker build可以构建Dockerfile并docker run -it运行命令.

是否有这两个命令的任意组合,只需一个命令就可以更容易地构建和运行?

小智 166

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

docker run -it $(docker build -q .)
Run Code Online (Sandbox Code Playgroud)

并添加--rmdocker run,如果你想退出时容器自动删除.

docker run --rm -it $(docker build -q .)
Run Code Online (Sandbox Code Playgroud)

  • 比接受的答案更好,因为它不会使本地图像存储库混乱 (8认同)
  • @InsOp实际上,这也会产生本地图像。他们只是没有被标记。 (7认同)
  • @Lion 指出“-q”选项的要点。为了让它安静,只输出自动生成的标签。就是这样。您可以随意转换该标准输入。 (3认同)
  • 这个答案是一个很好的技术!我使用它一段时间,但后来意识到每当我需要在末尾附加运行时命令时这是不可取的,例如“docker run ... $(docker build -q .) python foo.py” 。问题是,如果“docker build ...”部分意外地遇到错误,那么“docker run ...”部分将有效地忽略构建错误,并继续并处理下一个单词(在这种情况下, “python”)就好像它是一个图像名称。换句话说,它现在尝试使用名为“python”的图像运行“foo.py”。那不是你想要的。 (3认同)
  • 遗憾的是,这并没有向您显示docker build的常规构建输出:/ (2认同)
  • 要获得构建的输出,您应该调整[Viacheslav Shalamov的答案](/sf/answers/4145445951/):`docker build。| 三通 /dev/tty | 尾-n1 | 切 -d' ' -f3 | xargs -I{} docker run --rm {}` (2认同)
  • 对于在指定另一个文件夹中的 Dockerfile 时遇到问题的人,这里有一个示例说明如何执行此操作: docker run --rm -it $(docker build -q -f testFolder/Dockerfile 。) (2认同)

Jon*_*art 114

不,没有单一命令.但是,如果您在构建图像时标记图像,则运行起来会更容易:

docker build -t foo . && docker run -it foo
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,因为如果您愿意,您可以轻松删除图像:`docker rmi foo`。 (2认同)

Dej*_*mic 30

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

version: "3"
services:
  app:
    build: .
Run Code Online (Sandbox Code Playgroud)

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

docker-compose up --build app
Run Code Online (Sandbox Code Playgroud)

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


tav*_*ima 6

如果您使用 Makefile,我发现此代码段很有用:

build:
    @docker build . | tee .buildlog

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

您不需要标记,就像@jonathon-reinhart 的回答一样,但您也可以获得构建输出。


Via*_*mov 6

您还可以执行docker build并将其输出到的图像名称通过管道传输docker run

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
Run Code Online (Sandbox Code Playgroud)
  • docker build会给你多行文本... Successfully built 18e77bc0d83a
  • 你得到最后一行tail -n1
  • 分割' '并获取3rd 单词cut -d' ' -f3
  • 将其作为参数传递给runwithxargs -I{} docker run {}

  • 添加[`| tee /dev/tty`](/sf/answers/397408581/) 在`docker build .`之后获得完整的输出! (3认同)

boz*_*doz 6

最近我开始收到一条关于在每次构建后使用的促销信息docker scan

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

这是我用来做:

docker build -q .
Run Code Online (Sandbox Code Playgroud)

这是现在的工作:

docker build -q . | head -n1
Run Code Online (Sandbox Code Playgroud)

  • 请参阅 https://github.com/docker/scan-cli-plugin/issues/149#issuecomment-823969364 了解如何永久禁用该消息。`导出 DOCKER_SCAN_SUGGEST=false` (5认同)
  • @bozdoz 促销消息与在一个命令中构建和运行有什么关系? (2认同)