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

