1

我想做一个 docker 多阶段构建,但 rm/ignore .git 文件夹,以节省 docker 映像的空间。

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

我假设多阶段构建从另一个阶段复制“最终层”?

4

2 回答 2

0

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

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

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

于 2020-01-30T23:25:34.397 回答
0

我意识到我在 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 文件夹,并且可以根据需要排除通常由版本控制跟踪的一堆其他文件。

于 2020-02-03T18:02:44.440 回答