Jenkins管道-用于docker-compose的环境变量

twe*_*sat 5 jenkins docker docker-compose jenkins-pipeline

我正在尝试将docker-compose环境变量用于由设置的图像名称,Jenkinsfile但是它不起作用。

我有一个Jenkinsfile包含

node() {

  stage('Checkout') {
    cleanWs()
    git credentialsId: 'xxx', url: 'ssh://git@...'
  }

  stage('Build') {
    withMaven(maven: 'maven-3.5.3') {
      sh 'mvn clean package'
      def pom = readMavenPom file:'pom.xml'
      JAR_FILE = pom.artifactId + "-" + pom.version + ".jar"
      JAR_VERSION = pom.version
    }
  }

  stage('Build Docker Image') {
    echo "Docker Build ..."
    docker.withTool('docker') {
      app = docker.build("microservices/my-service:${JAR_VERSION}","--build-arg JAR_FILE=${JAR_FILE} .")
    }
  }

  stage('Running Docker Container') {
    echo "Docker Run ..."
    withEnv(['VERSION=1.0.0']) {
      docker.withTool('docker') {
        sh "docker-compose rm -f -s -v"
        sh "docker-compose up -d"
      }
    }
    cleanWs()
  }
}
Run Code Online (Sandbox Code Playgroud)

和一个docker-compose.yml喜欢

version: '3.6'

services:

    my-service:
        image: microservices/my-service:${VERSION}
        container_name: my-service
        ...
Run Code Online (Sandbox Code Playgroud)

一切正常,除了最后一个阶段不使用我的环境变量。

Docker Run ...
[Pipeline] withEnv
[Pipeline] {
[Pipeline] tool

[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh

[my-service] Running shell script
+ docker-compose rm -f -s -v
The VERSION variable is not set. Defaulting to a blank string.
Run Code Online (Sandbox Code Playgroud)

mul*_*g0r 3

您需要将这些 ENV 保存在文件中(jenkinsfile 的输出,dockercompose 文件的输入)。那么,你有两种可能:

  1. 如果您需要将 ENV 保存在my-service容器内,请将 ENV 保存在 中./your_envfile.env,然后添加

    版本:'3.6'
    服务:
        我的服务:
            图片:微服务/我的服务:${VERSION}
            容器名称:我的服务
            env_file: ./your_envfile.env

  2. 如果您需要在 docker-compose 文件中使用 ENV,正如我在您的image部分中看到的那样${VERSION},您需要将 ENV 保存在.env文件中。

.env文件必须与执行 docker-compose 位于同一路径中,或者至少有一个名为的符号链接,./env该符号链接指向您以这种格式保存 ENV 的某个位置:

VERSION=1.0.0 ...