NoVPS
PricingFAQDocumentationBlog
Sign InSign Up
Tutorials

How to download Dockerfile from any Docker Hub image

Mark Hayes

Fri, Apr 10, 2026

Main picture

You pulled an image from Docker Hub, it works, and now you want to see the Dockerfile behind it. Maybe you need to customize it, audit it for security, or just understand how the image was built. The problem is that Docker Hub doesn't store Dockerfiles — it stores images. And images are not Dockerfiles.

This distinction trips up a lot of developers. Let's break down what's actually possible, what the realistic workarounds are, and how to get as close to the original Dockerfile as you can.

Why you can't directly download a Dockerfile from Docker Hub

When someone runs docker build, the Docker engine reads the Dockerfile, executes each instruction, and produces a series of image layers. These layers are what gets pushed to Docker Hub — not the Dockerfile itself.

Think of it like a compiled binary. You have the .exe, but the source code that produced it isn't bundled inside. The Dockerfile is the source; the image is the artifact.

Docker Hub stores image layers and metadata, not the Dockerfile that created them. There is no "download Dockerfile" button because the file simply isn't there.

Some official images and well-maintained projects do link to their Dockerfiles on GitHub, but that's a convention, not a platform feature. For most images, you'll need to reverse-engineer or locate the Dockerfile through other means.

Method 1: Check the image's Docker Hub page and linked repositories

Before doing anything clever, start with the obvious. Many image maintainers link to the source repository directly on the Docker Hub page.

  1. Go to the image page on hub.docker.com
  2. Look for a Source Repository or GitHub link in the right sidebar
  3. Check the Description tab — maintainers often include a link to the repo containing the Dockerfile

For official images like nginx, postgres, or node, Docker maintains a dedicated GitHub organization at github.com/docker-library. For example, the official Node.js Dockerfile lives in the docker-library/node repository, organized by version and variant.

This is the most reliable way to download a Dockerfile because you're getting the actual source file the maintainer used. But it only works when the maintainer has made it available.

Method 2: Use docker history to reconstruct the Dockerfile

If you can't find the original Dockerfile, docker history is your best built-in tool. It shows every layer in the image and the command that created it.

docker history --no-trunc nginx:latest

This outputs something like:

IMAGE          CREATED BY                                      SIZE
      CMD ["nginx" "-g" "daemon off;"]                 0B
      STOPSIGNAL SIGQUIT                               0B
      EXPOSE map[80/tcp:{}]                            0B
      ENTRYPOINT ["/docker-entrypoint.sh"]             0B
      COPY file:xxx in /docker-entrypoint.d            4.62kB
      COPY file:xxx in /docker-entrypoint.d            3.02kB
      COPY file:xxx in /docker-entrypoint.d            1.04kB
      COPY file:xxx in /                               1.2kB
      RUN /bin/sh -c set -x && addgroup ...            91.8MB
      ENV NGINX_VERSION=1.25.4 ...                     0B
      LABEL maintainer=NGINX Docker Maintainers ...    0B
      /bin/sh -c #(nop) CMD ["bash"]                   0B
      /bin/sh -c #(nop) ADD file:xxx in /              74.8MB

Each row corresponds roughly to a Dockerfile instruction. You can read it bottom-to-top to reconstruct the build steps.

Limitations of docker history

This method gets you close, but not all the way:

  • COPY and ADD instructions don't show the original file contents — just a hash. You know something was copied, but not what.
  • Multi-stage builds are invisible. You only see the final stage.
  • Build arguments (ARG) used during build are not always preserved in the history.
  • Squashed images (built with --squash) collapse all layers into one, destroying the history entirely.

It's a reconstruction, not a download. Treat it as a starting point, not as the definitive source.

Method 3: Use Dive to inspect image layers

Dive is an open-source tool specifically designed for exploring Docker image contents layer by layer. It's significantly more informative than docker history.

Install it:

# macOS
brew install dive

# Linux
wget https://github.com/wagoodman/dive/releases/download/v0.12.0/dive_0.12.0_linux_amd64.deb
sudo apt install ./dive_0.12.0_linux_amd64.deb

Then run it against any image:

dive nginx:latest

Dive gives you an interactive TUI where you can:

  • See every layer and the exact command that produced it
  • Browse the filesystem at each layer to see what files were added, modified, or removed
  • Understand the size impact of each instruction

This is especially useful when COPY or ADD commands are involved — you can't see the original file from the host, but you can see exactly what ended up in the image filesystem and where.

Method 4: Use automated tools to generate a Dockerfile

Several tools attempt to automate the reverse-engineering process and produce a usable Dockerfile from an image.

Whaler (dfimage)

Whaler (formerly known as dfimage) analyzes a Docker image and generates an approximate Dockerfile:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock pegleg/whaler nginx:latest

It parses the image metadata and history to produce output like:

FROM nginx:latest
ENV NGINX_VERSION=1.25.4
RUN set -x && addgroup --system --gid 101 nginx ...
COPY file:xxx /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dedockify

Dedockify is a Python-based alternative:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock dedockify 

Both tools produce approximate Dockerfiles. They are useful as templates but should not be treated as exact reproductions of the original.

These tools are best used as a starting point. Always review and test the generated Dockerfile before using it in production.

Method 5: Use docker inspect for metadata and configuration

While docker inspect won't give you a Dockerfile, it reveals the image's configuration — environment variables, exposed ports, volumes, entrypoint, and working directory:

docker inspect nginx:latest

Key fields to look at:

# Get just the config section
docker inspect --format='{{json .Config}}' nginx:latest | python3 -m json.tool

This shows:

  • Env — all environment variables set in the image
  • Cmd — the default command
  • Entrypoint — the entrypoint script or binary
  • ExposedPorts — ports declared with EXPOSE
  • Volumes — declared volume mount points
  • WorkingDir — the WORKDIR value
  • Labels — metadata labels set during build

Combined with docker history, this gives you enough information to write a functional Dockerfile that closely mirrors the original behavior.

Method 6: Extract the full filesystem from an image

Sometimes you don't need the Dockerfile at all — you need the files inside the image. You can export the entire filesystem as a tar archive:

# Create a temporary container (doesn't need to run)
docker create --name temp-container nginx:latest

# Export its filesystem
docker export temp-container -o nginx-filesystem.tar

# Clean up
docker rm temp-container

# Extract and explore
mkdir nginx-fs && tar -xf nginx-filesystem.tar -C nginx-fs

This is useful when you want to:

  • Inspect configuration files baked into the image
  • Recover scripts that were COPY-ed during the build
  • Audit what's actually running inside the container

Practical workflow: putting it all together

Here's a realistic workflow when you need to download a Dockerfile (or get as close as possible) for an image you found on Docker Hub:

  1. Check Docker Hub and linked repositories for the source Dockerfile. If you find it, you're done.
  2. Run docker history --no-trunc to see the build instructions.
  3. Use docker inspect to capture environment variables, ports, entrypoint, and other config.
  4. Run Whaler or Dedockify to generate an approximate Dockerfile automatically.
  5. Use Dive to explore layers and understand what files were added at each step.
  6. Export the filesystem if you need to recover specific files that were copied into the image.
  7. Combine everything into a new Dockerfile, test it, and iterate until your build matches the original image's behavior.

This process typically takes 15-30 minutes for a moderately complex image and gives you a working Dockerfile you can customize.

When you need to build and deploy a customized image

Once you've reconstructed or downloaded a Dockerfile and made your modifications, the next step is building and deploying it. This is where many developers hit a second friction point — you have the Dockerfile, but now you need infrastructure to build, store, and run the image.

You can set this up manually with a self-hosted registry and a VM, or use managed platforms that handle the plumbing for you. NoVPS, for example, lets you deploy dockerized applications directly from a built-in container registry without configuring servers. You push your image, point the service at it, and the platform handles the rest — including managed databases and storage if your app needs them. It's one option worth considering if you want to skip the infrastructure setup and focus on the application itself.

Common mistakes when reconstructing Dockerfiles

A few pitfalls to watch out for:

  • Assuming the generated Dockerfile is exact. It's not. It's an approximation. Always test your builds.
  • Ignoring multi-stage builds. The final image only contains layers from the last stage. Earlier stages (build dependencies, compilation steps) are gone. If the original used a multi-stage build, you'll need to figure out the build stage yourself.
  • Forgetting about .dockerignore. Even if you perfectly reconstruct the Dockerfile, the original build context may have excluded files via .dockerignore. This won't show up in any of the methods above.
  • Not checking the base image. A FROM python:3.12-slim in the reconstructed Dockerfile might have been FROM python:3.12-slim-bookworm in the original. The tag resolution depends on when the image was built.
  • Trusting unverified images. If you're reverse-engineering a Dockerfile from a third-party image, inspect what's inside before running it. Use docker history and Dive to look for suspicious commands like unexpected curl calls or base64-encoded payloads.

Summary

There is no direct way to download a Dockerfile from Docker Hub — the platform stores images, not their source files. But between docker history, docker inspect, tools like Dive and Whaler, and good old-fashioned repository searching, you can reconstruct a functional Dockerfile from virtually any image.

The key takeaway: treat any reconstructed Dockerfile as a starting point, not a definitive source. Test your builds, compare the output image with the original, and verify the behavior before deploying to production.

Be first in line for updates
and special pricing

Get early access to new features and exclusive discounts delivered straight to your inbox

Legal

Privacy PolicyTerms and ConditionsAcceptable Use Policy
NoVPS

© 2026 NoVPS Cloud LTD

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.