为什么 docker build 没有显示命令的任何输出?

Non*_*ame 90 docker docker-build

摘自我的Dockerfile

FROM node:12.18.0
RUN echo "hello world"
RUN psql --version
Run Code Online (Sandbox Code Playgroud)

当我运行时,docker build .即使它们没有被缓存,我也看不到这两个命令的任何输出。文档说docker build默认情况下是冗长的。为什么我看不到命令​​的输出?我以前见过他们。

构建时的输出: 在此处输入图片说明 构建完成后我看到的输出: 在此处输入图片说明

Dockerfile是从基于 Debian 9 的 node:12.18.0 创建的。

Docker 版本 19.03.13,构建 4484c46d9d。

BMi*_*tch 118

您显示的输出来自 buildkit,它是 docker 附带的经典构建引擎的替代品。您可以使用以下--progress选项调整输出:

  --progress string         Set type of progress output (auto, plain, tty). Use plain to show container output
                            (default "auto")
Run Code Online (Sandbox Code Playgroud)

添加--progress=plain将显示未从缓存加载的运行命令的输出。


如果你不想使用 buildkit,你可以通过DOCKER_BUILDKIT=0在你的 shell 中导出来恢复到旧的构建引擎,例如:

DOCKER_BUILDKIT=0 docker build ...
Run Code Online (Sandbox Code Playgroud)

或者

export DOCKER_BUILDKIT=0
docker build ...
Run Code Online (Sandbox Code Playgroud)

  • 使用 `docker build --progress=plain --no-cache ...` 禁用缓存并打印所有输出 (54认同)
  • 我想知道 Docker 中哪些头脑正常的人决定默认隐藏缓存哈希。“嘿,我们将打破地球上所有的 Docker 调试教程,让我们一起努力吧!”。在我看来,他们向开发社区竖起了大中指。 (14认同)
  • 关于“--progress=plain”的答案似乎不再有效。对我来说,在 OS X 上,它只是输出命令、哈希值和步骤结果(例如“CACHED”)。现在只有强制禁用 buildkit 才会返回任何有用的输出。这是最近的变化,还是因平台而异? (6认同)
  • 不幸的是,它似乎对我不起作用。 (6认同)
  • @Jon如果该步骤已缓存,则不会运行任何命令,因此没有可显示的输出。有或没有 buildkit 都是一样的。 (3认同)

vol*_*kit 44

在 Docker 20.10 中,我也必须使用 --no-cache 标志。否则不会显示缓存的输出。

docker build --progress=plain --no-cache .
Run Code Online (Sandbox Code Playgroud)

  • `--no-cache` 不仅隐藏缓存的输出,它还完全禁用 Docker 的层缓存。您当然不想一直使用它。 (17认同)
  • 我使用了“--no-cache”,但我仍然在命令中看到“CACHED”:/ (2认同)

use*_*745 35

做 2 件事

  1. 而不是docker build .使用这个
docker build . --progress=plain
Run Code Online (Sandbox Code Playgroud)
  1. 每次构建时都将随机垃圾添加到RUN命令中(这会让 docker 认为它以前没有见过该命令,因此它不使用缓存的版本)

例子。如果您的命令是RUN ls使用此命令RUN ls && echo sdfjskdflsjdfsdfjskdflsjdf每次构建时将其更改为其他命令)。

为什么这有效

我尝试了其他答案,但它们都存在问题和缺陷。令人非常沮丧的是 Docker 没有一些像--verbose=true.

这是我最终使用的(这很可笑,但它有效)。

假设你想查看命令的输出ls,这是行不通docker build .

RUN ls
Run Code Online (Sandbox Code Playgroud)

但这打印输出docker build --progress=plain

RUN ls
Run Code Online (Sandbox Code Playgroud)

现在再试一次,它不会打印!- 那是因为 docker 缓存了未更改的层,所以技巧是每次都通过添加一些无意义的内容来更改命令&& echo sdfljsdfljksdfljk,然后每次都更改无意义的内容docker build --progress=plain

# This prints
RUN ls && echo sdfljsdfljksdfljk
Run Code Online (Sandbox Code Playgroud)
# Next time you run it use a different token
RUN ls && echo sdlfkjsldfkjlskj
Run Code Online (Sandbox Code Playgroud)

所以每次我都会敲击键盘并想出一个新的标记。令人目瞪口呆。(请注意,我尝试过类似的东西&& openssl rand -base64 12生成随机字符串之类的方法,但 docker 意识到代码没有更改,这是行不通的)。

该解决方案远不如真正的 docker 支持将输出打印到控制台。

  • `ARG LS_VERSION=无;FROM 镜像名 AS 安装;ARG LS_版本;运行回显 $LS_VERSION; RUN ls`(将分号转换为换行符)。现在您可以将“docker build”和“LS_VERSION”设置为“none”,或者您可以“docker build --build-arg LS_VERSION=1”并缓存清除(或“date”或您喜欢的任何内容)。 (3认同)
  • 就是不行。使用“ARG”Dockerfile 语句,然后在“RUN”语句中执行“&& echo $ARG_NAME”。在构建时,执行 `--build-arg ARG_NAME=$(date)`。任何引用已更改的 ARG 的命令都将使其层失效。 (2认同)

ruo*_*ola 29

作为指定选项的替代方法--progress=plain,您还可以通过在 shell 配置中设置此环境变量来永久禁用“漂亮”输出:

export BUILDKIT_PROGRESS=plain
Run Code Online (Sandbox Code Playgroud)

  • 这是金子,谢谢。对于 DevOps 管道非常有用! (4认同)

hat*_*gic 21

只需--progress=plainbuild.

例如:

docker-compose build --progress=plain <container_name>
Run Code Online (Sandbox Code Playgroud)

或者

docker build --progress=plain .
Run Code Online (Sandbox Code Playgroud)

这是您键入时的官方文档docker build --help

--progress string         Set type of progress output (auto, plain, tty). Use plain to show container output (default "auto")
Run Code Online (Sandbox Code Playgroud)