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

Jenkins矩阵环境下Docker PHP镜像打双标签报错,求替代方案

为Docker PHP镜像打双标签的Jenkins解决方案

问题背景

想要给Docker PHP镜像打两个标签:一个是PHP主版本(如8.1),另一个是完整版本(如8.1.10),用Jenkins矩阵构建批量处理不同主版本,但执行时触发报错:

Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId:
11cbbfb3-43b5-4790-8082-4355ed6ababd Also: Also:

org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId:
1aaa7224-51a9-477c-94b0-ca65291b598d ERROR: Tag must follow the
pattern '^:a-zA-Z0-9_{0,127}'

问题出在Jenkins Docker Agent解析变量的BUG,硬编码版本会失去矩阵构建的意义,需要替代方案。

现有代码参考

Dockerfile片段:

ARG PHP_VERSION
ARG PHP_TYPE
FROM php:${PHP_VERSION}-${PHP_TYPE}-alpine  

原Jenkinsfile核心逻辑:通过Docker Agent启动对应PHP镜像,获取完整版本后用来打标签。


解决方案

方案1:用docker run替代Docker Agent获取完整版本

直接绕开Jenkins Docker Agent的变量解析问题,用shell命令拉取对应镜像并执行版本查询,不需要启动Agent容器。

修改后的Jenkinsfile片段:

stage("Build") {
    matrix {
        axes {
            axis {
                name "PHP_VERSION"
                values "8.0", "8.1", "8.2"
            }
        }

        stages {
            stage('获取PHP完整版本') {
                steps {
                    script {
                        phpversion = sh (
                            script: "docker run --rm php:${PHP_VERSION}-fpm-alpine php -r 'echo PHP_VERSION;'",
                            returnStdout: true
                        ).trim()
                        echo "当前PHP完整版本:${phpversion}"
                    }
                }
            }

            stage("构建并推送镜像") {
                steps {
                    sh """
                        docker buildx build --target php-fpm \
                            --build-arg PHP_TYPE=fpm \
                            --build-arg PHP_VERSION=${PHP_VERSION} \
                            --push --platform linux/amd64,linux/arm64 \
                            -t myrepo/php-fpm:${PHP_VERSION} \
                            -t myrepo/php-fpm:${phpversion} \
                            --no-cache .
                    """
                }
            }
        }
    }
}

方案2:通过Dockerfile输出完整版本到文件

如果需要在构建流程中多次使用完整版本,可以在Dockerfile中添加步骤将版本写入文件,构建时提取该文件内容。

修改Dockerfile:

ARG PHP_VERSION
ARG PHP_TYPE
FROM php:${PHP_VERSION}-${PHP_TYPE}-alpine

# 将PHP完整版本写入文件,后续构建可读取
RUN php -r 'echo PHP_VERSION;' > /php-full-version.txt

对应的Jenkins步骤:

stage('获取PHP完整版本') {
    steps {
        // 临时构建镜像并提取版本文件
        sh "docker build --build-arg PHP_VERSION=${PHP_VERSION} --build-arg PHP_TYPE=fpm --output type=local,dest=./temp ."
        phpversion = readFile('./temp/php-full-version.txt').trim()
        // 清理临时文件
        sh "rm -rf ./temp"
    }
}

方案对比

  • 方案1:最简便,直接绕开Jenkins的BUG,不需要修改Dockerfile,适合快速解决问题
  • 方案2:适合需要在多阶段构建中复用完整版本的场景,避免重复拉取镜像

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:52:51