dockerdocker-builddocker-buildkit

Docker build: how to get full RUN command output?


Is there a way I can see the full RUN command from a Dockerfile built with docker build? E.g. if my Dockerfile has the statement:

# Dockerfile
FROM alpine:3.7 as base
RUN 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..."

...is there a way I can see the full command, i.e. 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..." as well as the full output of running that command?

I build with docker build kit (which I would prefer to not disable), which, by default, collapses output, and truncates executed commands relative to terminal-width, and might end up looking something like this:

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

...i.e. both the command and its output are truncated/collapsed.

This article says that docker inspect should be used for this purpose, in my case: docker inspect tmp:tmp, and that my answer would be in the $[0].Config.Cmd section of the output, but that section does not contain the relevant information:

$ docker inspect tmp:tmp
[
    {
        ...
        "Config": {
            ...
            "Cmd": [
                "/bin/sh"
            ],
            ...

...nor does any other section of that docker inspect command contain the relevant information (a cmake statement in my example).

This article recommends using the --progress plain option to docker build. That uncollapses the command's output, but it still truncates the command itself, e.g.:

$ docker build --progress plain --no-cache -t tmp:tmp .
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 44B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 transferring context: 2B done
#2 DONE 0.1s

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

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

#5 [2/2] RUN echo "this is the song that doesn't end. Yes it goes on and on...
#5 1.542 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 2.1s

#6 exporting to image
#6 exporting layers
#6 exporting layers 0.7s done
#6 writing image sha256:0ce39b23377d91e47e7aa9b4e10e50d5a62a4ef9ec281f1b3e244e4b66a17d02
#6 writing image sha256:0ce39b23377d91e47e7aa9b4e10e50d5a62a4ef9ec281f1b3e244e4b66a17d02 1
3.3s done
#6 naming to docker.io/library/tmp:tmp done
#6 DONE 14.0s

Is there a way I can see the full (untruncated) command executed by Dockerfile RUN statements (along with uncollapsed output of the command)?

The output of my executing docker history:

$ docker history tmp:tmp
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
0ce39b23377d        3 minutes ago       RUN /bin/sh -c echo "this is the song that d…   0B                  buildkit.dockerfile.v0
<missing>           2 years ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           2 years ago         /bin/sh -c #(nop) ADD file:aa17928040e31624c…   4.21MB

Solution

  • Setting env-var PROGRESS_NO_TRUNC=1 along with --progress plain did the trick:

    $ 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
    

    The RUN statement itself is presented in its entirety as well as the output of executing that statement.