GetDigest returns the image's digest Use this to optimize and avoid use of an ImageSource based on the returned digest; if you are going to use an ImageSource anyway, it’s more efficient to create it first and compute the digest from the value returned by GetManifest. NOTE: Implemented to avoid Dock
(ctx context.Context, sys *types.SystemContext, ref types.ImageReference)
| 139 | // NOTE: Implemented to avoid Docker Hub API limits, and mirror configuration may be |
| 140 | // ignored (but may be implemented in the future) |
| 141 | func GetDigest(ctx context.Context, sys *types.SystemContext, ref types.ImageReference) (digest.Digest, error) { |
| 142 | dr, ok := ref.(dockerReference) |
| 143 | if !ok { |
| 144 | return "", errors.New("ref must be a dockerReference") |
| 145 | } |
| 146 | if dr.isUnknownDigest { |
| 147 | return "", fmt.Errorf("docker: reference %q is for unknown digest case; cannot get digest", dr.StringWithinTransport()) |
| 148 | } |
| 149 | |
| 150 | tagOrDigest, err := dr.tagOrDigest() |
| 151 | if err != nil { |
| 152 | return "", err |
| 153 | } |
| 154 | |
| 155 | registryConfig, err := loadRegistryConfiguration(sys) |
| 156 | if err != nil { |
| 157 | return "", err |
| 158 | } |
| 159 | client, err := newDockerClientFromRef(sys, dr, registryConfig, false, "pull") |
| 160 | if err != nil { |
| 161 | return "", fmt.Errorf("failed to create client: %w", err) |
| 162 | } |
| 163 | defer client.Close() |
| 164 | |
| 165 | path := fmt.Sprintf(manifestPath, reference.Path(dr.ref), tagOrDigest) |
| 166 | headers := map[string][]string{ |
| 167 | "Accept": manifest.DefaultRequestedManifestMIMETypes, |
| 168 | } |
| 169 | |
| 170 | res, err := client.makeRequest(ctx, http.MethodHead, path, headers, nil, v2Auth, nil) |
| 171 | if err != nil { |
| 172 | return "", err |
| 173 | } |
| 174 | |
| 175 | defer res.Body.Close() |
| 176 | if res.StatusCode != http.StatusOK { |
| 177 | return "", fmt.Errorf("reading digest %s in %s: %w", tagOrDigest, dr.ref.Name(), registryHTTPResponseToError(res)) |
| 178 | } |
| 179 | |
| 180 | dig, err := digest.Parse(res.Header.Get("Docker-Content-Digest")) |
| 181 | if err != nil { |
| 182 | return "", err |
| 183 | } |
| 184 | |
| 185 | return dig, nil |
| 186 | } |
nothing calls this directly
no test coverage detected
searching dependent graphs…