Skip to content

Commit 331ac6d

Browse files
author
Natalie Arellano
committed
Log a warning (once) when PACK_VOLUME_KEY is unset and running in a container
Signed-off-by: Natalie Arellano <[email protected]>
1 parent ba4bee8 commit 331ac6d

File tree

4 files changed

+87
-45
lines changed

4 files changed

+87
-45
lines changed

acceptance/acceptance_test.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"github.com/buildpacks/pack/internal/style"
3939
"github.com/buildpacks/pack/pkg/archive"
4040
"github.com/buildpacks/pack/pkg/cache"
41+
"github.com/buildpacks/pack/pkg/logging"
4142
h "github.com/buildpacks/pack/testhelpers"
4243
)
4344

@@ -1162,8 +1163,9 @@ func testAcceptance(
11621163
ref, err := name.ParseReference(repoName, name.WeakValidation)
11631164
assert.Nil(err)
11641165
cacheImage := cache.NewImageCache(ref, dockerCli)
1165-
buildCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "build", dockerCli)
1166-
launchCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "launch", dockerCli)
1166+
logger := logging.NewSimpleLogger(&bytes.Buffer{})
1167+
buildCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "build", dockerCli, logger)
1168+
launchCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "launch", dockerCli, logger)
11671169
cacheImage.Clear(context.TODO())
11681170
buildCacheVolume.Clear(context.TODO())
11691171
launchCacheVolume.Clear(context.TODO())
@@ -1282,8 +1284,9 @@ func testAcceptance(
12821284
ref, err := name.ParseReference(repoName, name.WeakValidation)
12831285
assert.Nil(err)
12841286
cacheImage := cache.NewImageCache(ref, dockerCli)
1285-
buildCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "build", dockerCli)
1286-
launchCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "launch", dockerCli)
1287+
logger := logging.NewSimpleLogger(&bytes.Buffer{})
1288+
buildCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "build", dockerCli, logger)
1289+
launchCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "launch", dockerCli, logger)
12871290
cacheImage.Clear(context.TODO())
12881291
buildCacheVolume.Clear(context.TODO())
12891292
launchCacheVolume.Clear(context.TODO())
@@ -3168,8 +3171,9 @@ include = [ "*.jar", "media/mountain.jpg", "/media/person.png", ]
31683171
imageManager.CleanupImages(origID, repoName, runBefore)
31693172
ref, err := name.ParseReference(repoName, name.WeakValidation)
31703173
assert.Nil(err)
3171-
buildCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "build", dockerCli)
3172-
launchCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "launch", dockerCli)
3174+
logger := logging.NewSimpleLogger(&bytes.Buffer{})
3175+
buildCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "build", dockerCli, logger)
3176+
launchCacheVolume, _ := cache.NewVolumeCache(ref, cache.CacheInfo{}, "launch", dockerCli, logger)
31733177
assert.Succeeds(buildCacheVolume.Clear(context.TODO()))
31743178
assert.Succeeds(launchCacheVolume.Clear(context.TODO()))
31753179
})

internal/build/lifecycle_execution.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseF
182182
switch l.opts.Cache.Build.Format {
183183
case cache.CacheVolume:
184184
var err error
185-
buildCache, err = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Build, "build", l.docker)
185+
buildCache, err = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Build, "build", l.docker, l.logger)
186186
if err != nil {
187187
return err
188188
}
@@ -200,7 +200,7 @@ func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseF
200200
l.logger.Debugf("Build cache %s cleared", style.Symbol(buildCache.Name()))
201201
}
202202

203-
launchCache, err := cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Launch, "launch", l.docker)
203+
launchCache, err := cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Launch, "launch", l.docker, l.logger)
204204
if err != nil {
205205
return err
206206
}
@@ -256,7 +256,7 @@ func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseF
256256
// lifecycle 0.17.0 (introduces support for Platform API 0.12) and above will ensure that
257257
// this volume is owned by the CNB user,
258258
// and hence the restorer (after dropping privileges) will be able to write to it.
259-
kanikoCache, err = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Kaniko, "kaniko", l.docker)
259+
kanikoCache, err = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Kaniko, "kaniko", l.docker, l.logger)
260260
if err != nil {
261261
return err
262262
}
@@ -271,7 +271,7 @@ func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseF
271271
return fmt.Errorf("build cache must be volume cache when building with extensions")
272272
default:
273273
// The kaniko cache is unused, so it doesn't matter that it's not usable.
274-
kanikoCache, err = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Kaniko, "kaniko", l.docker)
274+
kanikoCache, err = cache.NewVolumeCache(l.opts.Image, l.opts.Cache.Kaniko, "kaniko", l.docker, l.logger)
275275
if err != nil {
276276
return err
277277
}

pkg/cache/volume_cache.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import (
88
"os"
99
"strings"
1010

11+
"github.com/GoogleContainerTools/kaniko/pkg/util/proc"
1112
"github.com/docker/docker/client"
1213
"github.com/google/go-containerregistry/pkg/name"
1314

1415
"github.com/buildpacks/pack/internal/config"
1516
"github.com/buildpacks/pack/internal/paths"
17+
"github.com/buildpacks/pack/pkg/logging"
1618
)
1719

1820
const EnvVolumeKey = "PACK_VOLUME_KEY"
@@ -22,14 +24,14 @@ type VolumeCache struct {
2224
volume string
2325
}
2426

25-
func NewVolumeCache(imageRef name.Reference, cacheType CacheInfo, suffix string, dockerClient DockerClient) (*VolumeCache, error) {
27+
func NewVolumeCache(imageRef name.Reference, cacheType CacheInfo, suffix string, dockerClient DockerClient, logger logging.Logger) (*VolumeCache, error) {
2628
var volumeName string
2729
if cacheType.Source == "" {
28-
volumeKey, err := getVolumeKey(imageRef)
30+
volumeKey, err := getVolumeKey(imageRef, logger)
2931
if err != nil {
3032
return nil, err
3133
}
32-
sum := sha256.Sum256([]byte(imageRef.Name() + volumeKey)) // TODO: investigate if there are better ways to do this
34+
sum := sha256.Sum256([]byte(imageRef.Name() + volumeKey))
3335
vol := paths.FilterReservedNames(fmt.Sprintf("%s-%x", sanitizedRef(imageRef), sum[:6]))
3436
volumeName = fmt.Sprintf("pack-cache-%s.%s", vol, suffix)
3537
} else {
@@ -42,7 +44,7 @@ func NewVolumeCache(imageRef name.Reference, cacheType CacheInfo, suffix string,
4244
}, nil
4345
}
4446

45-
func getVolumeKey(imageRef name.Reference) (string, error) {
47+
func getVolumeKey(imageRef name.Reference, logger logging.Logger) (string, error) {
4648
var foundKey string
4749

4850
// first, look for key in env
@@ -70,6 +72,12 @@ func getVolumeKey(imageRef name.Reference) (string, error) {
7072

7173
// finally, create new key and store it in config
7274

75+
// if we're running in a container, we should log a warning
76+
// so that we don't always re-create the cache
77+
if RunningInContainer() {
78+
logger.Warnf("%s is unset; set this environment variable to a secret value to avoid creating a new volume cache on every build", EnvVolumeKey)
79+
}
80+
7381
newKey := randString(20)
7482
if cfg.VolumeKeys == nil {
7583
cfg.VolumeKeys = make(map[string]string)
@@ -118,3 +126,7 @@ func sanitizedRef(ref name.Reference) string {
118126
result = strings.ReplaceAll(result, "/", "_")
119127
return fmt.Sprintf("%s_%s", result, ref.Identifier())
120128
}
129+
130+
var RunningInContainer = func() bool {
131+
return proc.GetContainerRuntime(0, 0) != proc.RuntimeNotFound
132+
}

0 commit comments

Comments
 (0)