Docker 构建:如何获取完整的 RUN 命令输出?

Sto*_*row 10 docker docker-build docker-buildkit

更新:这个问题是用 MVRE 重构的。

\n

有没有办法可以RUN从使用 构建的 Dockerfile 中查看完整命令docker build\n例如 如果我的 Dockerfile 有这样的语句:

\n
# Dockerfile\nFROM alpine:3.7 as base\nRUN echo "this is the song that doesn\'t end. Yes it goes on and on, my friends. Some people started singing it not knowing what it was, and they\'ll continue singing it forever just because..."\n
Run Code Online (Sandbox Code Playgroud)\n

...有没有办法可以看到完整的命令,即echo "this is the song that doesn\'t end. Yes it goes on and on, my friends. Some people started singing it not knowing what it was, and they\'ll continue singing it forever just because..."\nas 以及运行该命令的完整输出?

\n

我使用 docker 构建工具包(我不想禁用它)进行构建,默认情况下,它会折叠输出,并截断相对于终端宽度的执行命令,最终可能看起来像这样:

\n
$ docker build --no-cache -t tmp:tmp .\n[+] Building 16.2s (6/6) FINISHED\n => [internal] load build definition from Dockerfile                                 0.1s\n => => transferring dockerfile: 281B                                                 0.0s\n => [internal] load .dockerignore                                                    0.2s\n => => transferring context: 2B                                                      0.0s\n => [internal] load metadata for docker.io/library/alpine:3.7                        0.0s\n => CACHED [1/2] FROM docker.io/library/alpine:3.7                                   0.0s\n => [2/2] RUN echo "this is the song that doesn\'t end. Yes it goes on and on, my fr  2.0s\n => exporting to image                                                              13.9s\n => => exporting layers                                                              0.4s\n => => writing image sha256:d72d9f0e36f38227e2a28dce31781dc9b6089b01cf5645c70f33b2  13.5s\n => => naming to docker.io/library/tmp:tmp                                           0.0s\n\n
Run Code Online (Sandbox Code Playgroud)\n

...即命令及其输出都被截断/折叠。

\n

本文docker inspect应该用于此目的,在我的例子中:docker inspect tmp:tmp,并且我的答案将在$[0].Config.Cmd输出部分中,但该部分不包含相关信息:

\n
$ docker inspect tmp:tmp\n[\n    {\n        ...\n        "Config": {\n            ...\n            "Cmd": [\n                "/bin/sh"\n            ],\n            ...\n
Run Code Online (Sandbox Code Playgroud)\n

...该命令的任何其他部分也不docker inspect包含相关信息(cmake我的示例中的声明)。

\n

本文建议使用--progress plain选项docker build。这会展开命令的输出,但它仍然会截断命令本身,例如:

\n
$ docker build --progress plain --no-cache -t tmp:tmp .\n#1 [internal] load build definition from Dockerfile\n#1 transferring dockerfile: 44B done\n#1 DONE 0.0s\n\n#2 [internal] load .dockerignore\n#2 transferring context: 2B done\n#2 DONE 0.1s\n\n#3 [internal] load metadata for docker.io/library/alpine:3.7\n#3 DONE 0.0s\n\n#4 [1/2] FROM docker.io/library/alpine:3.7\n#4 CACHED\n\n#5 [2/2] RUN echo "this is the song that doesn\'t end. Yes it goes on and on...\n#5 1.542 this is the song that doesn\'t end. Yes it goes on and on, my friends. Some people\n started singing it not knowing what it was, and they\'ll continue singing it forever just\nbecause...\n#5 DONE 2.1s\n\n#6 exporting to image\n#6 exporting layers\n#6 exporting layers 0.7s done\n#6 writing image sha256:0ce39b23377d91e47e7aa9b4e10e50d5a62a4ef9ec281f1b3e244e4b66a17d02\n#6 writing image sha256:0ce39b23377d91e47e7aa9b4e10e50d5a62a4ef9ec281f1b3e244e4b66a17d02 1\n3.3s done\n#6 naming to docker.io/library/tmp:tmp done\n#6 DONE 14.0s\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法可以查看 DockerfileRUN语句执行的完整(未截断的)命令(以及命令的未折叠输出)?

\n

我执行的输出docker history

\n
$ docker history tmp:tmp\nIMAGE               CREATED             CREATED BY                                      SIZE                COMMENT\n0ce39b23377d        3 minutes ago       RUN /bin/sh -c echo "this is the song that d\xe2\x80\xa6   0B                  buildkit.dockerfile.v0\n<missing>           2 years ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B\n<missing>           2 years ago         /bin/sh -c #(nop) ADD file:aa17928040e31624c\xe2\x80\xa6   4.21MB\n
Run Code Online (Sandbox Code Playgroud)\n

Sto*_*row 19

设置 env-varPROGRESS_NO_TRUNC=1和 就--progress plain可以了:

$ PROGRESS_NO_TRUNC=1 docker build --progress plain --no-cache -t tmp:tmp .
#1 [internal] load .dockerignore
#1 sha256:0c3d9a77560c6997674ff903c1fd8166c2b0a0c56b8267c8919f9435df2b6360
#1 transferring context: 0.0s
#1 transferring context: 2B 0.0s done
#1 DONE 0.2s

#2 [internal] load build definition from Dockerfile
#2 sha256:637986daa013bdd36af757aa03cf8b23447a85ed9e3e103fda6234a9d97332cd
#2 transferring dockerfile: 44B 0.1s done
#2 DONE 0.2s

#3 [internal] load metadata for docker.io/library/alpine:3.7
#3 sha256:d05d2c4bcea3dce001a657515352ca6040d02fcc707293d5f7167602950d71ce
#3 DONE 0.0s

#4 [1/2] FROM docker.io/library/alpine:3.7
#4 sha256:c139e859151268321f8b3d9af4bf0195aab52a1b66880ee4294469151c73bfb9
#4 CACHED

#5 [2/2] RUN echo "this is the song that doesn't end. Yes it goes on and on, my friends. S
ome people started singing it not knowing what it was, and they'll continue singing it for
ever just because..."
#5 sha256:63a60e7b5a4ce0944e5135780a681e85c9fc52a776b498fcf0652f563bc0c470
#5 1.381 this is the song that doesn't end. Yes it goes on and on, my friends. Some people
 started singing it not knowing what it was, and they'll continue singing it forever just
because...
#5 DONE 1.7s

#6 exporting to image
#6 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00
#6 exporting layers
#6 exporting layers 0.2s done
#6 writing image sha256:523ddeb4ae29e8f8bbd9e346a07d980024e58d867222ed3d30d552587df72685 0
.0s done
#6 naming to docker.io/library/tmp:tmp 0.0s done
#6 DONE 0.2s
Run Code Online (Sandbox Code Playgroud)

RUN语句本身以及执行该语句的输出均完整呈现。