Github 动作 docker 缓存

Sau*_*ank 7 docker github-actions

我认为这对其他人有用。

我正在使用https://github.com/phips28/gh-action-bump-version在 Github Actions 中自动提升 NPM 版本。

有没有办法缓存这个动作的 docker 图像,这样它就不必每次都构建?它需要很长时间才能运行,并且它会在其余步骤之前预先运行。我确信这对于提取 docker 图像的类似类型的 Github Actions 来说很常见。

docker 镜像看起来很瘦,所以我不确定尝试优化镜像本身会有什么好处。更多关于如何配置 Github Actions。

有什么建议?

The*_*ead 8

总长DR

\n

有些!您可以将 GitHub 工作流程文件更改为pull存储库中的图像,而不是building每次运行。虽然这不会缓存图像,但速度要快得多。这可以通过将流程编辑为如下所示来实现:

\n
      - name: \'Automated Version Bump\'\n        id: version-bump\n        uses: \'docker://phips28/gh-action-bump-version:master\'\n        with:\n          tag-prefix: \'v\'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n
Run Code Online (Sandbox Code Playgroud)\n

请注意语句docker://的前缀uses:,以及从@master到 的更改:master,以便将名称转换为有效的图像名称。

\n

我已经在该存储库上打开了一个PR,并提供了建议的修复:^)

\n

原始回应

\n

这是一个非常好的问题,但在官方文档中几乎找不到相关信息(尽管GitHub 在其文档中承认了这一延迟)。

\n

GitHub 工作人员回应

\n

我搜索了您,并设法在 GitHub 社区论坛上找到了 2019 年 9 月关于这个主题的文章。它不可避免地与 2019 年 7 月的这篇文章相关联。

\n

有一个关于每次构建如何仍然利用 docker 构建缓存、减少时间、但在使用最新版本的基础镜像等方面允许灵活性的精彩解释。

\n

如果您不关心更新的灵活性,并且只想尽可能缩短构建时间,那么有一个建议的解决方案,尽管我不确定该语法当前是否仍然有效:

\n
\n

但是让\xe2\x80\x99s 说我不\xe2\x80\x99s 不希望我的Action 在每次Action 运行时都评估Dockerfile,因为我想要绝对最快的运行时间。我想要一个预定义的 Docker 容器启动并开始工作。你也可以拥有!如果您创建 Docker 映像并将其上传到 Docker Hub 或其他公共注册表,则可以指示您的操作使用该 Docker 映像,特别是在使用项中使用 docker:// 形式。有关详细信息,请参阅 GitHub Actions 文档 72。这需要更多的前期工作和维护,但如果您不需要上述 Dockerfile 评估系统提供的灵活性,那么可能值得进行权衡。

\n
\n

不幸的是, Github 操作文档的链接已损坏,但这确实表明该操作的作者如果修改了操作,则可以允许此行为

\n

其他想法

\n

如果您需要能够控制执行器主机上的缓存(以真正缓存图像),那么您可能会考虑托管自己的 GitHub runner,因为您可以完全控制那里的图像。尽管我认为这可能是一种威慑,因为 GitHub actions 很大程度上是一项免费服务(有限制,这可能是其中之一!)

\n

您可能需要考虑添加一个利用文件缓存操作的任务,并尝试通过或导出gh-action-bump-version到文件内容,然后在下次运行时重新填充它。然而,这会带来复杂性,从长远来看可能不会节省您的时间。docker commitdocker save编辑:这是一个可怕的想法,因为我们知道操作可以支持从注册表中提取图像。

\n

我希望这对您以及其他寻求更多信息的人有所帮助

\n


小智 -1

docker 博客上有一篇很棒的文章,解释了如何使用 actions/cache 和 buildx 缓存 docker 镜像(它允许您指定自定义缓存路径)。可以在这里找到: https: //www.docker.com/blog/docker-github-actions/

  • 我认为这不是索尔·弗兰克正在寻找的答案。本文展示了如何在构建 Docker 映像时缓存层,而在这里我们想要使用使用 Docker 的外部操作,并且此操作是在我们无法控制的“设置”阶段构建的。 (4认同)