mirror of
https://github.com/containers/podman.git
synced 2025-05-20 00:27:03 +08:00

Moving from Go module v4 to v5 prepares us for public releases. Move done using gomove [1] as with the v3 and v4 moves. [1] https://github.com/KSubedi/gomove Signed-off-by: Matt Heon <mheon@redhat.com>
97 lines
2.6 KiB
Go
97 lines
2.6 KiB
Go
//go:build !remote
|
|
|
|
package generate
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
|
|
buildahDefine "github.com/containers/buildah/define"
|
|
"github.com/containers/common/pkg/config"
|
|
"github.com/containers/podman/v5/libpod"
|
|
"github.com/containers/podman/v5/libpod/define"
|
|
)
|
|
|
|
// PullOrBuildInfraImage pulls down the specified image or the one set in
|
|
// containers.conf. If none is set, it builds a local pause image.
|
|
func PullOrBuildInfraImage(rt *libpod.Runtime, imageName string) (string, error) {
|
|
rtConfig, err := rt.GetConfigNoCopy()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if imageName == "" {
|
|
imageName = rtConfig.Engine.InfraImage
|
|
}
|
|
|
|
if imageName != "" {
|
|
_, err := rt.LibimageRuntime().Pull(context.Background(), imageName, config.PullPolicyMissing, nil)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return imageName, nil
|
|
}
|
|
|
|
name, err := buildPauseImage(rt, rtConfig)
|
|
if err != nil {
|
|
return "", fmt.Errorf("building local pause image: %w", err)
|
|
}
|
|
return name, nil
|
|
}
|
|
|
|
func buildPauseImage(rt *libpod.Runtime, rtConfig *config.Config) (string, error) {
|
|
version, err := define.GetVersion()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
imageName := fmt.Sprintf("localhost/podman-pause:%s-%d", version.Version, version.Built)
|
|
|
|
// First check if the image has already been built.
|
|
if _, _, err := rt.LibimageRuntime().LookupImage(imageName, nil); err == nil {
|
|
return imageName, nil
|
|
}
|
|
|
|
// Also look into the path as some distributions install catatonit in
|
|
// /usr/bin.
|
|
catatonitPath, err := rtConfig.FindInitBinary()
|
|
if err != nil {
|
|
return "", fmt.Errorf("finding pause binary: %w", err)
|
|
}
|
|
|
|
buildContent := fmt.Sprintf(`FROM scratch
|
|
COPY %s /catatonit
|
|
ENTRYPOINT ["/catatonit", "-P"]`, catatonitPath)
|
|
|
|
tmpF, err := os.CreateTemp("", "pause.containerfile")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if _, err := tmpF.WriteString(buildContent); err != nil {
|
|
return "", err
|
|
}
|
|
if err := tmpF.Close(); err != nil {
|
|
return "", err
|
|
}
|
|
defer os.Remove(tmpF.Name())
|
|
|
|
buildOptions := buildahDefine.BuildOptions{
|
|
CommonBuildOpts: &buildahDefine.CommonBuildOptions{},
|
|
Output: imageName,
|
|
Quiet: true,
|
|
IgnoreFile: "/dev/null", // makes sure to not read a local .ignorefile (see #13529)
|
|
IIDFile: "/dev/null", // prevents Buildah from writing the ID on stdout
|
|
IDMappingOptions: &buildahDefine.IDMappingOptions{
|
|
// Use the host UID/GID mappings for the build to avoid issues when
|
|
// running with a custom mapping (BZ #2083997).
|
|
HostUIDMapping: true,
|
|
HostGIDMapping: true,
|
|
},
|
|
}
|
|
if _, _, err := rt.Build(context.Background(), buildOptions, tmpF.Name()); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return imageName, nil
|
|
}
|