mirror of
https://github.com/containers/podman.git
synced 2025-05-28 21:46:51 +08:00
Fix directory pull image name for OCI images
This is a breaking change and modifies the resulting image name when pulling from an directory via `oci:...`. Without this patch, the image names pulled via a local directory got processed incorrectly, like this: ``` > podman pull oci:alpine > podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/oci alpine 4fa153a82426 5 weeks ago 5.85 MB ``` We now use the same approach as in the corresponding [buildah fix][1] to adapt the behavior for correct `localhost/` prefixing. [1]: https://github.com/containers/buildah/pull/1800 After applying the patch the same OCI image pull looks like this: ``` > ./bin/podman pull oci:alpine > podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/alpine latest 4fa153a82426 5 weeks ago 5.85 MB ``` End-to-end tests have been adapted as well to cover the added scenario. Relates to: https://github.com/containers/buildah/issues/1797 Signed-off-by: Sascha Grunert <sgrunert@suse.com>
This commit is contained in:
@ -13,6 +13,7 @@ import (
|
||||
dockerarchive "github.com/containers/image/docker/archive"
|
||||
"github.com/containers/image/docker/tarfile"
|
||||
ociarchive "github.com/containers/image/oci/archive"
|
||||
oci "github.com/containers/image/oci/layout"
|
||||
is "github.com/containers/image/storage"
|
||||
"github.com/containers/image/transports"
|
||||
"github.com/containers/image/transports/alltransports"
|
||||
@ -37,6 +38,9 @@ var (
|
||||
DirTransport = directory.Transport.Name()
|
||||
// DockerTransport is the transport for docker registries
|
||||
DockerTransport = docker.Transport.Name()
|
||||
// OCIDirTransport is the transport for pushing and pulling
|
||||
// images to and from a directory containing an OCI image
|
||||
OCIDirTransport = oci.Transport.Name()
|
||||
// AtomicTransport is the transport for atomic registries
|
||||
AtomicTransport = "atomic"
|
||||
// DefaultTransport is a prefix that we apply to an image name
|
||||
@ -189,12 +193,12 @@ func (ir *Runtime) pullGoalFromImageReference(ctx context.Context, srcRef types.
|
||||
return ir.getSinglePullRefPairGoal(srcRef, dest)
|
||||
|
||||
case DirTransport:
|
||||
path := srcRef.StringWithinTransport()
|
||||
image := path
|
||||
if image[:1] == "/" {
|
||||
// Set localhost as the registry so docker.io isn't prepended, and the path becomes the repository
|
||||
image = DefaultLocalRegistry + image
|
||||
}
|
||||
image := toLocalImageName(srcRef.StringWithinTransport())
|
||||
return ir.getSinglePullRefPairGoal(srcRef, image)
|
||||
|
||||
case OCIDirTransport:
|
||||
split := strings.SplitN(srcRef.StringWithinTransport(), ":", 2)
|
||||
image := toLocalImageName(split[0])
|
||||
return ir.getSinglePullRefPairGoal(srcRef, image)
|
||||
|
||||
default:
|
||||
@ -202,6 +206,15 @@ func (ir *Runtime) pullGoalFromImageReference(ctx context.Context, srcRef types.
|
||||
}
|
||||
}
|
||||
|
||||
// toLocalImageName converts an image name into a 'localhost/' prefixed one
|
||||
func toLocalImageName(imageName string) string {
|
||||
return fmt.Sprintf(
|
||||
"%s/%s",
|
||||
DefaultLocalRegistry,
|
||||
strings.TrimLeft(imageName, "/"),
|
||||
)
|
||||
}
|
||||
|
||||
// pullImageFromHeuristicSource pulls an image based on inputName, which is heuristically parsed and may involve configured registries.
|
||||
// Use pullImageFromReference if the source is known precisely.
|
||||
func (ir *Runtime) pullImageFromHeuristicSource(ctx context.Context, inputName string, writer io.Writer, authfile, signaturePolicyPath string, signingOptions SigningOptions, dockerOptions *DockerRegistryOptions, label *string) ([]string, error) {
|
||||
|
@ -150,6 +150,34 @@ var _ = Describe("Podman pull", func() {
|
||||
session = podmanTest.PodmanNoCache([]string{"pull", imgPath})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
session = podmanTest.PodmanNoCache([]string{"images"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(session.LineInOutputContainsTag(filepath.Join("localhost", dirpath), "latest")).To(BeTrue())
|
||||
session = podmanTest.PodmanNoCache([]string{"rmi", "alpine"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
})
|
||||
|
||||
It("podman pull from local OCI directory", func() {
|
||||
podmanTest.RestoreArtifact(ALPINE)
|
||||
dirpath := filepath.Join(podmanTest.TempDir, "alpine")
|
||||
os.MkdirAll(dirpath, os.ModePerm)
|
||||
imgPath := fmt.Sprintf("oci:%s", dirpath)
|
||||
|
||||
session := podmanTest.PodmanNoCache([]string{"push", "alpine", imgPath})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
session = podmanTest.PodmanNoCache([]string{"rmi", "alpine"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
session = podmanTest.PodmanNoCache([]string{"pull", imgPath})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
session = podmanTest.PodmanNoCache([]string{"images"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
Expect(session.LineInOutputContainsTag(filepath.Join("localhost", dirpath), "latest")).To(BeTrue())
|
||||
session = podmanTest.PodmanNoCache([]string{"rmi", "alpine"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session.ExitCode()).To(Equal(0))
|
||||
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
@ -75,10 +75,10 @@ github.com/containers/image/storage
|
||||
github.com/containers/image/copy
|
||||
github.com/containers/image/docker/reference
|
||||
github.com/containers/image/docker/tarfile
|
||||
github.com/containers/image/oci/layout
|
||||
github.com/containers/image/tarball
|
||||
github.com/containers/image/pkg/sysregistriesv2
|
||||
github.com/containers/image/image
|
||||
github.com/containers/image/oci/layout
|
||||
github.com/containers/image/directory/explicitfilepath
|
||||
github.com/containers/image/docker/policyconfiguration
|
||||
github.com/containers/image/pkg/blobinfocache/none
|
||||
|
Reference in New Issue
Block a user