Browse code

Factor out adding dockerfile from stdin.

Signed-off-by: Daniel Nephin <dnephin@docker.com>

Daniel Nephin authored on 2017/04/06 01:09:26
Showing 2 changed files
... ...
@@ -247,46 +247,10 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
247 247
 
248 248
 	// replace Dockerfile if added dynamically
249 249
 	if dockerfileCtx != nil {
250
-		file, err := ioutil.ReadAll(dockerfileCtx)
251
-		dockerfileCtx.Close()
250
+		buildCtx, relDockerfile, err = addDockerfileToBuildContext(dockerfileCtx, buildCtx)
252 251
 		if err != nil {
253 252
 			return err
254 253
 		}
255
-		now := time.Now()
256
-		hdrTmpl := &tar.Header{
257
-			Mode:       0600,
258
-			Uid:        0,
259
-			Gid:        0,
260
-			ModTime:    now,
261
-			Typeflag:   tar.TypeReg,
262
-			AccessTime: now,
263
-			ChangeTime: now,
264
-		}
265
-		randomName := ".dockerfile." + stringid.GenerateRandomID()[:20]
266
-
267
-		buildCtx = archive.ReplaceFileTarWrapper(buildCtx, map[string]archive.TarModifierFunc{
268
-			randomName: func(_ string, h *tar.Header, content io.Reader) (*tar.Header, []byte, error) {
269
-				return hdrTmpl, file, nil
270
-			},
271
-			".dockerignore": func(_ string, h *tar.Header, content io.Reader) (*tar.Header, []byte, error) {
272
-				if h == nil {
273
-					h = hdrTmpl
274
-				}
275
-				extraIgnore := randomName + "\n"
276
-				b := &bytes.Buffer{}
277
-				if content != nil {
278
-					_, err := b.ReadFrom(content)
279
-					if err != nil {
280
-						return nil, nil, err
281
-					}
282
-				} else {
283
-					extraIgnore += ".dockerignore\n"
284
-				}
285
-				b.Write([]byte("\n" + extraIgnore))
286
-				return h, b.Bytes(), nil
287
-			},
288
-		})
289
-		relDockerfile = randomName
290 254
 	}
291 255
 
292 256
 	ctx := context.Background()
... ...
@@ -392,6 +356,51 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
392 392
 	return nil
393 393
 }
394 394
 
395
+func addDockerfileToBuildContext(dockerfileCtx io.ReadCloser, buildCtx io.ReadCloser) (io.ReadCloser, string, error) {
396
+	file, err := ioutil.ReadAll(dockerfileCtx)
397
+	dockerfileCtx.Close()
398
+	if err != nil {
399
+		return nil, "", err
400
+	}
401
+	now := time.Now()
402
+	hdrTmpl := &tar.Header{
403
+		Mode:       0600,
404
+		Uid:        0,
405
+		Gid:        0,
406
+		ModTime:    now,
407
+		Typeflag:   tar.TypeReg,
408
+		AccessTime: now,
409
+		ChangeTime: now,
410
+	}
411
+	randomName := ".dockerfile." + stringid.GenerateRandomID()[:20]
412
+
413
+	buildCtx = archive.ReplaceFileTarWrapper(buildCtx, map[string]archive.TarModifierFunc{
414
+		// Add the dockerfile with a random filename
415
+		randomName: func(_ string, h *tar.Header, content io.Reader) (*tar.Header, []byte, error) {
416
+			return hdrTmpl, file, nil
417
+		},
418
+		// Update .dockerignore to include the random filename
419
+		".dockerignore": func(_ string, h *tar.Header, content io.Reader) (*tar.Header, []byte, error) {
420
+			if h == nil {
421
+				h = hdrTmpl
422
+			}
423
+			extraIgnore := randomName + "\n"
424
+			b := &bytes.Buffer{}
425
+			if content != nil {
426
+				_, err := b.ReadFrom(content)
427
+				if err != nil {
428
+					return nil, nil, err
429
+				}
430
+			} else {
431
+				extraIgnore += ".dockerignore\n"
432
+			}
433
+			b.Write([]byte("\n" + extraIgnore))
434
+			return h, b.Bytes(), nil
435
+		},
436
+	})
437
+	return buildCtx, randomName, nil
438
+}
439
+
395 440
 func isLocalDir(c string) bool {
396 441
 	_, err := os.Stat(c)
397 442
 	return err == nil
... ...
@@ -230,10 +230,8 @@ func CompressStream(dest io.Writer, compression Compression) (io.WriteCloser, er
230 230
 // define a modification step for a single path
231 231
 type TarModifierFunc func(path string, header *tar.Header, content io.Reader) (*tar.Header, []byte, error)
232 232
 
233
-// ReplaceFileTarWrapper converts inputTarStream to a new tar stream
234
-// while replacing a single file called header.Name with new contents.
235
-// If the file with header.Name does not exist it is added to the tar stream.
236
-// TODO: make this into a generic tar conversion function with walkFn argument
233
+// ReplaceFileTarWrapper converts inputTarStream to a new tar stream. Files in the
234
+// tar stream are modified if they match any of the keys in mods.
237 235
 func ReplaceFileTarWrapper(inputTarStream io.ReadCloser, mods map[string]TarModifierFunc) io.ReadCloser {
238 236
 	pipeReader, pipeWriter := io.Pipe()
239 237
 
... ...
@@ -255,7 +253,7 @@ func ReplaceFileTarWrapper(inputTarStream io.ReadCloser, mods map[string]TarModi
255 255
 			for len(modKeys) > 0 && (err == io.EOF || err == nil && hdr.Name >= modKeys[0]) {
256 256
 				var h *tar.Header
257 257
 				var rdr io.Reader
258
-				if hdr != nil && hdr.Name == modKeys[0] {
258
+				if err == nil && hdr != nil && hdr.Name == modKeys[0] {
259 259
 					h = hdr
260 260
 					rdr = tarReader
261 261
 				}