Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to speed up the COPY from one image to other in Dockerfile

I am creating an image of my application which involves the packaging of different applications.

After doing the tests/ npm/ bower install etc I am trying to copy the content from the previous image to a fresh image. But that COPY seems very very slow and takes more than 3-4 minutes.

COPY --from=0 /data /data

(Size of /data folder is around 800MB and thousands of files)

Can anyone please suggest a better alternative or some idea to optimize this:

Here is my dockerfile:

FROM node:10-alpine
RUN apk add python git \
  && npm install -g bower

ENV CLIENT_DIR /data/current/client
ENV SERVER_DIR /data/current/server
ENV EXTRA_DIR /data/current/extra

ADD src/client $CLIENT_DIR
ADD src/server $SERVER_DIR

WORKDIR $SERVER_DIR
RUN npm install
RUN npm install --only=dev
RUN npm run build

WORKDIR $CLIENT_DIR
RUN bower --allow-root install

FROM node:10-alpine 
COPY --from=0 /data /data # This step is very very slow.
EXPOSE 80
WORKDIR /data/current/server/src
CMD ["npm","run","start:staging"]

Or if anyone can help me cleaning up the first phase (to reduce the image size), so that it doesn't require using the next image that will be useful too.

like image 744
undefined Avatar asked Oct 31 '18 12:10

undefined


People also ask

What is multistage build in Dockerfile?

With multi-stage builds, you use multiple FROM statements in your Dockerfile. Each FROM instruction can use a different base, and each of them begins a new stage of the build. You can selectively copy artifacts from one stage to another, leaving behind everything you don't want in the final image.

What is Workdir in Dockerfile?

The WORKDIR command is used to define the working directory of a Docker container at any given time. The command is specified in the Dockerfile. Any RUN , CMD , ADD , COPY , or ENTRYPOINT command will be executed in the specified working directory.


1 Answers

It is taking time because the number of files are large . If you can compress the data folder as tar and then copy and extract will be helpful in your situation.

Otherwise If you can take this step to running containers it will be very fast. As per your requirement you need to copy an image of your application that is created already in another image. You can use volume sharing functionality that will share a volume in between 2 or more docker containers.

Create 1st container:

docker run -ti --name=Container -v datavolume:/datavolume ubuntu

2nd container:

docker run -ti --name=Container2 --volumes-from Container ubuntu

Or you can use -v option , so with v option create your 1st and 2nd container as:

docker run -v docker-volume:/data-volume --name centos-latest -it centos

docker run -v docker-volume:/data-volume --name centos-latest1 -it centos

This will create and share same volume folder that is data-volume in both the containers. docker-volume is the volume name and data-volume is folder name in that container that will be pointing to docker-volume volume Same way you can share a volume with more than 2 containers.

like image 97
SushilG Avatar answered Nov 09 '22 02:11

SushilG