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

bzzcjhmw  于 2024-01-06  发布在  Docker
关注(0)|答案(1)|浏览(146)

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

  1. ...
  2. version = "0.0.3-SNAPSHOT"
  3. tasks {
  4. val dockerCompose by creating(Task::class) {
  5. description = "Builds app, spins up docker containers, and launches the API."
  6. dependsOn(assemble)
  7. doLast {
  8. // Command to run Docker Compose
  9. val command = "JAR_VERSION=$version; echo \$JAR_VERSION; docker-compose up --build"
  10. // Execute the command
  11. project.exec {
  12. commandLine("sh", "-c", command)
  13. }
  14. }
  15. }
  16. }

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

  1. version: '3'
  2. services:
  3. app:
  4. build:
  5. dockerfile: Dockerfile
  6. args:
  7. - JAR_VERSION=$JAR_VERSION
  8. ports:
  9. - "8080:8080"
  10. depends_on:
  11. - database
  12. ...


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

  1. FROM amazoncorretto:17-alpine3.17
  2. ARG JAR_VERSION
  3. RUN echo "JAR VERSION: $JAR_VERSION"
  4. COPY build/libs/matrix-animator-api-${JAR_VERSION}.jar /app.jar
  5. #COPY build/libs/matrix-animator-api-0.0.1-SNAPSHOT.jar /app.jar # <-- the working hard coded string that we're replacing
  6. CMD ["java", "-jar", "app.jar"]


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

  1. JAR_VERSION= ./gradlew dockerCompose


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

  1. ./gradlew dockerCompose



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

eqfvzcg8

eqfvzcg81#

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

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

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

  1. JAR_VERSION=0.0.4-SNAPSHOT
  2. SOMETHING_ELSE=SOME_OTHER_VAR

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

  1. data class EnvironmentVariable(
  2. val name: String,
  3. val value: String
  4. )
  5. fun List<EnvironmentVariable>.getValue(name: String): String {
  6. return this.firstOrNull { it.name == name }?.value
  7. ?: throw MissingPropertyException("The $name variable is missing from the .env file")
  8. }
  9. fun readDotEnvFile(): List<EnvironmentVariable> {
  10. return File(".env")
  11. .bufferedReader()
  12. .use { it.readLines() }
  13. .map { it.split("=") }
  14. .map { EnvironmentVariable(it[0], it[1]) }
  15. }


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

  1. val environmentVariables = readDotEnvFile()
  2. group = "com.lightinspiration"
  3. version = environmentVariables.getValue("JAR_VERSION")


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

  1. services:
  2. app:
  3. build:
  4. dockerfile: Dockerfile
  5. args:
  6. - JAR_VERSION=$JAR_VERSION


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

展开查看全部

相关问题