summaryrefslogtreecommitdiff
path: root/config/variant.go
diff options
context:
space:
mode:
authorDan Duvall <dduvall@wikimedia.org>2018-03-09 15:46:19 -0800
committerDan Duvall <dduvall@wikimedia.org>2018-03-22 10:57:11 -0700
commit50c5793952a725b5629c5dcd82f26b92716e628a (patch)
treee401fd1e65e9618dd6ad153e8ef29c4d3a30bd37 /config/variant.go
parenteb9b69dd3d710cb7afa1dfb6e23a5987842b21cc (diff)
downloadblubber-50c5793952a725b5629c5dcd82f26b92716e628a.tar.gz
Fix ownership on artifact copies
Summary: The implementation of D984 did not include enforcing ownership for `build.CopyFrom` instruction and so artifacts copied from one image to another via `copies:` were problematically owned as root. In order to fix this behavior: 1. `config.ArtifactConfig` `build.CopyFrom` instructions are now injected duration `build.PhaseInstall` 2. `config.VariantConfig` calls `build.ApplyUser` for these artifact instructions as well using the `runs.as` user 3. `build.CopyAs` was refactored to wrap any `build.Instruction` which should only really be used with `build.Copy` or `build.CopyFrom`. Test Plan: Run `go test ./...`. Run `blubber` against configuration with a variant that uses `copies` and verify that the `COPY --from` instructions also include a `--chown` flag. Reviewers: thcipriani, mmodell, hashar, #release-engineering-team, demon Reviewed By: thcipriani, #release-engineering-team Tags: #release-engineering-team Differential Revision: https://phabricator.wikimedia.org/D1002
Diffstat (limited to 'config/variant.go')
-rw-r--r--config/variant.go25
1 files changed, 14 insertions, 11 deletions
diff --git a/config/variant.go b/config/variant.go
index e3562bf..85bb1a0 100644
--- a/config/variant.go
+++ b/config/variant.go
@@ -34,14 +34,9 @@ func (vc *VariantConfig) Merge(vc2 VariantConfig) {
//
func (vc *VariantConfig) InstructionsForPhase(phase build.Phase) []build.Instruction {
instructions := vc.CommonConfig.InstructionsForPhase(phase)
- ainstructions := []build.Instruction{}
- for _, artifact := range vc.allArtifacts() {
- ainstructions = append(ainstructions, artifact.InstructionsForPhase(phase)...)
- }
-
- instructions = append(ainstructions, instructions...)
var switchUser string
+ var uid, gid uint
switch phase {
case build.PhasePrivileged:
@@ -49,12 +44,14 @@ func (vc *VariantConfig) InstructionsForPhase(phase build.Phase) []build.Instruc
case build.PhasePrivilegeDropped:
switchUser = vc.Lives.As
- instructions = build.ApplyUser(vc.Lives.UID, vc.Lives.GID, instructions)
+ uid, gid = vc.Lives.UID, vc.Lives.GID
case build.PhasePreInstall:
- instructions = build.ApplyUser(vc.Lives.UID, vc.Lives.GID, instructions)
+ uid, gid = vc.Lives.UID, vc.Lives.GID
case build.PhaseInstall:
+ uid, gid = vc.Lives.UID, vc.Lives.GID
+
if vc.Copies == "" {
if vc.SharedVolume.True {
instructions = append(instructions, build.Volume{vc.Lives.In})
@@ -63,17 +60,19 @@ func (vc *VariantConfig) InstructionsForPhase(phase build.Phase) []build.Instruc
}
}
- instructions = build.ApplyUser(vc.Lives.UID, vc.Lives.GID, instructions)
-
case build.PhasePostInstall:
switchUser = vc.Runs.As
- instructions = build.ApplyUser(vc.Runs.UID, vc.Runs.GID, instructions)
+ uid, gid = vc.Runs.UID, vc.Runs.GID
if len(vc.EntryPoint) > 0 {
instructions = append(instructions, build.EntryPoint{vc.EntryPoint})
}
}
+ for _, artifact := range vc.allArtifacts() {
+ instructions = append(instructions, artifact.InstructionsForPhase(phase)...)
+ }
+
if switchUser != "" {
instructions = append(
[]build.Instruction{
@@ -84,6 +83,10 @@ func (vc *VariantConfig) InstructionsForPhase(phase build.Phase) []build.Instruc
)
}
+ if uid != 0 {
+ instructions = build.ApplyUser(uid, gid, instructions)
+ }
+
return instructions
}