我可以避免Golang模块缓存存储在构建的Docker镜像中,并重用主机的缓存吗?

lstz6jyr  于 2023-04-29  发布在  Docker
关注(0)|答案(1)|浏览(122)

我想构建一个应用程序的Docker镜像(hugo),它应该使用由Golang编写的一些程序从应用程序需要的一些数据(例如:即,来自准备好的HTML页面的文件夹内的页面模板)。当go工具运行时,它需要下载一些模块并存储在Golang的系统缓存中。它们可能非常大,在最终的Docker镜像中不需要。我如何才能避免他们被包括在内?我知道我可以使用多级图像和COPY --from=中间图像,但它似乎不合适。我尝试在Dockerfile Golang命令中使用RUN --mount=type=tmpfs,target=~/.cache/go-build,但文件仍然存储在映像中。难道不应该避免吗?“它可以工作,但实际上(Jenkins代理或开发人员的机器)重用主机的缓存会很好。我的代码有什么问题?

FROM registry.tools.cosmic.sky/core-community/baseimages/golang:1.18.10-alpine AS hugobase
...

ENV HUGO_ROOT=/var/hugo

WORKDIR ${HUGO_ROOT}

<Downloading Hugo here>
RUN ./hugo mod vendor get && chown -R 65534:65534 ${HUGO_ROOT}

COPY tools_version_scraper ${HUGO_ROOT}/tools_version_scraper
RUN cd ./tools_area_name_scraper; go mod download && \
  go run ./area_name_scraper.go \
    -src=${HUGO_ROOT}/content/en/docs/tenant-wiki/3-onboarding/3.1-new-team-onboarding/3.1.2-team-parent-namespace.template \
    -dest=${HUGO_ROOT}/content/en/docs/tenant-wiki/3-onboarding/3.1-new-team-onboarding/3.1.2-team-parent-namespace.md \
  && cd .. \
  && rm -fr ./tools_area_name_scraper

FROM hugobase AS test

<test stuff>

FROM hugobase AS main

USER 65534
EXPOSE 8080

ENTRYPOINT ["/var/hugo/hugo"]
CMD ["serve", "--bind", "0.0.0.0", "--port", "8080", "--verbose", "--verboseLog"]
v1l68za4

v1l68za41#

--mount=type=tmpfs,target=~/.cache/go-build实际上实现了我想要的大部分功能,即不将在指定文件夹中生成的文件包含在映像中,而在同一台机器上跨构建共享它们。它只是不能指向特定的文件夹,就像Jenkins代理自己的Golang缓存一样,但它已经足够好了。Seewww.example. www.example.com for options.

相关问题