构建Docker镜像推送Cloudsmith时因时间不匹配报错求助
解决Docker镜像推送Cloudsmith时的"No such image"错误
问题核心是构建阶段和推送阶段生成的时间戳不统一——GitHub Actions每个run步骤都是独立的shell会话,你在两个阶段分别执行date命令,哪怕间隔几秒,生成的CURRENT_DATETIME都会不一样,导致推送时找不到对应标签的镜像。另外你重复构建了两次镜像,完全没必要。
直接按下面的方式修改工作流:
steps: - name: Checkout uses: actions/checkout@v4 with: path: xyz token: ${{ secrets.abcdef }} # 提前生成全局统一的变量,通过GITHUB_ENV传递给所有后续步骤 - name: Generate Global Variables run: | CURRENT_DATETIME=$(date +'%Y%m%d%H%M%S') GITHUB_REF_CLEAN="${GITHUB_REF#refs/heads/}" echo "CURRENT_DATETIME=$CURRENT_DATETIME" >> $GITHUB_ENV echo "GITHUB_REF_CLEAN=$GITHUB_REF_CLEAN" >> $GITHUB_ENV echo "IMAGE_TAG=${GITHUB_REF_CLEAN}-${CURRENT_DATETIME}" >> $GITHUB_ENV - name: Build Docker Image run: | # 只构建一次带时间戳的镜像,latest标签用tag命令复制,减少重复构建时间 docker build -t myimage:${{ env.IMAGE_TAG }} -f ./myimage/Dockerfile . docker tag myimage:${{ env.IMAGE_TAG }} myimage:latest - name: 'login to Cloudsmith' uses: docker/login-action@v2 with: registry: docker.cloudsmith.io username: nop-ss password: ${{ secrets.ZAR }} - name: 'push image to Cloudsmith' run: | # 直接复用全局变量,确保标签和构建时完全一致 docker tag myimage:${{ env.IMAGE_TAG }} docker.cloudsmith.io/org/repo/myimage:${{ env.IMAGE_TAG }} docker tag myimage:latest docker.cloudsmith.io/org/repo/myimage:latest docker push docker.cloudsmith.io/org/repo/myimage --all-tags
关键修改点:
- 新增
Generate Global Variables步骤,把需要跨步骤复用的变量写入$GITHUB_ENV,后续步骤直接通过${{ env.XXX }}引用,避免重复生成不一致的变量 - 构建阶段只执行一次
docker build,用docker tag生成latest标签,减少重复构建的资源浪费 - 推送阶段完全复用之前生成的标签变量,确保和构建的镜像标签完全匹配
内容的提问来源于stack exchange,提问作者Anup
相关产品推荐
相关产品推荐

