You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中构建并推送docker-compose定义的镜像到GitHub Registry

基于docker-compose构建镜像并推送至GHCR的实现方案

你可以通过两种方式实现需求,优先推荐直接调用docker-compose原生命令的方案,适配性更强、配置更简洁。

前置配置:工作流权限与镜像仓库登录

首先在工作流中配置GHCR访问权限,以及完成镜像仓库登录,和你之前单镜像构建的登录逻辑一致:

# 工作流全局权限配置
permissions:
  contents: read
  packages: write

jobs:
  build-images:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 登录GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

secrets.GITHUB_TOKEN为GitHub Actions自动生成的令牌,无需手动提前配置。

方案1:调用docker-compose原生命令构建推送(推荐)

1. 调整docker-compose镜像命名规则

将docker-compose.yml中每个服务的image字段配置为GHCR规范的命名格式,支持通过环境变量动态传值,避免硬编码:

services:
  # 示例web服务
  web:
    build: ./web
    image: ghcr.io/${REGISTRY_OWNER}/web-service:${IMAGE_TAG}
  # 示例db服务
  db:
    build: ./db
    image: ghcr.io/${REGISTRY_OWNER}/db-service:${IMAGE_TAG}

2. 工作流中执行构建推送

在登录GHCR的步骤后,增加构建、推送步骤即可:

- name: 构建所有compose定义的镜像
  run: docker-compose build
  env:
    REGISTRY_OWNER: ${{ github.repository_owner }}
    IMAGE_TAG: ${{ github.sha }} # 可自定义为版本号、分支名等

- name: 推送所有镜像到GHCR
  run: docker-compose push
  env:
    REGISTRY_OWNER: ${{ github.repository_owner }}
    IMAGE_TAG: ${{ github.sha }}

如果需要多平台构建,可提前配置docker buildx builder,docker-compose会自动复用buildx的配置。

方案2:用docker/build-push-action逐个构建

如果你的服务数量少,需要复用build-push-action的缓存、多平台构建等特性,可以单独为每个服务配置构建步骤:

- name: 构建web服务镜像
  uses: docker/build-push-action@v2
  with:
    context: ./web
    push: true
    tags: ghcr.io/${{ github.repository_owner }}/web-service:${{ github.sha }}

- name: 构建db服务镜像
  uses: docker/build-push-action@v2
  with:
    context: ./db
    push: true
    tags: ghcr.io/${{ github.repository_owner }}/db-service:${{ github.sha }}

注意事项

  • 镜像权限:GHCR默认新推送的包为私有,如需公开可进入对应包的设置页面调整可见性
  • 命令兼容:Docker Compose V2版本命令为docker compose(无横杠),如果你的运行环境使用V2版本,将工作流中docker-compose替换为docker compose即可,也可安装compose-switch做兼容
  • 标签自定义:示例中使用Commit SHA作为镜像标签,你也可以根据需求替换为分支名、版本号等自定义标识

内容的提问来源于stack exchange,提问作者gruuu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:36:01