summaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorDan Duvall <dduvall@wikimedia.org>2017-09-05 17:33:27 -0700
committerDan Duvall <dduvall@wikimedia.org>2017-09-07 10:06:47 -0700
commit62066296380d19dc77ab216cb27100e7e72ff69f (patch)
tree658fcce89b8e18bad2144d99bc8cfef5869b10e8 /docker
parent410085e1f5be759b6a2bfbe08a51dca84aa18e3c (diff)
downloadblubber-62066296380d19dc77ab216cb27100e7e72ff69f.tar.gz
Smarter copies/sharedvolume/default behavior
Summary: Defined new abstract `build.Volume` and corresponding `docker.DockerVolume` instructions. Refactored compilation of main `COPY` or `VOLUME` instruction for application files to use the new instructions and moved injection of these instructions out of the compiler and into `VariantConfig`. The latter can be smarter about the following cases: 1. When `copies` is set, simply depend on artifacts for the application files and do not copy anything from the build host. 2. When `sharedvolume` is `true`, inject a `build.Volume` instruction for the application working directory. 3. When neither of the above are set, copy application files from the host. Fixes T174623 Depends on D768 Test Plan: Run `go test ./...`. Run `blubber blubber.example.yaml production` and ensure: 1. The `prep` stage has a `COPY . .` instruction. 2. The final stage has no `COPY . .` instruction, only `COPY --from=prep` instructions. Reviewers: thcipriani, mobrovac, hashar, mmodell, #release-engineering-team Reviewed By: thcipriani, mobrovac, #release-engineering-team Tags: #release-engineering-team Maniphest Tasks: T174623 Differential Revision: https://phabricator.wikimedia.org/D769
Diffstat (limited to 'docker')
-rw-r--r--docker/compiler.go6
-rw-r--r--docker/instructions.go12
-rw-r--r--docker/instructions_test.go12
3 files changed, 25 insertions, 5 deletions
diff --git a/docker/compiler.go b/docker/compiler.go
index 2891140..c9ca0fb 100644
--- a/docker/compiler.go
+++ b/docker/compiler.go
@@ -58,11 +58,7 @@ func CompileStage(buffer *bytes.Buffer, stage string, vcfg *config.VariantConfig
CompilePhase(buffer, vcfg, build.PhasePreInstall)
- if vcfg.SharedVolume.True {
- Writeln(buffer, "VOLUME [\"", vcfg.Runs.In, "\"]")
- } else {
- Writeln(buffer, "COPY . .")
- }
+ CompilePhase(buffer, vcfg, build.PhaseInstall)
CompilePhase(buffer, vcfg, build.PhasePostInstall)
diff --git a/docker/instructions.go b/docker/instructions.go
index 2b00c1b..4edcb23 100644
--- a/docker/instructions.go
+++ b/docker/instructions.go
@@ -26,6 +26,10 @@ func NewDockerInstruction(instruction build.Instruction) (DockerInstruction, err
var dockerInstruction DockerEnv
dockerInstruction.arguments = instruction.Compile()
return dockerInstruction, nil
+ case build.Volume:
+ var dockerInstruction DockerVolume
+ dockerInstruction.arguments = instruction.Compile()
+ return dockerInstruction, nil
}
return nil, errors.New("Unable to create DockerInstruction")
@@ -77,6 +81,14 @@ func (de DockerEnv) Compile() string {
join(de.arguments, " "))
}
+type DockerVolume struct{ abstractDockerInstruction }
+
+func (dv DockerVolume) Compile() string {
+ return fmt.Sprintf(
+ "VOLUME [%s]\n",
+ join(dv.arguments, ", "))
+}
+
func join(arguments []string, delimiter string) string {
return removeNewlines(strings.Join(arguments, delimiter))
}
diff --git a/docker/instructions_test.go b/docker/instructions_test.go
index fb9116b..10cc1ab 100644
--- a/docker/instructions_test.go
+++ b/docker/instructions_test.go
@@ -70,6 +70,18 @@ func TestEnv(t *testing.T) {
assert.Equal(t, "ENV bar=\"foo\" foo=\"bar\"\n", di.Compile())
}
+func TestVolume(t *testing.T) {
+ i := build.Volume{"/foo/dir"}
+
+ di, err := docker.NewDockerInstruction(i)
+
+ var dockerVolume docker.DockerVolume
+
+ assert.Nil(t, err)
+ assert.IsType(t, dockerVolume, di)
+ assert.Equal(t, "VOLUME [\"/foo/dir\"]\n", di.Compile())
+}
+
func TestEscapeRun(t *testing.T) {
i := build.Run{"/bin/true\nRUN echo HACKED!", []string{}}
dr, _ := docker.NewDockerInstruction(i)