44

I'm trying to learn docker but experience some discrepancies to what I've read in each tutorial:

When using the following command docker build -t my-app:1.0 . my build fails due to some error in my Dockerfile. Following this answer, I wanted to run the last intermediate container ID. Anyhow, in contrast to all tutorials I've seen so far, my console is not showing any intermediate container IDs: enter image description here

I'm running Docker 19 on Windows 10. How do I get the intermediate container IDs?

Comfort Eagle
  • 2,112
  • 2
  • 22
  • 44

4 Answers4

51

Since version 18.09 Docker has added a new backend for building images, buildkit. This offers a bunch of benefits but doesn't expose intermediate containers in the same way as the old backend. Fortunately you can disable buildkit.

You don't need to disable buildkit permanently for this and you shouldn't because it will make all your builds slower. You can just set an environment variable when you docker build, like this:

Powershell

$env:DOCKER_BUILDKIT=0; docker build .

Linux/macOS

DOCKER_BUILDKIT=0 docker build .

Windows cmd

set DOCKER_BUILDKIT=0& docker build .
Adam Cooper
  • 8,077
  • 2
  • 33
  • 51
  • 1
    The otherway round would be to enable buildkit in your build file to make it prod ready. As a dev id just keep this off because building dockerfiles is some kind of dark magic for me – Piotr Kula Jun 14 '22 at 20:04
  • 2
    Yes, but then most of your builds would be slower, buildkit adds parallel execution, better caching and more which speed up your `docker build` – Adam Cooper Jun 15 '22 at 13:31
  • Thats great.. when it works :D But when I have no clue why it cant find a file that is supposed to be there just makes me ill.. learnign curve I guess. Worked out my issues now any way by turning this off and doing the sh trick to realise what was wrong – Piotr Kula Jun 15 '22 at 16:10
  • 1
    This saved my day. Thank you so much! – yfpb Jul 28 '23 at 14:34
29

I had the same problem. Setting "buildkit" to false in ~/.docker/daemon.json (In Windows you should find daemon.json in C:\ProgramData\Docker\config) solved this for me:

    {
      "experimental": true,
      "features": {
        "buildkit": false
      }
    }
Michael
  • 306
  • 3
  • 4
  • 9
    If you want to accomplish this one time, you can also export DOCKER_BUILDKIT=0 and then run the docker command, or do it all in the same line (linux) like this: `$ DOCKER_BUILDKIT=0 docker build -t my-app:1.0 .` – psanchez Apr 20 '21 at 14:33
  • Modifying the ```daemon.json``` file requires restarting the docker service. Using the env variable works as it is. Very useful trick that I was looking for since a long time ago! – Marcosaurios Jun 18 '21 at 13:08
  • 1
    On Windows you can use the `set DOCKER_BUILDKIT=0` command before running `docker build` instead of modifying the docker config. – David Callanan Jul 31 '21 at 13:35
6

I'm not sure of the reasoning exactly but with Buildkit you can no longer inspect at a particular cache layer like before. You just have to comment out where the RUN command is failing, get it to build successfully – then you can inspect it. A step backwards IMO. Even turning on --progress=plain puts out hashes, but you can't do anything with them. ie: trying to run docker run -ti [hash_id] sh fails as it can't find the image. It's that or you turn off buildkit, but the fact that it is both the default for macOS, and Windows suggests that changing the default of the daemon may not be good for future use.

Justin Fortier
  • 451
  • 5
  • 6
  • "You just have to comment out where the RUN command is failing, get it to build successfully". This seems to be a necessary step when you have commands in the Dockerfile that make it necessary to have `buildkit` enabled. For example, the `--mount `option requires BuildKit. – n.gaurav Oct 26 '22 at 02:59
3

Expanding the Answer of Michael, for anyone that may be a little bit lost. If you are using the docker desktop on windows, you can find this configuration of daemon.json inside the settings window under the "Docker Engine" tab. Change the json and Apply & Restart.

Settings window on the Docker Engine tab