使用GitHub Actions构建Docker容器无法更新GitHub Packages包的配置修改问题
问题根因及修复方案
核心问题点
- 工作流缺失代码拉取步骤:当前脚本没有拉取仓库最新代码的逻辑,每次构建使用的都是Runner环境的默认文件,自然不会同步最新的代码变更
- 环境变量定义不生效:GitHub Actions的
env字段不支持直接执行Shell命令,你定义的镜像地址中的$(echo xxx)会被当做普通字符串处理,导致实际推送的镜像地址和你预期的不一致 - Docker默认使用缓存构建:
docker-compose build默认会复用本地镜像缓存,即使代码更新如果缓存层命中,也会生成和旧版本哈希完全一致的镜像,ghcr.io会判定镜像无变化拒绝更新
修改后的工作流脚本
name: Continuous Integration and Delivery on: [ push ] env: # 用GitHub内置函数转小写,避免Shell解析问题 REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} WEB_IMAGE: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/web:latest NGINX_IMAGE: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/nginx:latest # 可选:添加commit hash作为标签,方便版本追溯 WEB_IMAGE_HASH: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/web:${{ github.sha }} NGINX_IMAGE_HASH: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/nginx:${{ github.sha }} jobs: build: name: Build Docker Images runs-on: ubuntu-latest steps: # 新增:拉取仓库最新代码 - name: Checkout code uses: actions/checkout@v4 - name: Log in to GitHub Packages run: echo ${PERSONAL_ACCESS_TOKEN} | docker login ghcr.io -u ${{ secrets.NAMESPACE }} --password-stdin env: PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - name: Build images run: | # 加--no-cache强制不使用缓存,保证每次都用最新代码构建 docker-compose -f docker-compose.ci.yml build --no-cache # 给镜像打带commit hash的标签,确保版本唯一 docker tag ${{ env.WEB_IMAGE }} ${{ env.WEB_IMAGE_HASH }} docker tag ${{ env.NGINX_IMAGE }} ${{ env.NGINX_IMAGE_HASH }} - name: Push images run: | # 同时推送latest标签和哈希标签 docker push ${{ env.WEB_IMAGE }} docker push ${{ env.WEB_IMAGE_HASH }} docker push ${{ env.NGINX_IMAGE }} docker push ${{ env.NGINX_IMAGE_HASH }}
额外说明
你的docker-compose.ci.yml配置没有问题,不需要修改。修改后每次推送代码都会强制拉取最新代码、无缓存构建镜像,同时打唯一的版本标签推送到ghcr.io,不会再出现包不更新的问题。
内容的提问来源于stack exchange,提问作者Joseph Adam
相关产品推荐
相关产品推荐

