如何在 Dockerfile 中加快从一个图像到另一个图像的 COPY

und*_*ned 6 docker dockerfile

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

在完成测试/ npm/ bower install 等之后,我试图将内容从上一个图像复制到一个新图像。但是那个 COPY 看起来非常非常慢,需要超过 3-4 分钟。

COPY --from=0 /data /data
Run Code Online (Sandbox Code Playgroud)

(/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"]
Run Code Online (Sandbox Code Playgroud)

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

Sus*_*ilG 4

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

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

创建第一个容器:

docker run -ti --name=Container -v datavolume:/datavolume ubuntu
Run Code Online (Sandbox Code Playgroud)

第二个容器:

docker run -ti --name=Container2 --volumes-from Container ubuntu
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 -v 选项,因此使用 v 选项创建您的第一个第二个容器:

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

docker run -v docker-volume:/data-volume --name centos-latest1 -it centos
Run Code Online (Sandbox Code Playgroud)

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

  • 他正在创建一个图像,而不是一个运行时。需要构建时 (3认同)