This fix tries to address the issue raised in #20083 where
comment is not supported in `.dockerignore`.
This fix updated the processing of `.dockerignore` so that any
lines starting with `#` are ignored, which is similiar to the
behavior of `.gitignore`.
Related documentation has been updated.
Additional tests have been added to cover the changes.
This fix fixes #20083.
Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
... | ... |
@@ -20,7 +20,12 @@ func ReadAll(reader io.ReadCloser) ([]string, error) { |
20 | 20 |
var excludes []string |
21 | 21 |
|
22 | 22 |
for scanner.Scan() { |
23 |
- pattern := strings.TrimSpace(scanner.Text()) |
|
23 |
+ // Lines starting with # (comments) are ignored before processing |
|
24 |
+ pattern := scanner.Text() |
|
25 |
+ if strings.HasPrefix(pattern, "#") { |
|
26 |
+ continue |
|
27 |
+ } |
|
28 |
+ pattern = strings.TrimSpace(pattern) |
|
24 | 29 |
if pattern == "" { |
25 | 30 |
continue |
26 | 31 |
} |
... | ... |
@@ -379,9 +379,13 @@ the working and the root directory. For example, the patterns |
379 | 379 |
in the `foo` subdirectory of `PATH` or in the root of the git |
380 | 380 |
repository located at `URL`. Neither excludes anything else. |
381 | 381 |
|
382 |
+If a line in `.dockerignore` file starts with `#` in column 1, then this line is |
|
383 |
+considered as a comment and is ignored before interpreted by the CLI. |
|
384 |
+ |
|
382 | 385 |
Here is an example `.dockerignore` file: |
383 | 386 |
|
384 | 387 |
``` |
388 |
+# comment |
|
385 | 389 |
*/temp* |
386 | 390 |
*/*/temp* |
387 | 391 |
temp? |
... | ... |
@@ -391,6 +395,7 @@ This file causes the following build behavior: |
391 | 391 |
|
392 | 392 |
| Rule | Behavior | |
393 | 393 |
|----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
394 |
+| `# comment` | Ignored. | |
|
394 | 395 |
| `*/temp*` | Exclude files and directories whose names start with `temp` in any immediate subdirectory of the root. For example, the plain file `/somedir/temporary.txt` is excluded, as is the directory `/somedir/temp`. | |
395 | 396 |
| `*/*/temp*` | Exclude files and directories starting with `temp` from any subdirectory that is two levels below the root. For example, `/somedir/subdir/temporary.txt` is excluded. | |
396 | 397 |
| `temp?` | Exclude files and directories in the root directory whose names are a one-character extension of `temp`. For example, `/tempa` and `/tempb` are excluded. |
... | ... |
@@ -6755,3 +6755,39 @@ func (s *DockerSuite) TestBuildDeleteCommittedFile(c *check.C) { |
6755 | 6755 |
c.Fatal(err) |
6756 | 6756 |
} |
6757 | 6757 |
} |
6758 |
+ |
|
6759 |
+// #20083 |
|
6760 |
+func (s *DockerSuite) TestBuildDockerignoreComment(c *check.C) { |
|
6761 |
+ name := "testbuilddockerignorecleanpaths" |
|
6762 |
+ dockerfile := ` |
|
6763 |
+ FROM busybox |
|
6764 |
+ ADD . /tmp/ |
|
6765 |
+ RUN sh -c "(ls -la /tmp/#1)" |
|
6766 |
+ RUN sh -c "(! ls -la /tmp/#2)" |
|
6767 |
+ RUN sh -c "(! ls /tmp/foo) && (! ls /tmp/foo2) && (ls /tmp/dir1/foo)"` |
|
6768 |
+ ctx, err := fakeContext(dockerfile, map[string]string{ |
|
6769 |
+ "foo": "foo", |
|
6770 |
+ "foo2": "foo2", |
|
6771 |
+ "dir1/foo": "foo in dir1", |
|
6772 |
+ "#1": "# file 1", |
|
6773 |
+ "#2": "# file 2", |
|
6774 |
+ ".dockerignore": `# Visual C++ cache files |
|
6775 |
+# because we have git ;-) |
|
6776 |
+# The above comment is from #20083 |
|
6777 |
+foo |
|
6778 |
+#dir1/foo |
|
6779 |
+foo2 |
|
6780 |
+# The following is considered as comment as # is at the beginning |
|
6781 |
+#1 |
|
6782 |
+# The following is not considered as comment as # is not at the beginning |
|
6783 |
+ #2 |
|
6784 |
+`, |
|
6785 |
+ }) |
|
6786 |
+ if err != nil { |
|
6787 |
+ c.Fatal(err) |
|
6788 |
+ } |
|
6789 |
+ defer ctx.Close() |
|
6790 |
+ if _, err := buildImageFromContext(name, ctx, true); err != nil { |
|
6791 |
+ c.Fatal(err) |
|
6792 |
+ } |
|
6793 |
+} |