英文:
How to cache a docker image from a GitHub Action
问题
我有一个情景,在GitHub工作流中使用Maven和Docker构建应用程序。
然后,当应用程序(带有Docker镜像)构建完成后,应用程序的集成测试失败。
我经常需要更改现有的集成测试,而不在重新运行GitHub工作流之前更改应用程序本身,这会导致使用Java和Docker构建(并在本地测试)该操作。
构建过程已经完成,并且Docker镜像已上传到GitHub Packages。我如何检查此应用程序是否已经有Docker镜像?
我可以使用actions/cache@v2(https://github.com/actions/cache)吗?如何使用?Docker未在可以缓存的语言中提到...
英文:
I am having a scenario where I build an application using maven and docker on a GitHub workflow.
Then when the application (with docker image) is build, the integration testing of the application fails.
I often need to change existing integration tests without making changes in the application itself before rerunning The GitHub workflow. This causes the action to be build (and tested locally) with java and docker.
The build process is already done and a docker image uploaded to GitHub Packages. How can I check if this application already have a docker image?
Can I use actions/cache@v2 (https://github.com/actions/cache)? How? Docker is not mentioned in the languages it can cache...
答案1
得分: 2
我建议使用Docker的Build Push操作来实现这个目的。通过build-push-action
,你可以使用内联缓存、注册表缓存或实验性缓存后端API来缓存你的容器映像:
内联缓存
name: 构建和推送
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=registry,ref=user/app:latest
cache-to: type=inline
请参考Buildkit文档。
注册表缓存
name: 构建和推送
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=registry,ref=user/app:buildcache
cache-to: type=registry,ref=user/app:buildcache,mode=max
请参考Buildkit文档。
缓存后端API
name: 构建和推送
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=gha
cache-to: type=gha,mode=max
请参考Buildkit文档。
我个人更喜欢使用缓存后端API,因为它易于设置并显著减少了整个CI流水线的运行时间。
你不需要使用缓存操作,因为上述工作流已经内在地实现了它并为我们抽象了工作流程。
这是一个示例:https://github.com/moja-global/FLINT.Reporting/blob/d7504909f8f101054e503a2993f4f70ca92c2577/.github/workflows/docker.yml#L54
英文:
I would suggest using the Docker's Build Push action for this purpose. Through the build-push-action
, you can cache your container images by using the inline cache, registry cache or the experimental cache backend API:
Inline cache
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=registry,ref=user/app:latest
cache-to: type=inline
Refer to the Buildkit docs.
Registry Cache
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=registry,ref=user/app:buildcache
cache-to: type=registry,ref=user/app:buildcache,mode=max
Refer to Buildkit docs.
Cache backend API
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: user/app:latest
cache-from: type=gha
cache-to: type=gha,mode=max
Refer to Buildkit docs.
I personally prefer using the Cache backend API as its easy to setup and provides a great boost in reducing the overall CI pipeline run duration.
You would not need to use the cache action since the above workflows intrinsically implements that and abstracts the workflow for us.
Here is an example: https://github.com/moja-global/FLINT.Reporting/blob/d7504909f8f101054e503a2993f4f70ca92c2577/.github/workflows/docker.yml#L54
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论