Signed-off-by: Daniel Nephin <dnephin@docker.com>
| ... | ... |
@@ -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 |
} |