October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
VGSources
Blog

Fix “Unable to Locate Package curl” When Building a Dockerfile

The curl package is usually not missing: APT’s package index is. Learn the correct Dockerfile pattern, why separate layers fail, and how to diagnose update, network, release and architecture problems.
Length8 min Posted Quest giverVGSources Team

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The Docker build error E: Unable to locate package curl usually means that APT has no usable package index in the image, not that curl is unavailable from Debian or Ubuntu. Run apt-get update and apt-get install in the same Dockerfile RUN instruction, inspect the update output for network errors, and remove the downloaded lists after installation to avoid leaving unnecessary data in the image.

What the error actually means

Debian- and Ubuntu-based images use APT to resolve and install packages. APT does not search a live repository every time an install command runs. It consults package indexes stored locally in the image. Those indexes contain the package names, versions, repository locations and dependency metadata that APT needs before it can install anything.

As an Amazon Associate I earn from qualifying purchases.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A fresh base image can have an empty or stale index. If the Dockerfile immediately runs apt-get install curl, APT checks its local lists, fails to find a matching entry and prints:

E: Unable to locate package curl

That message describes the state of the local metadata. It does not, by itself, prove that the curl package has been removed from the distribution or that the package name is invalid. The first corrective action is to download current indexes with apt-get update.

The standard Dockerfile fix

For a Debian-based image such as debian:bookworm-slim, use one layer for both the update and the installation:

FROM debian:bookworm-slim

RUN apt-get update 
    && apt-get install -y --no-install-recommends 
        ca-certificates 
        curl 
    && rm -rf /var/lib/apt/lists/*

The command sequence has three deliberate parts:

  • apt-get update downloads the package indexes used by APT.
  • apt-get install -y --no-install-recommends ca-certificates curl installs curl without waiting for an interactive confirmation. The --no-install-recommends option omits packages that are merely suggested rather than required.
  • rm -rf /var/lib/apt/lists/* deletes the downloaded index files after installation, reducing data retained in the resulting image.

The backslashes are Dockerfile line continuations. The && operators make each command depend on the preceding command succeeding. If the update cannot complete, the install is not attempted against incomplete metadata, and the build stops at the step that needs attention.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Why apt-get update and apt-get install belong in one RUN

Docker builds each RUN instruction as a separate layer and can reuse those layers from its cache. Consider this pattern:

RUN apt-get update
RUN apt-get install -y curl

It looks equivalent, but it creates a cache hazard. Docker may reuse the earlier update layer even after the repository metadata in that layer has become old. The later install then runs with stale lists. A build can therefore appear to “run” the update while still failing to resolve a package.

Combining the commands ties the install to the exact update operation used to prepare it:

RUN apt-get update && apt-get install -y --no-install-recommends curl

Appending the cleanup to the same instruction keeps the indexes out of the final layer as well. Do not split update, install and cleanup into independent RUN instructions when writing a Dockerfile that should remain reliable as the base image and repository metadata change.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Apply the fix step by step

1. Confirm that the image uses APT

Look at the first instruction in the Dockerfile. The procedure in this article applies to Debian- and Ubuntu-based images, for example:

FROM debian:bookworm-slim

The base image determines the package manager, repository configuration and release in which a package name must exist. Do not copy an APT command into an image based on a different Linux distribution without checking that distribution’s package manager and package names.

2. Replace the install-only layer

Find a line like:

RUN apt-get install -y curl

Replace it with an update-and-install sequence. Include --no-install-recommends when you want only required dependencies, and add ca-certificates when the image needs the certificate bundle used by HTTPS connections:

RUN apt-get update 
    && apt-get install -y --no-install-recommends 
        ca-certificates 
        curl 
    && rm -rf /var/lib/apt/lists/*

Keeping the package names on separate continuation lines makes it easier to review or extend the list while preserving one logical layer.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

3. Rebuild and read the complete log

Run your normal Docker build again and watch the output from the update command, not only the final install message. A successful-looking install line cannot compensate for an update that failed earlier. If the build system reused a previously cached result while you are diagnosing the Dockerfile, perform a cache-free diagnostic build so that the update instruction is executed again. Once the Dockerfile is correct, retain the combined command rather than relying on a cache-free build as the permanent solution.

4. Verify the result inside the image

After a successful build, start the image or add a temporary diagnostic step that invokes:

curl --version

A version response confirms that the executable was installed. Remove temporary diagnostic commands before publishing the final image if they are not needed at runtime.

If the combined command still fails

When the install continues to report that it cannot locate curl after the commands have been combined, the update step itself is the next place to look. The most useful information is usually earlier in the build output.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Look for repository or DNS failures

An update that cannot reach its mirror leaves APT with old or missing indexes. One example is an error such as:

Temporary failure resolving ...

That is a name-resolution or connectivity failure while contacting a repository host. Repeating apt-get install will not repair it, because the package metadata was never refreshed. Check the update output for the first warning or error, identify the mirror host it could not resolve, and correct the build environment’s network or DNS access before investigating the package name.

Do not suppress the update output while troubleshooting. A quiet or failed update can make the later “unable to locate” message look like the root cause even though it is only the consequence.

Check whether a cached layer is hiding the problem

Docker’s layer cache can preserve an earlier update result. If the base image, repository configuration or network conditions have changed, rebuild the update-and-install instruction rather than assuming a cached layer contains current lists. A cache-free build is useful for isolating this possibility; it does not replace the requirement to keep update and install together in the Dockerfile.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Confirm the package name for the selected release

Package names are not universal across every Linux release or every base image. The image’s FROM line selects a distribution and release, and that release determines which package names are available. Verify that the package is present for the specific Debian or Ubuntu release represented by the base image. If you change the base image to another release, repeat that check instead of assuming every package name remains identical.

Consider architecture only when the evidence points there

One Docker for Mac discussion described an Apple Silicon build in which pinning the image platform in the first line resolved an APT failure:

FROM --platform=linux/amd64 debian:bookworm-slim

This is a report from a single case, not a general explanation for every “unable to locate package” error. Treat it as a targeted experiment when the failure occurs on Apple Silicon and the ordinary update-and-install sequence does not work. Keep the platform declaration only when it matches the image and deployment architecture you actually intend to use; otherwise, first resolve update, DNS, mirror and release issues.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Common Dockerfile mistakes and their symptoms

Dockerfile situation What APT sees Corrective action
apt-get install runs without a preceding update The local package lists are empty or stale, so curl is not known locally. Run apt-get update and install in the same RUN instruction.
Update and install are separate cached layers Docker can reuse old metadata for the update layer. Combine the commands with && so the install uses the update performed for that layer.
The update reports a mirror or DNS error No current index was downloaded, even if the build reaches the install line. Fix the network or name-resolution failure and rerun the update.
The base image release changed The package database may use different package names or repository contents. Confirm curl’s package name for the release selected by FROM.
Indexes are left in the final layer The image retains APT list files that are no longer needed at runtime. Remove them with rm -rf /var/lib/apt/lists/* in the same RUN.

Understanding the cleanup and dependency options

Why remove /var/lib/apt/lists/*?

The update command downloads repository index files so APT can resolve packages. Once curl and its required dependencies are installed, those lists are not needed to execute curl. Removing them in the same layer prevents the final image from carrying the temporary index data. The cleanup does not uninstall curl; it removes only the downloaded list files.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What --no-install-recommends changes

APT can distinguish between packages required for an installation and packages marked as recommendations. The --no-install-recommends flag tells APT to omit the latter. That generally produces a smaller, more focused image, but it also means software that expects a recommended package must declare or install that dependency explicitly. The flag does not replace -y; -y answers confirmation prompts, while --no-install-recommends changes which optional dependencies are selected.

A practical diagnostic checklist

Use this order so that each check addresses a different failure mode:

  1. Read the FROM line and confirm that the image is Debian- or Ubuntu-based.
  2. Ensure the Dockerfile runs apt-get update before apt-get install.
  3. Ensure update, install and list cleanup are joined in one RUN instruction with &&.
  4. Rebuild the relevant layer and inspect every line printed by the update command.
  5. If you see “Temporary failure resolving” or another mirror error, fix connectivity or DNS before changing package names.
  6. Confirm that curl is named and available for the release selected by the base image.
  7. If the failure is limited to an Apple Silicon Docker for Mac setup, test the reported linux/amd64 platform declaration and verify that the chosen architecture is appropriate for deployment.
  8. After a successful install, remove /var/lib/apt/lists/* and verify curl with curl --version.

What not to change first

Do not begin by repeatedly adding install flags or by assuming that curl has disappeared from Debian or Ubuntu. The error is most often caused by missing local metadata. Do not split the update and install into separate layers to make the Dockerfile look shorter, because that makes cache reuse less reliable. Do not hide update output while diagnosing the build, since the decisive failure may occur before APT reaches the install command.

Also avoid applying this exact command sequence to an unrelated distribution without checking its package manager. The procedure here is specifically for APT-based Debian and Ubuntu images; a different base image may require different commands and package naming.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A reliable final pattern

For a Debian or Ubuntu Dockerfile that needs curl, the durable pattern is straightforward:

FROM debian:bookworm-slim

RUN apt-get update 
    && apt-get install -y --no-install-recommends 
        ca-certificates 
        curl 
    && rm -rf /var/lib/apt/lists/*

This ordering gives APT current metadata, makes installation fail when the update fails, avoids stale cached update layers and removes temporary index files after the package is installed. If it still does not build, the update output identifies whether the remaining issue is repository access, name resolution, architecture selection or a package-name mismatch for the chosen release.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More quests from Patch Notes

  1. How to Set Up a RedM (RDR2) Server in 2026: License Key, txAdmin and server.cfg, Step by StepBlog11min
  2. Best RedM (RDR2) Server Hosting in 2026: Comparing Four Hosts on Slots, Memory and PriceBlog10min
  3. How to Host a Mindustry Server in 2026: server-release.jar, Port 6567 and the Commands That MatterBlog7min
Recommended PC Tool
Recommended PC Tool
PC Slower Than It Used to Be?Free scan - under a minute
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.