如何在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
相关产品推荐
相关产品推荐

