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

如何从Jenkins流水线传递变量至docker-compose?

解决Jenkins向远程服务器的docker-compose传递变量的问题

问题根源

你之前的做法无法传递变量,核心原因有两个:

  1. Jenkins中每个sh步骤是独立的进程,sh "export IMAGE=test"仅在当前进程生效,无法传递到后续的ssh步骤
  2. 变量是在Jenkins本地设置的,没有传递到远程EC2服务器的执行环境中

以下是三种可行的解决方法:


方案一:远程执行命令时直接注入环境变量

在ssh命令中直接将变量前置,让远程服务器执行docker-compose时临时加载该变量:

stage('deploy app') {
    steps {
        script {
            echo 'deploying the application...'
            def imageTag = "test"
            def dockerComposeCmd = "docker-compose -f docker-compose.yaml up --detach"
            
            sshagent(['ec2-server-key']) {                  
                sh "scp docker-compose.yaml ec2-user@***:/home/ec2-user"
                // 在远程命令前直接指定环境变量
                sh "ssh -o StrictHostKeyChecking=no ec2-user@*** IMAGE=${imageTag} ${dockerComposeCmd}"
            }
        }
    }
}

这种方式适合仅传递少量变量的场景,变量仅在当前docker-compose命令的执行上下文生效。


方案二:通过.env文件传递变量

利用docker-compose自动加载同目录下.env文件的特性,在Jenkins中生成该文件后同步到远程服务器:

stage('deploy app') {
    steps {
        script {
            echo 'deploying the application...'
            def imageTag = "test"
            
            // 生成包含变量的.env文件
            sh "echo IMAGE=${imageTag} > .env"
            
            sshagent(['ec2-server-key']) {                  
                // 同步compose文件和.env文件到远程目录
                sh "scp docker-compose.yaml .env ec2-user@***:/home/ec2-user"
                sh "ssh -o StrictHostKeyChecking=no ec2-user@*** docker-compose -f docker-compose.yaml up --detach"
            }
        }
    }
}

该方案适合需要传递多个变量的场景,后续修改变量只需更新.env文件即可。


方案三:自定义环境变量文件并指定加载

如果不想使用默认的.env文件名,可以生成自定义变量文件,在执行docker-compose时通过--env-file参数指定:

stage('deploy app') {
    steps {
        script {
            echo 'deploying the application...'
            def imageTag = "test"
            def customEnvFile = "app-deploy.env"
            
            // 生成自定义环境变量文件
            sh "echo IMAGE=${imageTag} > ${customEnvFile}"
            
            sshagent(['ec2-server-key']) {                  
                sh "scp docker-compose.yaml ${customEnvFile} ec2-user@***:/home/ec2-user"
                // 指定加载自定义环境变量文件
                sh "ssh -o StrictHostKeyChecking=no ec2-user@*** docker-compose -f docker-compose.yaml --env-file ${customEnvFile} up --detach"
            }
        }
    }
}

这种方式灵活性更高,适合多环境部署时区分不同的变量配置文件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:20:25