将变量从gradle任务传递到docker-compose.yml并传递到DockerFile

bzzcjhmw  于 5个月前  发布在  Docker
关注(0)|答案(1)|浏览(64)

当我试图将一个变量从一个gradle任务传递到我的Dockerfile时,我遇到了一个奇怪的问题。
我有一个build.gradle.kts文件,它指定了我正在构建的jar的版本,并将该版本号传递给一个任务。该任务运行assemble任务,然后触发命令行执行以启动Docker compose:

...

version = "0.0.3-SNAPSHOT"

tasks {
    val dockerCompose by creating(Task::class) {
        description = "Builds app, spins up docker containers, and launches the API."
        dependsOn(assemble)

        doLast {
            // Command to run Docker Compose
            val command = "JAR_VERSION=$version; echo \$JAR_VERSION; docker-compose up --build"

            // Execute the command
            project.exec {
                commandLine("sh", "-c", command)
            }
        }
    }
}

字符串
docker-compose.yml定义了我的app服务和一个sidecar postgres服务。我将JAR_VERSION环境变量作为ARG传递给Dockerfile:

version: '3'

services:
  app:
    build:
      dockerfile: Dockerfile
      args:
        - JAR_VERSION=$JAR_VERSION
    ports:
      - "8080:8080"
    depends_on:
      - database
...


在我的Dockerfile中,我使用该参数插入jar文件的名称以复制到我的容器中:

FROM amazoncorretto:17-alpine3.17

ARG JAR_VERSION
RUN echo "JAR VERSION: $JAR_VERSION"
COPY build/libs/matrix-animator-api-${JAR_VERSION}.jar /app.jar
#COPY build/libs/matrix-animator-api-0.0.1-SNAPSHOT.jar /app.jar # <-- the working hard coded string that we're replacing

CMD ["java", "-jar", "app.jar"]


这一切都可以工作,但经过一些试验和错误,我发现只有当我在触发gradle任务时声明了EARTH_VERSION环境变量时,它才能工作。如果我这样做,一切都执行得很好:

JAR_VERSION= ./gradlew dockerCompose


x1c 0d1x的数据
但这感觉很恶心,而且是错误的。我不应该在调用gradle任务时指定环境变量。将其定义为gradle任务的全部意义在于抽象这些概念,实际上,变量存在的唯一地方是在gradle构建脚本中。
当我尝试在不声明env变量的情况下触发命令时,它失败了:

./gradlew dockerCompose



我不知道我到底哪里错了。有什么想法吗?

eqfvzcg8

eqfvzcg81#

这感觉不像是正确的方法,或者至少不是一种标准或惯用的方法,但下面是我如何让它工作的。
我知道:

  • 我想在gradle构建脚本和docker文件之间共享数据。
  • docker文件将导入.env文件中提供的环境变量。
  • gradle构建脚本只是一个Kotlin脚本,所以我可以向它添加逻辑(而不是一个只有xml的maven pom)

所以我把我的版本号移到一个.env文件中:

JAR_VERSION=0.0.4-SNAPSHOT
SOMETHING_ELSE=SOME_OTHER_VAR

字符串
然后将文件阅读和环境变量解析逻辑写入我的build.gradle.kts文件的底部:

data class EnvironmentVariable(
    val name: String,
    val value: String
)

fun List<EnvironmentVariable>.getValue(name: String): String {
    return this.firstOrNull { it.name == name }?.value
        ?: throw MissingPropertyException("The $name variable is missing from the .env file")
}

fun readDotEnvFile(): List<EnvironmentVariable> {
    return File(".env")
        .bufferedReader()
        .use { it.readLines() }
        .map { it.split("=") }
        .map { EnvironmentVariable(it[0], it[1]) }
}


所以现在在我的构建文件中,我可以从.env引用jar版本:

val environmentVariables = readDotEnvFile()

group = "com.lightinspiration"
version = environmentVariables.getValue("JAR_VERSION")


jar版本可以通过.env传入docker:

services:
  app:
    build:
      dockerfile: Dockerfile
      args:
        - JAR_VERSION=$JAR_VERSION


这一切都能正常工作,但在gradle构建脚本中添加文件解析感觉很奇怪。这让我觉得我仍然遗漏了一些东西或处理错误。

相关问题