COPY and ADD are both Dockerfile instructions that does similar operation. Both instructions are used to copy files into a Docker image. Lets look at some use cases for both.

Difference between copy and add in Dockerfile

COPY instruction in a Dockerfile

  • The COPY instruction copies files or directories into the Docker image.
  • It takes a src and destination as arguments.
  • Source can be absolute or relative from current WORKDIR or wild cards.
  • Destination path can be absolute or relative to current WORKDIR.

Examples:

COPY ./requirements.txt /app/requirements.txt 
COPY package.json package-lock.json /app
COPY package*.json /app
COPY . /app

Using COPY instruction to add source code into Docker Image

FROM python:3.8.0

# set working directory
WORKDIR /app

# add requirements
COPY ./requirements.txt /app/requirements.txt

# install requirements
RUN pip install -r requirements.txt

# copy source code to /app
COPY . /app

# run server
CMD python main.py

# expose 
EXPOSE 5000

ADD instruction in a Dockerfile

  • The ADD instruction copies files, directories, remote file or tar archive into the Docker image.
  • It takes a src and destination as arguments.
  • Source can be files and directories.
  • Source can be a URL. The ADD instruction will download the file from the URL and save it to the destination. We don’t need to use curl or wget to download a file.
  • Source can be a local tar/zip archive. The ADD instruction will automatically extract it to the destion. We don’t need to run unarchive commands manually.
  • Use ADD when you want download a file from a URL or extract local archive file.

ADD ./example.tar.gz /tmp/

ADD https://bootstrap.pypa.io/get-pip.py /get-pip.py

Using ADD instruction to update pip package manager

FROM python:3.8.0

# set working directory
WORKDIR /app

# add requirements
COPY ./requirements.txt /app/requirements.txt

# updating pip
ADD https://bootstrap.pypa.io/get-pip.py /get-pip.py
RUN python /get-pip.py

# install requirements
RUN pip install -r requirements.txt

# add source code
COPY . /app

# run server
CMD python main.py

# expose 
EXPOSE 5000