Copy directory to another directory using ADD command
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Markdown:
When working with Docker, one of the frequent tasks is to add files or directories to a Docker image during the build process. This is where the ADD command comes into play. In this article, we'll explore the nuances of using the ADD command to copy a directory to another directory within a Docker image. We'll also discuss its syntax, potential pitfalls, and comparisons with the similar COPY command.
Understanding the ADD Command
The ADD command in a Dockerfile is utilized to copy files and directories from the host file system into a Docker image. While seemingly straightforward, the ADD command includes several functionalities that are worth understanding in detail.
Basic Syntax
The basic syntax for the ADD command is:
Here, [source path] is the path to the file or directory you wish to copy from the host system, and [destination path] is the path within the image where you want to place the copied content.
Key Features of ADD
- Automatic Extraction: One of the distinguishing features of the
ADDcommand is its ability to automatically extract compressed files (e.g.,.tar,.tar.gz,.tar.bz2) into the specified destination directory. - URL Downloading: Another lesser-known feature of
ADDis that it can be used to download files from a URL directly into the Docker image. - Source Directory Handling: When copying a directory, the behavior of
ADDdepends on whether the source path ends with a/. If it ends with a/, the contents of the directory are copied over. Otherwise, the directory itself will be copied as a whole into the destination path.
Example: Copying a Directory
Consider the following example, which demonstrates copying a directory myapp from the host to the /app directory in the Docker image:
If myapp contains subdirectories and files, all will be recursively added to /app.
Table: Key Aspects of ADD
| Feature | Description |
| Automatic Extraction | Extracts compressed files automatically to the destination. |
| URL Support | Can take a URL as the source for direct downloading into the image. |
| Behavior with Directories | Copies contents if source ends with /;
else copies the directory as a whole. |
ADD vs COPY
Both the ADD and COPY commands are used to copy files and directories into a Docker image, leading to some confusion. However, they have different intended usages:
- Use
COPYfor basic copying: If you only need to copy files or directories and do not require auto-extraction or URL downloads,COPYis preferred due to its simplicity and explicit intention. - Use
ADDfor auto-extraction or URL needs: If you need the additional features thatADDprovides (e.g., auto-extraction or URL handling), it’s the appropriate choice.
Potential Pitfalls
- Security Risks: Using URLs in
ADDmight introduce security vulnerabilities (e.g., downloading malicious scripts). It’s essential to ensure URL integrity and trustworthiness. - Unnecessary Extraction: If accidental, auto-extraction can lead to unexpected results, consuming more space than intended.
- Layer Management: Each
ADDcreates an additional layer in the Docker image; therefore, optimizing its usage helps in maintaining slim images.
Conclusion
The ADD command provides powerful features for adding files to your Docker images that extend beyond mere file copying. Understanding when and how to use ADD, especially in contrast to COPY, can lead to more efficient and secure Dockerfile practices. Whether you use ADD for its compression capabilities or prefer the simplicity of COPY, comprehending their differences is crucial to optimizing your Docker workflows.
Related reading
- Copy docker image from one AWS ECR repo to another
- COPY with docker but with exclusion
- COPYing a file in a Dockerfile, no such file or directory?
- Copying files from Docker container to host
- Copying files to a container with Docker Compose
- core_dns stuck in ContainerCreating status
- Correct way to detach from a container without stopping it
- Couldn't connect to Docker daemon on Mac OS X

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.