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

时间:2018-07-25 07:35:07

标签: docker jenkins 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()
  }
}

还有一个docker-compose.yml之类的

version: '3.6'

services:

    my-service:
        image: microservices/my-service:${VERSION}
        container_name: my-service
        ...

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

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.

3 个答案:

答案 0 :(得分:2)

在我看到的sh "printenv"之前添加了sh "docker-compose ..."格线

Version=1.0.0

我不知道为什么withEnv(['VERSION=1.0.0'])给我Version=1.0.0,但是使用docker-compose-yml image: microservices/my-service:${Version}代替image: microservices/my-service:${VERSION}很好。

答案 1 :(得分:1)

您需要将这些ENV保存在一个文件中(jenkinsfile的输出,dockercompose文件的输入)。 然后,您有两种可能性:

  1. 如果需要在https://maps.googleapis.com/maps/api/geocode/json?address=Per%FA%20Argentina&key=[**my api key**] 容器中保存ENV,请将ENV保存在my-service中,然后添加

    version: '3.6'
    services:
        my-service:
            image: microservices/my-service:${VERSION}
            container_name: my-service
            env_file: ./your_envfile.env

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

${VERSION}文件必须与执行docker-compose的路径相同,或至少有一个名为.env的符号链接,该链接指向您已以以下格式保存ENV的地方:

.env

答案 2 :(得分:0)

您是否尝试将以下environment放入Jenkins文件中?

{
    ...
    stage('Running Docker Container') {
        echo "Docker Run ..."
        docker.withTool('docker') {
            sh "docker-compose rm -f -s -v"
            sh "docker-compose up -d"
        }
        cleanWs()
    }

    environment {
        VERSION = "1.0.0"
    }
}

此外,您可以使用.env文件使用默认值,但是@ mulg0r(permalink)在他的回答中解释了此解决方案。您可以阅读variable substitution in docker-compose documentation以获得更多信息。