如何使用GitHub Actions调用Makefile构建并推送镜像到Docker Hub
问题解答
可以使用GitHub Actions调用Makefile完成Docker镜像的构建与推送至Docker Hub的操作,完全适配你需要提前编译工具组件再打包镜像的场景。
方案1:全流程走Makefile执行
第一步:编写Makefile
提前在仓库根目录编写Makefile,包含前置编译、镜像构建、镜像推送的完整逻辑,示例如下:
# 定义镜像参数,支持外部传入覆盖 IMAGE_REGISTRY ?= docker.io IMAGE_NAMESPACE ?= your-dockerhub-username IMAGE_NAME ?= your-image-name IMAGE_TAG ?= latest FULL_IMAGE_NAME = $(IMAGE_REGISTRY)/$(IMAGE_NAMESPACE)/$(IMAGE_NAME):$(IMAGE_TAG) # 前置编译工具组件 build-binary: mkdir -p bin # 这里替换为你实际的编译命令,比如Go、C++等语言的编译逻辑 go build -o bin/your-tool cmd/tool/main.go # 构建Docker镜像 build: build-binary docker build -t $(FULL_IMAGE_NAME) . # 推送Docker镜像到Docker Hub push: docker push $(FULL_IMAGE_NAME) .PHONY: build-binary build push
第二步:编写GitHub Actions工作流配置
在.github/workflows/docker-publish.yml中编写如下配置,完成登录Docker Hub、调用Makefile执行全流程的操作:
name: Publish Docker image on: push: branches: [ main ] jobs: docker-publish: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push via Makefile run: make build push IMAGE_TAG=${{ github.sha }}
方案2:仅用Makefile完成前置编译,复用官方构建推送Action
如果你需要复用docker/build-push-action的缓存、多平台构建等原生能力,只需要在官方流程前增加调用Makefile编译前置组件的步骤即可,示例如下:
name: Publish Docker image on: push: branches: [ main ] jobs: docker-publish: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Precompile tool components via Makefile run: make build-binary - name: Build and push Docker image uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
注意事项
- 提前在GitHub仓库的「Settings - Secrets and variables - Actions」中配置
DOCKERHUB_USERNAME(你的Docker Hub用户名)和DOCKERHUB_TOKEN(你的Docker Hub个人访问令牌),不要硬编码凭证到配置文件中 - 确保Makefile内的所有路径都是相对于仓库根目录的,避免CI环境下出现路径找不到的问题
- 如果需要多架构镜像构建,可在前置编译步骤适配对应架构,或在Makefile中集成Docker buildx相关命令实现跨架构构建
内容的提问来源于stack exchange,提问作者ambikanair
相关产品推荐
相关产品推荐

