【问题标题】:Jenkins pipeline - Environment variable for docker-composeJenkins 管道 - docker-compose 的环境变量
【发布时间】:2018-07-25 07:35:07
【问题描述】:

我正在尝试将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.

【问题讨论】:

    标签: docker jenkins docker-compose jenkins-pipeline


    【解决方案1】:

    sh "docker-compose ..."之前添加了sh "printenv"之后,我看到了

    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} 可以正常工作。

    【讨论】:

    • 这是一种非常奇怪的行为——如果你使用不同的键,比如MY_SPECIFIC_VERSION=1.0.0?我想知道是否已经从构建代理或其他东西继承了一些 Version 环境变量键。
    【解决方案2】:

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

    1. 如果您需要在 my-service 容器中使用 ENV,请将您的 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 ...

    【讨论】:

    • 感谢您的解决方案。没有尝试,因为我找到了另一种方法。
    • 你能分享一下哪种方式吗? :)
    【解决方案3】:

    您是否尝试将以下 environment 放入您的 Jenkinsfile 中?

    {
        ...
        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 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2016-08-12
      • 2017-08-09
      • 2019-09-30
      • 2015-06-17
      • 1970-01-01
      • 2018-10-02
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多