Docker: ERROR: Failed to Solve - Not copying non-directory

Abstract: Resolve Docker build failure by verifying source file existence relative to the build context and ensuring paths are not excluded by .dockerignore rules.

Created: 2026-08-17 by

The "ERROR: Failed to Solve - Not copying non-directory" issue in Docker occurs when the COPY or ADD instruction attempts to copy a path that does not exist, is not a directory, or is excluded by .dockerignore. To resolve this, verify the source file exists relative to the build context, ensure it is not ignored, and check for typos in the file paths within your Dockerfile.

Understanding the Build Context

The root cause of this error almost always lies in the relationship between your Dockerfile location and the build context directory. When you run docker build, Docker sends the specified context (usually the current directory .) to the Docker daemon. The paths inside COPY instructions are interpreted relative to this context root, not necessarily relative to where the Dockerfile itself resides. If you specify COPY ./src/app.py /app/ but run the build command from a parent directory, Docker looks for ./src/app.py in the parent directory. If that path does not exist there, the build fails with the non-directory error. This distinction is critical because developers often assume the context is automatically the directory containing the Dockerfile, which is only true if you explicitly pass that directory as the context argument.

Verifying Path Existence

Before diving into complex fixes, perform a simple sanity check. Ensure that the file you are trying to copy actually exists at the expected location. If your project structure is:
project/
  ├── Dockerfile
  └── src/
      └── app.py
And you are building from the project directory, the command must be:
COPY src/app.py /app/
Notice that we do not use ./ before src in the COPY command if the context is the project root. Using ./src can sometimes cause ambiguity depending on how the context was passed. Always confirm the file exists using standard shell commands like ls before running the build.

Checking .dockerignore Files

A very common hidden cause for this error is the presence of a .dockerignore file in your build context. This file functions similarly to .gitignore and tells Docker which files or directories to exclude from the context sent to the daemon. If your .dockerignore contains a rule that excludes the specific file or folder you are trying to copy, Docker will not see that file during the build process. Consequently, it treats the source path as non-existent, triggering the "Not copying non-directory" error. To diagnose this, temporarily rename your .dockerignore file to .dockerignore.bak and attempt the build again. If the build succeeds, you have identified the culprit. You should then review your ignore rules to ensure they are not too broad. For example, avoiding patterns like *.pyc or __pycache__/ unless necessary, and ensuring you haven't accidentally excluded your main application source code.

Common Ignore Patterns

Review your .dockerignore for accidental exclusions. Common mistakes include:
  • Excluding all text files with *.txt when you need a configuration file.
  • Excluding the entire source directory due to a typo in the pattern.
  • Using absolute paths in .dockerignore which may behave unexpectedly across different operating systems.
Once you identify the problematic rule, remove it or refine the pattern to be more specific. Remember that .dockerignore patterns are matched against the relative paths within the context.

Handling Symlinks and Special Files

Docker's COPY instruction has specific behaviors regarding symbolic links and special files. If the source path points to a symbolic link that resolves to a non-directory, or if the symlink itself is broken, Docker may fail to copy it. Similarly, attempting to copy device files or named pipes will result in errors. Ensure that any symlinks in your build context are valid and point to existing regular files or directories. If you are working in a development environment where symlinks might change frequently, consider resolving them manually before building or using ADD with caution, though COPY is generally preferred for simplicity and security. If you are encountering this error while trying to copy a directory, ensure that the path ends with a slash if you intend to copy the *contents* of the directory, or omit the slash if you want to copy the directory itself along with its contents. However, the specific error "Not copying non-directory" usually indicates the target is not a directory at all, so double-check that you aren't accidentally pointing to a file when expecting a directory.

Debugging Strategies

When standard checks fail, use Docker's verbose output to gain deeper insight. Run the build command with the --progress=plain flag. This provides detailed logging that can help identify exactly which step fails and what paths Docker is evaluating.
docker build --progress=plain -t my-image .
Look for lines indicating the COPY step. If the log shows that the source file is missing, it confirms the context or ignore file issue. If the log suggests permission issues, ensure the user running the Docker daemon has read access to the source files. Additionally, consider using a multi-stage build to isolate the problem. By copying files into an intermediate stage first, you can verify that the initial copy operation works before proceeding to more complex setup steps. This helps narrow down whether the issue is with the initial file transfer or a subsequent layer operation. For related troubleshooting on Docker-specific module issues, you might find our guide on fixing Daphne Docker Django errors helpful, as similar context misconfigurations can lead to runtime failures after the build succeeds. See Fixing Daphne Docker Django ModuleNotFoundError.

Frequently Asked Questions

Why does the error persist even when the file exists?

The most likely reason is that the file is being excluded by a .dockerignore rule. Check your ignore file for patterns that might match your source file and remove or adjust them. Another possibility is that you are building from the wrong directory, changing the effective build context.

Can I copy files from outside the build context?

No, Docker strictly confines the build process to the provided context for security reasons. You cannot reference files outside the directory tree passed to docker build. You must either move the required files into the context or adjust your build command to include the correct parent directory as the context.

What is the difference between COPY and ADD regarding this error?

Both COPY and ADD will fail with similar errors if the source path is invalid. However, ADD has additional features like automatic tar extraction and URL fetching, which can introduce other failure modes. It is generally recommended to use COPY for simple file transfers to avoid unexpected behavior.

How do I fix permissions errors during copy?

If Docker reports permission denied instead of "non-directory," ensure the user running the Docker daemon has read access to the source files. On Linux, this usually means the current user has read permissions. You can adjust file permissions using chmod before running the build.

Does Docker Desktop handle contexts differently than CLI?

Docker Desktop uses the same build engine as the CLI, so the context rules remain identical. However, the default working directory in the GUI might differ from your terminal. Always verify the "Context" selected in Docker Desktop matches the directory containing your Dockerfile and source files.

Latest News

How to Display Output of xterm Command in Terminal Screen using Cron

Resolve the inability to display xterm output in a terminal screen from cron by redirecting logs or using wall instead of insecure X11 workarounds.

Read More
Expose Local Server on VPS Preserving Real Client IPs (OS Level)

Resolve VPS logging showing only gateway IPs by configuring reverse proxies to forward real client addresses via X-Forwarded-For headers.

Read More
How to Clear Recent Files History in Linux without Deleting Actual Files?

Clear recent files history in Linux by deleting ~/.local/share/recently-used.xbel without removing the actual files.

Read More
Best HDD Copy Strategy: Manually Syncing and Rewriting Scratch

Resolve data drift between two 4TB hard drives by using rsync with the --delete flag to manually sync and rewrite scratch data for an exact mirror.

Read More
Understanding Bash Prompt Abbreviations: An Overview

Resolve repetitive typing errors by creating and persisting Bash aliases in the .bashrc file for improved command-line efficiency.

Read More
Free Tools and Methods to Log Real-Time Performance Details in Task Manager

Log real-time CPU and memory metrics to CSV files using Windows Performance Monitor Data Collector Sets to troubleshoot system slowness.

Read More
Contact Qatar Airways Customer Service: Phone Number, Help Center, and More

Resolve urgent Qatar Airways reservation issues like flight changes and baggage claims using the US phone number +1801-855-5905 or online self-service tools.

Read More
Windows 11: Alt Codes Displaying Wrong Characters - Solutions

Resolve Windows 11 Alt codes showing wrong characters by verifying the US keyboard layout and enabling Num Lock.

Read More
Run Programs with Elevated Privileges: A Comprehensive Guide

Eliminates the need to type sudo for frequent administrative tasks by configuring .bashrc aliases or functions.

Read More
Dynamically Changing Dates in Excel Formulas Using Cells

Eliminate manual date updates in Excel by using cell references to create dynamic formulas that automatically adjust calculations when input dates change.

Read More
Granting Edit Access to a Specific Excel Sheet in an Office 365 User Email ID-Based Login

Excel Online lacks native sheet-level permissions, so users must split workbooks or use worksheet protection to isolate edit access for specific tabs.

Read More
Creating Network Load on Local Wi-Fi from One PC

Generate sustained Wi-Fi bandwidth load from a single PC using a VM SFTP server to test router stability and throughput.

Read More
Changing the Default Editor for Batch Files in Windows 11's File Explorer

Resolve the issue of batch files opening in Notepad by changing the default editor to a preferred application like VS Code.

Read More
Gain WiFi Connection Minutes Before Losing it by Changing MAC Address

Bypass MAC address filtering to restore WiFi connectivity temporarily when a device is blocked by network administrators.

Read More
Photos Folders Turned Black: Troubleshooting Picture Applications on Windows

Resolve black screens in Windows Photos by resetting the app, updating graphics drivers, and repairing system files.

Read More
Troubleshooting High CPU Temperature Values: A Step-by-Step Guide

Resolve high CPU temperatures and thermal throttling by monitoring with Speedfan, cleaning dust from cooling components, and replacing degraded thermal paste.

Read More
Make cURL establish TLS connection with CA unknown

Resolve cURL TLS connection failures with unknown or self-signed certificates by using the --insecure flag to bypass CA validation.

Read More
Troubleshooting Incorrect Network Metrics Values in Grafana, Prometheus, InfluxDB, and Telegraf

Fix incorrect network metrics in Grafana, Prometheus, InfluxDB, and Telegraf by verifying interface selection, resolving unit mismatches, and handling counter resets.

Read More
Start Another Terminal Window (cmd.exe) Windows Repair/Troubleshoot

Provides step-by-step instructions to access the Windows Command Prompt via bootable media for advanced system repair and troubleshooting.

Read More
Thinkpad P1 Gen 6: Sudden Thunderbolt 3 Dock USB-C Charging Stopped Working

Resolve sudden Thunderbolt 3 dock USB-C charging and internet failure on ThinkPad P1 Gen 6 by updating firmware, resetting the dock, and adjusting power settings.

Read More
ASUS Windows 11 Laptop: Internet Connection Issue with Hotspot

Resolve ASUS Windows 11 laptop spinning wheel issue when connecting to mobile hotspot by resetting network stack, disabling IPv6, and adjusting power settings.

Read More
Developing iOS Project with Firebase: Logging in and Sending Push Notifications

Integrates Firebase to enable secure user authentication and push notifications in iOS applications.

Read More
Troubleshooting Bash Script with Suspected Issues of Spaces, Dashes, Filenames and Quoting

Resolve Bash script failures caused by word splitting, globbing, and special characters in filenames by applying proper quoting techniques.

Read More
Populating OneDrive Folder for Local Backup without Affecting Remote Files

Prevent OneDrive from deleting remote files during Windows reinstallation by unlinking the account or using symbolic links to isolate local data.

Read More
Force First Frame as Keyframe Without Re-encoding: A Quick Solution

Resolve inaccurate seeking and playback glitches by re-encoding video to ensure the first frame is a valid keyframe.

Read More
Find Information in Database Using WSL (Ubuntu) on Windows-10

Resolve database connection issues from WSL Ubuntu on Windows 10 by configuring client tools and network access to query remote or local servers.

Read More
Configuring a New Router with Different Networks: One Family, One Guest

Resolve IP conflicts and isolate guest traffic by configuring a second router with a distinct subnet via its WAN port.

Read More
Quickly Open Multiple Stock Websites with a Single Command

Solve the problem of manually opening multiple stock research websites by creating a single command to launch them simultaneously on Windows, macOS, or Linux.

Read More
Improved Adobe Acrobat Search Experience: Access Advanced Search with Ease

Access advanced search filters like case sensitivity and regex in Adobe Acrobat by clicking More Options in the Find bar.

Read More
Port Forwarding VM via OpenVPN: A Comprehensive Guide

Configure OpenVPN server and iptables to forward specific ports from VPN clients to a virtual machine's internal IP address.

Read More
Understanding Partitions in the 1980s: A Look Back at MS-DOS and Master Boot Record

Explains how the Master Boot Record and partition table enabled MS-DOS to manage multiple disk volumes on a single physical drive.

Read More
Windows 10 Enterprise: Keyboard Not Detected in Managed Organization with Admin Privileges

Resolve Windows 10 Enterprise keyboard detection failures caused by Group Policy restrictions, driver corruption, or USB enumeration errors.

Read More
Can't Find x86_64 Versions of Applications on MacOS arm64 (M1)

Resolve missing x86_64 app issues on M1 Macs by installing Rosetta 2 and reinstalling apps as universal binaries.

Read More
How to Hide Installation Source for an Android App

Manage Android app installation source visibility by using USB transfers or file managers to reduce browser traces and isolate data via work profiles.

Read More
Connecting Momentus 4200.2 ST9808210A Hard Drive via USB Cable

Resolve inability to access Seagate Momentus 4200.2 ST9808210A hard drive by connecting it via USB using a compatible SATA-to-USB adapter and configuring the disk in Windows.

Read More