Docker 多阶段构建 - 排除 .git 文件夹

Docker multi-stage build - exclude .git folder

我想做一个 docker 多阶段构建,但是 rm/ignore .git 文件夹,以在 docker 图像上保存 space。

FROM ubuntu as first
WORKDIR /app
RUN git clone <repo>

FROM golang as second
WORKDIR app
COPY --from=first /app .

COPY 有一些 --exclude 选项吗? 这是一个相关问题:https://forums.docker.com/t/dockerignore-in-multi-stage-builds/57169

另一种可能是手动删除 .git 文件夹:

FROM ubuntu as first
WORKDIR /app
RUN git clone <repo>
RUN rm -rf .git

我假设多阶段构建从另一个阶段复制了 "final layer"?

从构建中排除文件的方法之一是使用 .dockerignore file。但是,这可能不是您所需要的,因为您在 映像准备期间 运行 正在 git 克隆 ,因此您实际上需要 .git文件夹。

如果您想使用多阶段构建,那么您需要复制的是工件,而不是前一个构建到下一个构建的层。

另一个想法是 运行 一个浅层克隆 - git clone --depth=1 - 这应该会显着减少存储库的大小。

我意识到我在 OP 中寻求的这种技术根本行不通。大多数人将需要 .git 文件夹来签出正确的提交。克隆整个 repo 的重点是缓存它,以便我们可以在下次构建时检查所需的提交。

因此,我没有做我在 OP 中尝试做的事情,而是我过去使用的一种技术来获得良好的缓存和生成小图像,是这样的:

WORKDIR /app
ADD  's3://url/to/just/package.json' /app/package.json
RUN npm install --production

ARG commit_id
RUN aws s3 cp -c . 's3://url/to/whole/tarball'

所以如果 package.json 没有改变,你可以缓存依赖项,当你做一个构建时,你用 TTL 将精简的 tarball 推送到 s3,然后构建系统可以将 tarball 拉到图片。 tarball 没有 git 文件夹,可以根据需要排除一堆其他文件,这些文件通常由版本控制跟踪。