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.