繁体   English   中英

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

[英]Jenkins pipeline - Environment variable for docker-compose

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

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

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

    \n 版本:'3.6'\n 服务:\n     我的服务:\n         image:microservices / my-service:$ {VERSION}\n         container_name:my-service\n         env_file:./ your_envfile.env 

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

.env文件必须与执行docker-compose的路径相同,或者至少是一个名为./env的符号链接,它指向您以这种格式保存ENV的地方:

VERSION=1.0.0 ...

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

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

您是否尝试将以下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( 固定链接 )在他的答案中解释了这个解决方案。 您可以在docker-compose文档中阅读变量替换以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM