我有这样的文件
# build-home
FROM node:10 AS build-home
WORKDIR /usr/src/app
COPY /home/package.json /home/yarn.lock /usr/src/app/
RUN yarn install
COPY ./home ./
RUN yarn build
# build-dashboard
FROM node:10 AS build-dashboard
WORKDIR /usr/src/app
COPY /dashboard/package.json /dashboard/yarn.lock /usr/src/app/
RUN yarn install
COPY ./dashboard ./
RUN yarn build
# run
FROM nginx
EXPOSE 80
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build-home /usr/src/app/dist /usr/share/nginx/html/home
COPY --from=build-dashboard /usr/src/app/dist /usr/share/nginx/html/dashboard这里,构建两个react应用程序,然后将构建的工件放入nginx中。为了提高构建性能,我需要将dist文件夹缓存到build-home和build-dashboard构建阶段。为此,我在volume中创建了一个docker-compose.yml
...
web:
container_name: web
build:
context: ./web
volumes:
- ./web-build-cache:/usr/src/app
ports:
- 80:80
depends_on:
- api我在这个阶段已经停止了,因为我不知道如何首先为volume阶段添加由docker-compose创建的volume,然后将这个volume添加到build-dashboard中。也许我应该创建两个卷,并将每个卷附加到每个构建阶段,但是如何做到这一点呢?
更新:
家庭申请:
仪表板应用程序:
总时间:
real 8m14.322s
user 0m0.560s
sys 0m0.373s第二次建造 (不改变代码或依赖项):
家庭申请:
仪表板应用程序:
总时间:
real 0m2.933s
user 0m0.309s
sys 0m0.427s第三次建造 (在第一个应用程序中对代码做了小改动):
家庭申请:
仪表板应用程序:
总时间:
real 0m58.216s
user 0m0.340s
sys 0m0.445s无码头家庭应用程序的初始构建:89.69s
real 1m30.111s
user 2m6.148s
sys 2m17.094s没有Docker的家庭应用程序的第二次建造,dist文件夹存在于磁盘上(不改变代码或依赖项):18.16 s
real 0m18.594s
user 0m20.940s
sys 0m2.155s没有Docker的家庭应用程序的第三次建造,dist文件夹存在于磁盘上(代码有小变化):20.44 s
real 0m20.886s
user 0m22.472s
sys 0m2.607s在docker容器中,应用程序的第三个构建要长2倍。这表明,如果第一个构建的结果在磁盘上,其他构建完成得更快。在对接器容器中,第一个程序集之后的所有程序集都将与第一个程序集一样执行,因为没有dist文件夹。
发布于 2019-07-09 09:55:56
如果您使用的是多阶段构建,那么码头缓存就会出现问题。最后的映像没有包含构建步骤的层。通过同时使用--target和--cache-from,您可以保存这些层并在重构中重用它们。
你需要这样的东西
docker build \
--target build-home \
--cache-from build-home:latest \
-t build-home:latest
docker build \
--target build-dashboard \
--cache-from build-dashboard:latest \
-t build-dashboard:latest
docker build \
--cache-from build-dashboard:latest \
--cache-from build-home:latest \
-t my-image:latest \发布于 2018-10-08 11:29:58
您不能在图像构建期间使用卷,而且在任何情况下,Docker已经完成了您所要求的缓存。如果您将Dockerfile保持为-原样,而不尝试将代码按卷添加到docker-compose.yml中,那么您应该像预期的那样获得构建的Javascript文件访问重新构建的缓存。
运行docker build时,Docker依次查看每个步骤。如果步骤的输入没有改变,步骤本身也没有改变,并且正在添加的任何文件都没有改变,那么Docker将只是重用之前运行该步骤的结果。在您的Dockerfile中,如果只更改nginx配置,它将跳过所有Javascript构建步骤,并重用上一次的结果。
(您已经拥有的另一种相关技术是分两个步骤构建应用程序:首先在命名依赖项的package.json和yarn.lock等文件中复制,然后安装依赖项;然后复制并构建应用程序。由于“安装依赖项”步骤通常是耗时的,而且依赖项的更改相对较少,因此希望鼓励Docker重用上一次构建的node_modules目录。)
https://stackoverflow.com/questions/52697948
复制相似问题