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

如何在GitHub Actions中推送服务容器至GHCR镜像仓库?

解决方案

你之前用docker/build-push-action@v4的思路不对——这个Action是用来从Dockerfile构建新镜像的,而你需要的是把已经运行并修改数据的Postgres服务容器,打包成新镜像再推送到GHCR。下面是具体的修改步骤:

1. 让主容器能访问宿主Docker daemon

因为你的Job运行在自定义Ubuntu容器里,要操作Runner上的Docker(也就是Postgres服务容器所在的环境),需要在容器配置里挂载Docker套接字。修改你的Job容器配置:

jobs:
  container-job:
    runs-on:
      - self-hosted
    container:
      image: ghcr.io/user/my-container:latest
      options: --volume /var/run/docker.sock:/var/run/docker.sock  # 添加这行
    services:
      # 原postgres服务配置不变
      postgres:
        image: postgres:15.3
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
          -e POSTGRES_HOST_AUTH_METHOD=trust
          -e POSTGRES_DB=somedatabase
          -e POSTGRES_USER=someuser

2. 添加容器提交与推送步骤

在现有的Modify data步骤之后,添加以下步骤来处理Postgres容器:

steps:
  # 原有的steps(checkout、pg-dump、restore、modify data)保持不变

  - name: 获取Postgres服务容器ID
    run: |
      # 通过容器名称筛选(GitHub Action的services容器名包含_postgres_标识)
      POSTGRES_CONTAINER_ID=$(docker ps --filter "name=_postgres_" --format "{{.ID}}")
      echo "POSTGRES_CONTAINER_ID=$POSTGRES_CONTAINER_ID" >> $GITHUB_ENV

  - name: 提交容器为新镜像
    run: |
      # 用Commit SHA作为版本标签,同时打latest标签
      docker commit ${{ env.POSTGRES_CONTAINER_ID }} ghcr.io/user/my-modified-postgres:${{ github.sha }}
      docker tag ghcr.io/user/my-modified-postgres:${{ github.sha }} ghcr.io/user/my-modified-postgres:latest

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

  - name: 推送镜像到GHCR
    run: |
      docker push ghcr.io/user/my-modified-postgres:${{ github.sha }}
      docker push ghcr.io/user/my-modified-postgres:latest

关键说明

  • 筛选容器ID:GitHub Action会给services容器生成带_job-name_service-name_格式的名称,所以用--filter "name=_postgres_"可以精准匹配到你的Postgres服务容器。
  • 镜像标签:用github.sha作为唯一标签,避免覆盖历史版本,同时保留latest标签方便拉取最新修改后的镜像。
  • 权限:确保你的self-hosted Runner有Docker权限,且GITHUB_TOKEN拥有GHCR的推送权限(默认仓库令牌已具备该权限)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:33:24