代码之家  ›  专栏  ›  技术社区  ›  tweetysat

Jenkins pipeline-docker compose的环境变量

  •  4
  • tweetysat  · 技术社区  · 7 年前

    我想用 docker-compose 对于由 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 回复  |  直到 7 年前
        1
  •  4
  •   tweetysat    7 年前

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

        2
  •  3
  •   Alejandro Galera    7 年前

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

    1. 如果你需要你的环境 my-service 容器将ENV保存在 ./your_envfile.env ,然后添加

      version: '3.6'
      services:
          my-service:
              image: microservices/my-service:${VERSION}
              container_name: my-service
              env_file: ./your_envfile.env
    2. 如果你需要在docker compose文件中使用ENV,如我在 image 剖面图 ${VERSION} ,您需要将ENV保存到 .env 文件。

    .env环境 文件必须与执行docker compose的路径相同,或者至少有一个名为 ./env 您以这种格式保存ENV的位置:

    VERSION=1.0.0 ...
        3
  •  0
  •   Paul Rey    7 年前

    你试着把下面的 environment 在你的詹金斯档案里?

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