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
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.