Docker Tip #2: The Difference between COPY and ADD in a Dockerfile

Sometimes you see COPY or ADD being used in a Dockerfile, but 99% of the time you should be using COPY, here's why.
COPY
and ADD
are both Dockerfile
instructions that serve similar purposes. They let you copy files from a specific location into a Docker image.
COPY
takes in a src and destination. It only lets you copy in a local file or directory from your host (the machine building the Docker image) into the Docker image itself.
ADD
lets you do that too, but it also supports 2 other sources. First, you can use a URL instead of a local file / directory. Secondly, you can extract a tar file from the source directly into the destination.
In most cases if you’re using a URL, you’re downloading a zip file and are then using the RUN
command to extract it. However, you might as well just use RUN
with curl
instead of ADD
here so you chain everything into 1 RUN
command to make a smaller Docker image.
A valid use case for ADD
is when you want to extract a local tar file into a specific directory in your Docker image. This is exactly what the Alpine image does with ADD rootfs.tar.gz /
.
If you’re copying in local files to your Docker image, always use COPY
because it’s more explicit.