如何在Dockerfile中将COPY从一个映像加速到另一个映像

时间:2018-10-31 12:12:11

标签: docker dockerfile

我正在创建应用程序的映像,其中涉及不同应用程序的打包。

完成测试/ npm / bower安装等后,我试图将内容从先前的映像复制到新映像。但是该COPY似乎非常慢,需要3-4分钟以上的时间。

COPY --from=0 /data /data

(/ data文件夹的大小约为800MB,包含数千个文件)

任何人都可以提出更好的替代方案或一些想法来优化此方法吗?

这是我的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"]

或者,如果有人可以帮助我清理第一阶段(以减小图像大小),以便不需要使用下一个也会有用的图像。

1 个答案:

答案 0 :(得分:3)

这是需要时间的,因为文件数量很大。如果您可以将数据文件夹压缩为tar,然后复制并解压缩将对您有帮助。

否则 如果您可以采取此步骤来运行容器,它将非常快。根据您的要求,您需要复制已在另一个映像中创建的应用程序映像。 您可以使用卷共享功能,该功能将在2个或更多docker容器之间共享卷。

创建第一个容器:

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

第二个容器:

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

或者您可以使用-v选项,因此使用v选项将您的 1st 2 容器创建为:

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

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

这将在两个容器中创建并共享相同的卷文件夹,该文件夹是数据卷。 docker-volume 是卷名, data-volume 是该容器中将指向的文件夹名称 docker-volume volume同样,您可以与两个以上的容器共享一个卷。