摘自Dockerfile的片段:
FROM node:12.18.0
RUN echo "hello world"
RUN psql --version
当我运行docker构建。我看不到这两个命令的任何输出,即使它们没有被缓存。文档说docker build默认是verbose的。为什么我没有看到命令的输出?我以前见过他们。
构建时的输出:
=> [7/18] RUN echo "hello world" 0.9s
我在建筑完成后看到的输出:
=> CACHED [6/18] RUN apt-get install postgresql -y 0.0s
=> [7/18] RUN echo "hello world" 6.4s
=> [8/18] RUN psql --version 17.1s
Dockerfile是从基于Debian 9的node:12.18.0创建的。
Docker版本19.03.13,build 4484c46d9d。
做两件事
而不是docker构建。使用这个
docker build . --progress=plain
每次构建都在RUN命令中添加随机的垃圾(这会使docker误以为它之前没有见过该命令,因此它不会使用缓存版本)
的例子。如果您的命令是RUN ls,请使用此命令代替RUN ls && echo sdfjskdflsjdf(每次构建时将sdfjskdflsjdf更改为其他内容)。
为什么会这样
我尝试了其他答案,但都有问题和不完美之处。非常令人沮丧的是Docker没有一些简单的功能,比如——verbose=true。
这是我最终使用的(这很可笑,但很有效)。
假设你想看到ls命令的输出,这将不会工作docker构建。
RUN ls
但是这将输出docker build——progress=plain:
RUN ls
现在再试一次,它不会打印!-这是因为docker缓存了未更改的层,所以诀窍是每次修改命令,添加一些无意义的东西&& echo sdfljsdfljksdfljk,并在每次docker build——progress=plain时更改这些无意义的东西:
# This prints
RUN ls && echo sdfljsdfljksdfljk
# Next time you run it use a different token
RUN ls && echo sdlfkjsldfkjlskj
所以每一次,我都捣碎键盘,想出一个新的标记。Stupifying。(注意,我尝试了&& openssl rand -base64 12之类的东西来生成一个随机字符串,但docker意识到代码没有改变,这是行不通的)。
这个解决方案远不如真正的docker对打印输出到控制台的支持。
您所显示的输出来自buildkit,它是docker附带的经典构建引擎的替代品。你可以用——progress选项调整输出:
--progress string Set type of progress output (auto, plain, tty). Use plain to show container output
(default "auto")
添加——progress=plain将显示未从缓存加载的运行命令的输出。这也可以通过设置BUILDKIT_PROGRESS变量来实现:
export BUILDKIT_PROGRESS=plain
如果你正在调试一个构建,并且步骤已经被缓存,添加——no-cache到你的构建来重新运行步骤并重新显示输出:
docker build --progress=plain --no-cache ...
如果你不想使用buildkit,你可以通过在shell中导出DOCKER_BUILDKIT=0来恢复到旧的构建引擎,例如:
DOCKER_BUILDKIT=0 docker build ...
or
export DOCKER_BUILDKIT=0
docker build ...
做两件事
而不是docker构建。使用这个
docker build . --progress=plain
每次构建都在RUN命令中添加随机的垃圾(这会使docker误以为它之前没有见过该命令,因此它不会使用缓存版本)
的例子。如果您的命令是RUN ls,请使用此命令代替RUN ls && echo sdfjskdflsjdf(每次构建时将sdfjskdflsjdf更改为其他内容)。
为什么会这样
我尝试了其他答案,但都有问题和不完美之处。非常令人沮丧的是Docker没有一些简单的功能,比如——verbose=true。
这是我最终使用的(这很可笑,但很有效)。
假设你想看到ls命令的输出,这将不会工作docker构建。
RUN ls
但是这将输出docker build——progress=plain:
RUN ls
现在再试一次,它不会打印!-这是因为docker缓存了未更改的层,所以诀窍是每次修改命令,添加一些无意义的东西&& echo sdfljsdfljksdfljk,并在每次docker build——progress=plain时更改这些无意义的东西:
# This prints
RUN ls && echo sdfljsdfljksdfljk
# Next time you run it use a different token
RUN ls && echo sdlfkjsldfkjlskj
所以每一次,我都捣碎键盘,想出一个新的标记。Stupifying。(注意,我尝试了&& openssl rand -base64 12之类的东西来生成一个随机字符串,但docker意识到代码没有改变,这是行不通的)。
这个解决方案远不如真正的docker对打印输出到控制台的支持。
在构建后使用这个标志——progress=plain。
例如:
docker-compose build --progress=plain <container_name>
OR
docker build --progress=plain .
如果你不想每次都使用这个标志,那么永久地告诉docker使用这个标志,如下所示:
export BUILDKIT_PROGRESS=plain
下面是当你输入docker build——help时的官方文档。
--progress string Set type of progress output (auto, plain, tty). Use plain to show container output (default "auto")