podman

Форк
0
/
pause_image.go 
96 строк · 2.6 Кб
1
//go:build !remote
2

3
package generate
4

5
import (
6
	"context"
7
	"fmt"
8
	"os"
9

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"
14
)
15

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()
20
	if err != nil {
21
		return "", err
22
	}
23

24
	if imageName == "" {
25
		imageName = rtConfig.Engine.InfraImage
26
	}
27

28
	if imageName != "" {
29
		_, err := rt.LibimageRuntime().Pull(context.Background(), imageName, config.PullPolicyMissing, nil)
30
		if err != nil {
31
			return "", err
32
		}
33
		return imageName, nil
34
	}
35

36
	name, err := buildPauseImage(rt, rtConfig)
37
	if err != nil {
38
		return "", fmt.Errorf("building local pause image: %w", err)
39
	}
40
	return name, nil
41
}
42

43
func buildPauseImage(rt *libpod.Runtime, rtConfig *config.Config) (string, error) {
44
	version, err := define.GetVersion()
45
	if err != nil {
46
		return "", err
47
	}
48
	imageName := fmt.Sprintf("localhost/podman-pause:%s-%d", version.Version, version.Built)
49

50
	// First check if the image has already been built.
51
	if _, _, err := rt.LibimageRuntime().LookupImage(imageName, nil); err == nil {
52
		return imageName, nil
53
	}
54

55
	// Also look into the path as some distributions install catatonit in
56
	// /usr/bin.
57
	catatonitPath, err := rtConfig.FindInitBinary()
58
	if err != nil {
59
		return "", fmt.Errorf("finding pause binary: %w", err)
60
	}
61

62
	buildContent := fmt.Sprintf(`FROM scratch
63
COPY %s /catatonit
64
ENTRYPOINT ["/catatonit", "-P"]`, catatonitPath)
65

66
	tmpF, err := os.CreateTemp("", "pause.containerfile")
67
	if err != nil {
68
		return "", err
69
	}
70
	if _, err := tmpF.WriteString(buildContent); err != nil {
71
		return "", err
72
	}
73
	if err := tmpF.Close(); err != nil {
74
		return "", err
75
	}
76
	defer os.Remove(tmpF.Name())
77

78
	buildOptions := buildahDefine.BuildOptions{
79
		CommonBuildOpts: &buildahDefine.CommonBuildOptions{},
80
		Output:          imageName,
81
		Quiet:           true,
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).
87
			HostUIDMapping: true,
88
			HostGIDMapping: true,
89
		},
90
	}
91
	if _, _, err := rt.Build(context.Background(), buildOptions, tmpF.Name()); err != nil {
92
		return "", err
93
	}
94

95
	return imageName, nil
96
}
97

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.