10
buildahDefine "github.com/containers/buildah/define"
11
"github.com/containers/common/pkg/config"
12
"github.com/containers/podman/v5/libpod"
13
"github.com/containers/podman/v5/libpod/define"
16
// PullOrBuildInfraImage pulls down the specified image or the one set in
17
// containers.conf. If none is set, it builds a local pause image.
18
func PullOrBuildInfraImage(rt *libpod.Runtime, imageName string) (string, error) {
19
rtConfig, err := rt.GetConfigNoCopy()
25
imageName = rtConfig.Engine.InfraImage
29
_, err := rt.LibimageRuntime().Pull(context.Background(), imageName, config.PullPolicyMissing, nil)
36
name, err := buildPauseImage(rt, rtConfig)
38
return "", fmt.Errorf("building local pause image: %w", err)
43
func buildPauseImage(rt *libpod.Runtime, rtConfig *config.Config) (string, error) {
44
version, err := define.GetVersion()
48
imageName := fmt.Sprintf("localhost/podman-pause:%s-%d", version.Version, version.Built)
50
// First check if the image has already been built.
51
if _, _, err := rt.LibimageRuntime().LookupImage(imageName, nil); err == nil {
55
// Also look into the path as some distributions install catatonit in
57
catatonitPath, err := rtConfig.FindInitBinary()
59
return "", fmt.Errorf("finding pause binary: %w", err)
62
buildContent := fmt.Sprintf(`FROM scratch
64
ENTRYPOINT ["/catatonit", "-P"]`, catatonitPath)
66
tmpF, err := os.CreateTemp("", "pause.containerfile")
70
if _, err := tmpF.WriteString(buildContent); err != nil {
73
if err := tmpF.Close(); err != nil {
76
defer os.Remove(tmpF.Name())
78
buildOptions := buildahDefine.BuildOptions{
79
CommonBuildOpts: &buildahDefine.CommonBuildOptions{},
82
IgnoreFile: "/dev/null", // makes sure to not read a local .ignorefile (see #13529)
83
IIDFile: "/dev/null", // prevents Buildah from writing the ID on stdout
84
IDMappingOptions: &buildahDefine.IDMappingOptions{
85
// Use the host UID/GID mappings for the build to avoid issues when
86
// running with a custom mapping (BZ #2083997).
91
if _, _, err := rt.Build(context.Background(), buildOptions, tmpF.Name()); err != nil {