当我试图将一个变量从一个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
型
的
我不知道我到底哪里错了。有什么想法吗?
1条答案
按热度按时间eqfvzcg81#
这感觉不像是正确的方法,或者至少不是一种标准或惯用的方法,但下面是我如何让它工作的。
我知道:
.env
文件中提供的环境变量。所以我把我的版本号移到一个.env文件中:
字符串
然后将文件阅读和环境变量解析逻辑写入我的build.gradle.kts文件的底部:
型
所以现在在我的构建文件中,我可以从.env引用jar版本:
型
jar版本可以通过.env传入docker:
型
这一切都能正常工作,但在gradle构建脚本中添加文件解析感觉很奇怪。这让我觉得我仍然遗漏了一些东西或处理错误。