mirror of
https://github.com/containers/podman.git
synced 2025-05-17 23:26:08 +08:00
compat,build: handle docker's preconfigured cacheTo,cacheFrom
Docker's newer clients popuates `cacheFrom` and `cacheTo` parameter by default as empty array for all commands but buildah's design of distributed cache expects this to be a repo not image hence parse only the first populated repo and igore if empty array. Signed-off-by: Aditya R <arajan@redhat.com>
This commit is contained in:

committed by
Romain Geissler

parent
0608f55e91
commit
75b236a2b4
@ -391,22 +391,49 @@ func BuildImage(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Docker clients, as of v19.03.0, populates `cacheFrom` and `cacheTo`
|
||||||
|
// parameter by default as empty array for all commands but buildah's
|
||||||
|
// design of distributed cache expects this to be a repo not image hence
|
||||||
|
// parse only the first populated repo and igore if empty array.
|
||||||
|
// Read more here: https://github.com/containers/podman/issues/15928
|
||||||
|
// TODO: Remove this when buildah's API is extended.
|
||||||
|
compatIgnoreForcedCacheOptions := func(queryStr string) string {
|
||||||
|
query := queryStr
|
||||||
|
if strings.HasPrefix(query, "[") {
|
||||||
|
query = ""
|
||||||
|
var arr []string
|
||||||
|
parseErr := json.Unmarshal([]byte(query), &arr)
|
||||||
|
if parseErr != nil {
|
||||||
|
if len(arr) > 0 {
|
||||||
|
query = arr[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return query
|
||||||
|
}
|
||||||
|
|
||||||
var cacheFrom reference.Named
|
var cacheFrom reference.Named
|
||||||
if _, found := r.URL.Query()["cachefrom"]; found {
|
if _, found := r.URL.Query()["cachefrom"]; found {
|
||||||
cacheFrom, err = parse.RepoNameToNamedReference(query.CacheFrom)
|
cacheFromQuery := compatIgnoreForcedCacheOptions(query.CacheFrom)
|
||||||
|
if cacheFromQuery != "" {
|
||||||
|
cacheFrom, err = parse.RepoNameToNamedReference(cacheFromQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.BadRequest(w, "cacheFrom", query.CacheFrom, err)
|
utils.BadRequest(w, "cacheFrom", cacheFromQuery, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
var cacheTo reference.Named
|
var cacheTo reference.Named
|
||||||
if _, found := r.URL.Query()["cacheto"]; found {
|
if _, found := r.URL.Query()["cacheto"]; found {
|
||||||
cacheTo, err = parse.RepoNameToNamedReference(query.CacheTo)
|
cacheToQuery := compatIgnoreForcedCacheOptions(query.CacheTo)
|
||||||
|
if cacheToQuery != "" {
|
||||||
|
cacheTo, err = parse.RepoNameToNamedReference(cacheToQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.BadRequest(w, "cacheto", query.CacheTo, err)
|
utils.BadRequest(w, "cacheto", cacheToQuery, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
var cacheTTL time.Duration
|
var cacheTTL time.Duration
|
||||||
if _, found := r.URL.Query()["cachettl"]; found {
|
if _, found := r.URL.Query()["cachettl"]; found {
|
||||||
cacheTTL, err = time.ParseDuration(query.CacheTTL)
|
cacheTTL, err = time.ParseDuration(query.CacheTTL)
|
||||||
|
@ -189,6 +189,13 @@ tar --format=posix -C $TMPD -cvf ${CONTAINERFILE_TAR} containerfile &> /dev/null
|
|||||||
t POST "libpod/build?dockerfile=containerfile" $CONTAINERFILE_TAR 200 \
|
t POST "libpod/build?dockerfile=containerfile" $CONTAINERFILE_TAR 200 \
|
||||||
.stream~"STEP 1/1: FROM $IMAGE"
|
.stream~"STEP 1/1: FROM $IMAGE"
|
||||||
|
|
||||||
|
# Docker client as of v19.03.0 sets empty cacheFrom for every build command even if it is not used,
|
||||||
|
# following commit makes sure we test such use-case. See https://github.com/containers/podman/pull/16380
|
||||||
|
#TODO: This test should be extended when buildah's cache-from and cache-to functionally supports
|
||||||
|
# multiple remote-repos
|
||||||
|
t POST "libpod/build?dockerfile=containerfile&cachefrom=[]" $CONTAINERFILE_TAR 200 \
|
||||||
|
.stream~"STEP 1/1: FROM $IMAGE"
|
||||||
|
|
||||||
# With -q, all we should get is image ID. Test both libpod & compat endpoints.
|
# With -q, all we should get is image ID. Test both libpod & compat endpoints.
|
||||||
t POST "libpod/build?dockerfile=containerfile&q=true" $CONTAINERFILE_TAR 200 \
|
t POST "libpod/build?dockerfile=containerfile&q=true" $CONTAINERFILE_TAR 200 \
|
||||||
.stream~'^[0-9a-f]\{64\}$'
|
.stream~'^[0-9a-f]\{64\}$'
|
||||||
|
Reference in New Issue
Block a user