Skip to content

Commit 5306df3

Browse files
Merge pull request #6610 from thaJeztah/28.x_backport_deprecate_builder_utils
[28.x backport] cli/command/image/build: deprecate `DefaultDockerfileName`, `DetectArchiveReader`, `WriteTempDockerfile`, `ResolveAndValidateContextPath`
2 parents 6fc5891 + 5dbaa52 commit 5306df3

File tree

2 files changed

+66
-30
lines changed

2 files changed

+66
-30
lines changed

cli/command/image/build/context.go

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,14 @@ import (
2525
"github.com/pkg/errors"
2626
)
2727

28+
// DefaultDockerfileName is the Default filename with Docker commands, read by docker build
29+
//
30+
// Deprecated: this const is no longer used and will be removed in the next release.
31+
const DefaultDockerfileName string = "Dockerfile"
32+
2833
const (
29-
// DefaultDockerfileName is the Default filename with Docker commands, read by docker build
30-
DefaultDockerfileName string = "Dockerfile"
34+
// defaultDockerfileName is the Default filename with Docker commands, read by docker build
35+
defaultDockerfileName string = "Dockerfile"
3136
// archiveHeaderSize is the number of bytes in an archive header
3237
archiveHeaderSize = 512
3338
)
@@ -100,7 +105,18 @@ func filepathMatches(matcher *patternmatcher.PatternMatcher, file string) (bool,
100105
// of input. If an archive is detected, ok is set to true, and to false
101106
// otherwise, in which case it is safe to assume input represents the contents
102107
// of a Dockerfile.
108+
//
109+
// Deprecated: this utility was only used internally, and will be removed in the next release.
103110
func DetectArchiveReader(input io.ReadCloser) (rc io.ReadCloser, ok bool, err error) {
111+
return detectArchiveReader(input)
112+
}
113+
114+
// detectArchiveReader detects whether the input stream is an archive or a
115+
// Dockerfile and returns a buffered version of input, safe to consume in lieu
116+
// of input. If an archive is detected, ok is set to true, and to false
117+
// otherwise, in which case it is safe to assume input represents the contents
118+
// of a Dockerfile.
119+
func detectArchiveReader(input io.ReadCloser) (rc io.ReadCloser, ok bool, err error) {
104120
buf := bufio.NewReader(input)
105121

106122
magic, err := buf.Peek(archiveHeaderSize * 2)
@@ -112,9 +128,18 @@ func DetectArchiveReader(input io.ReadCloser) (rc io.ReadCloser, ok bool, err er
112128
}
113129

114130
// WriteTempDockerfile writes a Dockerfile stream to a temporary file with a
115-
// name specified by DefaultDockerfileName and returns the path to the
131+
// name specified by defaultDockerfileName and returns the path to the
116132
// temporary directory containing the Dockerfile.
133+
//
134+
// Deprecated: this utility was only used internally, and will be removed in the next release.
117135
func WriteTempDockerfile(rc io.ReadCloser) (dockerfileDir string, err error) {
136+
return writeTempDockerfile(rc)
137+
}
138+
139+
// writeTempDockerfile writes a Dockerfile stream to a temporary file with a
140+
// name specified by defaultDockerfileName and returns the path to the
141+
// temporary directory containing the Dockerfile.
142+
func writeTempDockerfile(rc io.ReadCloser) (dockerfileDir string, err error) {
118143
// err is a named return value, due to the defer call below.
119144
dockerfileDir, err = os.MkdirTemp("", "docker-build-tempdockerfile-")
120145
if err != nil {
@@ -126,7 +151,7 @@ func WriteTempDockerfile(rc io.ReadCloser) (dockerfileDir string, err error) {
126151
}
127152
}()
128153

129-
f, err := os.Create(filepath.Join(dockerfileDir, DefaultDockerfileName))
154+
f, err := os.Create(filepath.Join(dockerfileDir, defaultDockerfileName))
130155
if err != nil {
131156
return "", err
132157
}
@@ -141,7 +166,7 @@ func WriteTempDockerfile(rc io.ReadCloser) (dockerfileDir string, err error) {
141166
// Dockerfile or tar archive. Returns a tar archive used as a context and a
142167
// path to the Dockerfile inside the tar.
143168
func GetContextFromReader(rc io.ReadCloser, dockerfileName string) (out io.ReadCloser, relDockerfile string, err error) {
144-
rc, ok, err := DetectArchiveReader(rc)
169+
rc, ok, err := detectArchiveReader(rc)
145170
if err != nil {
146171
return nil, "", err
147172
}
@@ -159,7 +184,7 @@ func GetContextFromReader(rc io.ReadCloser, dockerfileName string) (out io.ReadC
159184
return nil, "", errors.New("ambiguous Dockerfile source: both stdin and flag correspond to Dockerfiles")
160185
}
161186

162-
dockerfileDir, err := WriteTempDockerfile(rc)
187+
dockerfileDir, err := writeTempDockerfile(rc)
163188
if err != nil {
164189
return nil, "", err
165190
}
@@ -173,7 +198,7 @@ func GetContextFromReader(rc io.ReadCloser, dockerfileName string) (out io.ReadC
173198
err := tarArchive.Close()
174199
_ = os.RemoveAll(dockerfileDir)
175200
return err
176-
}), DefaultDockerfileName, nil
201+
}), defaultDockerfileName, nil
177202
}
178203

179204
// IsArchive checks for the magic bytes of a tar or any supported compression
@@ -209,7 +234,7 @@ func GetContextFromGitURL(gitURL, dockerfileName string) (string, string, error)
209234
return "", "", errors.Wrapf(err, "unable to 'git clone' to temporary context directory")
210235
}
211236

212-
absContextDir, err = ResolveAndValidateContextPath(absContextDir)
237+
absContextDir, err = resolveAndValidateContextPath(absContextDir)
213238
if err != nil {
214239
return "", "", err
215240
}
@@ -262,7 +287,7 @@ func getWithStatusError(url string) (resp *http.Response, err error) {
262287
// the relative path of the dockerfile in that context directory, and a non-nil
263288
// error on success.
264289
func GetContextFromLocalDir(localDir, dockerfileName string) (string, string, error) {
265-
localDir, err := ResolveAndValidateContextPath(localDir)
290+
localDir, err := resolveAndValidateContextPath(localDir)
266291
if err != nil {
267292
return "", "", err
268293
}
@@ -282,7 +307,18 @@ func GetContextFromLocalDir(localDir, dockerfileName string) (string, string, er
282307

283308
// ResolveAndValidateContextPath uses the given context directory for a `docker build`
284309
// and returns the absolute path to the context directory.
310+
//
311+
// Deprecated: this utility was used internally and will be removed in the next
312+
// release. Use [DetectContextType] to detect the context-type, and use
313+
// [GetContextFromLocalDir], [GetContextFromLocalDir], [GetContextFromGitURL],
314+
// or [GetContextFromURL] instead.
285315
func ResolveAndValidateContextPath(givenContextDir string) (string, error) {
316+
return resolveAndValidateContextPath(givenContextDir)
317+
}
318+
319+
// resolveAndValidateContextPath uses the given context directory for a `docker build`
320+
// and returns the absolute path to the context directory.
321+
func resolveAndValidateContextPath(givenContextDir string) (string, error) {
286322
absContextDir, err := filepath.Abs(givenContextDir)
287323
if err != nil {
288324
return "", errors.Errorf("unable to get absolute context directory of given context directory %q: %v", givenContextDir, err)
@@ -326,12 +362,12 @@ func getDockerfileRelPath(absContextDir, givenDockerfile string) (string, error)
326362
if absDockerfile == "" {
327363
// No -f/--file was specified so use the default relative to the
328364
// context directory.
329-
absDockerfile = filepath.Join(absContextDir, DefaultDockerfileName)
365+
absDockerfile = filepath.Join(absContextDir, defaultDockerfileName)
330366

331367
// Just to be nice ;-) look for 'dockerfile' too but only
332368
// use it if we found it, otherwise ignore this check
333369
if _, err = os.Lstat(absDockerfile); os.IsNotExist(err) {
334-
altPath := filepath.Join(absContextDir, strings.ToLower(DefaultDockerfileName))
370+
altPath := filepath.Join(absContextDir, strings.ToLower(defaultDockerfileName))
335371
if _, err = os.Lstat(altPath); err == nil {
336372
absDockerfile = altPath
337373
}

cli/command/image/build/context_test.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func prepareNoFiles(t *testing.T) string {
3131
func prepareOneFile(t *testing.T) string {
3232
t.Helper()
3333
contextDir := createTestTempDir(t)
34-
createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents)
34+
createTestTempFile(t, contextDir, defaultDockerfileName, dockerfileContents)
3535
return contextDir
3636
}
3737

@@ -66,31 +66,31 @@ func TestGetContextFromLocalDirNotExistingDockerfile(t *testing.T) {
6666

6767
func TestGetContextFromLocalDirWithNoDirectory(t *testing.T) {
6868
contextDir := createTestTempDir(t)
69-
createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents)
69+
createTestTempFile(t, contextDir, defaultDockerfileName, dockerfileContents)
7070

7171
chdir(t, contextDir)
7272

7373
absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "")
7474
assert.NilError(t, err)
7575

7676
assert.Check(t, is.Equal(contextDir, absContextDir))
77-
assert.Check(t, is.Equal(DefaultDockerfileName, relDockerfile))
77+
assert.Check(t, is.Equal(defaultDockerfileName, relDockerfile))
7878
}
7979

8080
func TestGetContextFromLocalDirWithDockerfile(t *testing.T) {
8181
contextDir := createTestTempDir(t)
82-
createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents)
82+
createTestTempFile(t, contextDir, defaultDockerfileName, dockerfileContents)
8383

8484
absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "")
8585
assert.NilError(t, err)
8686

8787
assert.Check(t, is.Equal(contextDir, absContextDir))
88-
assert.Check(t, is.Equal(DefaultDockerfileName, relDockerfile))
88+
assert.Check(t, is.Equal(defaultDockerfileName, relDockerfile))
8989
}
9090

9191
func TestGetContextFromLocalDirLocalFile(t *testing.T) {
9292
contextDir := createTestTempDir(t)
93-
createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents)
93+
createTestTempFile(t, contextDir, defaultDockerfileName, dockerfileContents)
9494
testFilename := createTestTempFile(t, contextDir, "tmpTest", "test")
9595

9696
absContextDir, relDockerfile, err := GetContextFromLocalDir(testFilename, "")
@@ -112,13 +112,13 @@ func TestGetContextFromLocalDirWithCustomDockerfile(t *testing.T) {
112112
contextDir := createTestTempDir(t)
113113
chdir(t, contextDir)
114114

115-
createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents)
115+
createTestTempFile(t, contextDir, defaultDockerfileName, dockerfileContents)
116116

117-
absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, DefaultDockerfileName)
117+
absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, defaultDockerfileName)
118118
assert.NilError(t, err)
119119

120120
assert.Check(t, is.Equal(contextDir, absContextDir))
121-
assert.Check(t, is.Equal(DefaultDockerfileName, relDockerfile))
121+
assert.Check(t, is.Equal(defaultDockerfileName, relDockerfile))
122122
}
123123

124124
func TestGetContextFromReaderString(t *testing.T) {
@@ -150,8 +150,8 @@ func TestGetContextFromReaderString(t *testing.T) {
150150
t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContents, contents)
151151
}
152152

153-
if relDockerfile != DefaultDockerfileName {
154-
t.Fatalf("Relative path not equals %s, got: %s", DefaultDockerfileName, relDockerfile)
153+
if relDockerfile != defaultDockerfileName {
154+
t.Fatalf("Relative path not equals %s, got: %s", defaultDockerfileName, relDockerfile)
155155
}
156156
}
157157

@@ -164,21 +164,21 @@ func TestGetContextFromReaderStringConflict(t *testing.T) {
164164

165165
func TestGetContextFromReaderTar(t *testing.T) {
166166
contextDir := createTestTempDir(t)
167-
createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents)
167+
createTestTempFile(t, contextDir, defaultDockerfileName, dockerfileContents)
168168

169169
tarStream, err := archive.Tar(contextDir, compression.None)
170170
assert.NilError(t, err)
171171

172-
tarArchive, relDockerfile, err := GetContextFromReader(tarStream, DefaultDockerfileName)
172+
tarArchive, relDockerfile, err := GetContextFromReader(tarStream, defaultDockerfileName)
173173
assert.NilError(t, err)
174174

175175
tarReader := tar.NewReader(tarArchive)
176176

177177
header, err := tarReader.Next()
178178
assert.NilError(t, err)
179179

180-
if header.Name != DefaultDockerfileName {
181-
t.Fatalf("Dockerfile name should be: %s, got: %s", DefaultDockerfileName, header.Name)
180+
if header.Name != defaultDockerfileName {
181+
t.Fatalf("Dockerfile name should be: %s, got: %s", defaultDockerfileName, header.Name)
182182
}
183183

184184
buff := new(bytes.Buffer)
@@ -197,8 +197,8 @@ func TestGetContextFromReaderTar(t *testing.T) {
197197
t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContents, contents)
198198
}
199199

200-
if relDockerfile != DefaultDockerfileName {
201-
t.Fatalf("Relative path not equals %s, got: %s", DefaultDockerfileName, relDockerfile)
200+
if relDockerfile != defaultDockerfileName {
201+
t.Fatalf("Relative path not equals %s, got: %s", defaultDockerfileName, relDockerfile)
202202
}
203203
}
204204

@@ -223,7 +223,7 @@ func TestValidateContextDirectoryWithOneFile(t *testing.T) {
223223
}
224224

225225
func TestValidateContextDirectoryWithOneFileExcludes(t *testing.T) {
226-
testValidateContextDirectory(t, prepareOneFile, []string{DefaultDockerfileName})
226+
testValidateContextDirectory(t, prepareOneFile, []string{defaultDockerfileName})
227227
}
228228

229229
// createTestTempDir creates a temporary directory for testing. It returns the
@@ -326,7 +326,7 @@ func TestDetectArchiveReader(t *testing.T) {
326326
_ = content.Close()
327327
}()
328328

329-
_, isArchive, err := DetectArchiveReader(content)
329+
_, isArchive, err := detectArchiveReader(content)
330330
assert.NilError(t, err)
331331
assert.Check(t, is.Equal(tc.expected, isArchive), tc.file)
332332
})

0 commit comments

Comments
 (0)