多阶段构建无法排除 .dockerignore 文件中的文件

4

当我尝试减小图像的大小时,我使用了多阶段构建。但是有一个问题是它没有从第二个镜像中排除文件(即.dockerignore提到的文件)。以下是示例:

myfolder/      
node_modules/
.dockerignore 
.gitignore    
Dockerfile  
package.json  
index.js
yarn.lock

以及 Dockerfile:

FROM node:alpine

WORKDIR /app
COPY . .

# Until now, node_modules folder has not existed.

RUN yarn

FROM node:alpine
WORKDIR /app
COPY --from=0 /app .

# node_modules folder is copied to workdir... 

当然可以一个一个地复制文件和文件夹。但是否有更好的解决方案呢?

你的示例中为什么要使用多阶段构建?据我所见,第二个构建阶段的镜像与第一阶段的镜像完全相同。在这种情况下,您只能使用第一个构建阶段,并使用 RUN rm -rf file 命令删除所有不必要的文件。您想要删除哪些文件?您想在容器中运行什么命令? - maiermic
@maiermic 最初的意图是减小图像大小。然而,使用 RUN rm -rf file. 无法将之前的层移出图像。 - Yingray Lu
@maiermic 我想要删除的文件是开发依赖(babel,eslint等)。在启动节点服务器之前,我必须使用babel编译ES,但我不想在镜像中保留babel包。在第一阶段,使用yarn installnpm install获取所有依赖项,然后进行代码构建。在最后阶段,我尝试使用npm install --production但没有起作用。 - Yingray Lu
你说你需要 dev 依赖来构建代码,但是你在 Dockerfile 中没有运行构建命令。 - maiermic
如果你在 RUN yarn 之后使用 RUN rm -rf file,那么图像大小确实不会减小。我是指 RUN yarn && rm -rf file。你可以安装所有依赖项(包括 dev),构建你的应用程序(我想是 yarn run build),删除所有依赖项,从缓存中安装生产依赖项并删除缓存文件:RUN yarn && yarn run build && rm -rf node_modules && yarn --production && yarn cache clean - maiermic
显示剩余4条评论
1个回答

2
在第一阶段,您看不到node_modules/,因为在将文件发送到守护程序之前,Docker会忽略它,但是在RUN yarn之后,您正在构建一个新的node_modules/,然后将其复制到第二个阶段,由于.dockerignore只能影响在开始构建第一个阶段之前,因此您可以在最终映像中看到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接