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

