-
Notifications
You must be signed in to change notification settings - Fork 41.4k
Closed
Description
Problem
The bootBuildImage
task encounters an error configuring tags when using Podman instead of Docker.
Example config:
val registry = "example.org"
val channel: String by project
val latestTag = if (channel.isBlank()) "latest" else "$channel-latest"
tasks {
bootBuildImage {
buildpacks.set(listOf("urn:cnb:builder:paketo-buildpacks/java", "gcr.io/paketo-buildpacks/health-checker:latest"))
environment.set(environment.get() + mapOf("BP_HEALTH_CHECKER_ENABLED" to "true"))
imageName.set("$registry/${rootProject.name}-${project.name}:${project.version}")
tags.set(listOf("$registry/${rootProject.name}-${project.name}:$latestTag"))
}
}
Error:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':example:bootBuildImage'.
> Docker API call to 'localhost/v1.24/images/example.org/example-service:1.0.0-beta.1/tag?repo=example.org%2Fexample-service%3Abeta-latest' failed with status code 500 "Internal Server Error" and message "normalizing image: normalizing name for compat API: invalid reference format"
Diagnosis
DockerApi::tag
uses a single query parameter (repo
) for the target reference:
Line 349 in 21406e7
URI uri = buildUrl("/images/" + sourceReference + "/tag", "repo", targetReference.toString()); |
The Docker Engine API accepts both repo
and tag
parameters, but it parses repo
if tag
is not specified. Podman does not currently support this behavior.
API reference: https://docs.podman.io/en/v3.2.3/_static/api.html#tag/images/operation/ImageTagLibpod
Example request (current behavior)
This fails with podman 4.5.0:
curl --unix-socket /var/run/docker.sock -v -X POST \
"http://localhost/v1.24/images/example.org/example-service:1.0.0/tag?repo=example.org%2Fexample-service%3Alatest"
Podman returns the following:
{
"cause": "normalizing name for compat API: invalid reference format",
"message": "normalizing image: normalizing name for compat API: invalid reference format",
"response": 500
}
Updated request (desired behavior)
This request includes separate repo
and tag
parameters and works with podman 4.5.0:
curl --unix-socket /var/run/docker.sock -v -X POST \
"http://localhost/v1.24/images/example.org/example-service:1.0.0/tag?repo=example.org%2Fexample-service&tag=latest"
Workaround
import org.springframework.boot.buildpack.platform.docker.transport.HttpTransport
tasks {
bootBuildImage {
buildpacks.set(
listOf(
"urn:cnb:builder:paketo-buildpacks/java",
"gcr.io/paketo-buildpacks/health-checker:latest"
)
)
environment.set(environment.get() + mapOf("BP_HEALTH_CHECKER_ENABLED" to "true"))
imageName.set("$registry/${rootProject.name}-${project.name}:${project.version}")
finalizedBy("tagLatest")
}
register("tagLatest") {
doLast {
val source = bootBuildImage.get().imageName.get()
val target = object {
val repo = "$registry/${rootProject.name}-${project.name}"
val tag = latestTag
override fun toString() = "$repo:$tag"
}
URIBuilder("/v1.24/images/$source/tag")
.addParameter("repo", target.repo)
.addParameter("tag", target.tag)
.build().let { uri ->
HttpTransport.create(null).post(uri).close()
}.also {
println("Tagged $source as $target")
}
}
}
}
Metadata
Metadata
Assignees
Labels
type: bugA general bugA general bug