Skip to content

Commit fe99e6f

Browse files
committed
provide an optional base image flag for generated dockerfiles from bundle build commands
Signed-off-by: Jordan Keister <[email protected]>
1 parent dc23843 commit fe99e6f

File tree

5 files changed

+29
-11
lines changed

5 files changed

+29
-11
lines changed

cmd/opm/alpha/bundle/build.go

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var (
1515
defaultChannel string
1616
outputDir string
1717
overwrite bool
18+
baseImage string
1819
)
1920

2021
// newBundleBuildCmd returns a command that will build operator bundle image.
@@ -76,6 +77,9 @@ Note:
7677
bundleBuildCmd.Flags().StringVarP(&outputDir, "output-dir", "u", "",
7778
"Optional output directory for operator manifests")
7879

80+
bundleBuildCmd.Flags().StringVar(&baseImage, "base-image", "scratch",
81+
"Use a custom image pullspec as the base bundle image")
82+
7983
return bundleBuildCmd
8084
}
8185

@@ -89,5 +93,6 @@ func buildFunc(cmd *cobra.Command, _ []string) error {
8993
channels,
9094
defaultChannel,
9195
overwrite,
96+
baseImage,
9297
)
9398
}

cmd/opm/alpha/bundle/generate.go

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Note:
4545
bundleGenerateCmd.Flags().StringVarP(&outputDir, "output-dir", "u", "",
4646
"Optional output directory for operator manifests")
4747

48+
bundleGenerateCmd.Flags().StringVar(&baseImage, "base-image", "scratch", "Use a custom image pullspec as the base bundle image")
4849
return bundleGenerateCmd
4950
}
5051

@@ -56,5 +57,6 @@ func generateFunc(cmd *cobra.Command, _ []string) error {
5657
channels,
5758
defaultChannel,
5859
true,
60+
baseImage,
5961
)
6062
}

pkg/lib/bundle/build.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ func ExecuteCommand(cmd *exec.Cmd) error {
5151
// @channelDefault: The default channel for the bundle image
5252
// @overwrite: Boolean flag to enable overwriting annotations.yaml locally if existed
5353
func BuildFunc(directory, outputDir, imageTag, imageBuilder, packageName, channels, channelDefault string,
54-
overwrite bool) error {
54+
overwrite bool, baseImage string) error {
5555
_, err := os.Stat(directory)
5656
if os.IsNotExist(err) {
5757
return err
5858
}
5959

6060
// Generate annotations.yaml and Dockerfile
61-
err = GenerateFunc(directory, outputDir, packageName, channels, channelDefault, overwrite)
61+
err = GenerateFunc(directory, outputDir, packageName, channels, channelDefault, overwrite, baseImage)
6262
if err != nil {
6363
return err
6464
}

pkg/lib/bundle/generate.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ type AnnotationMetadata struct {
4646
// @channels: The list of channels that bundle image belongs to
4747
// @channelDefault: The default channel for the bundle image
4848
// @overwrite: Boolean flag to enable overwriting annotations.yaml locally if existed
49-
func GenerateFunc(directory, outputDir, packageName, channels, channelDefault string, overwrite bool) error {
49+
func GenerateFunc(directory, outputDir, packageName, channels, channelDefault string, overwrite bool, baseImage string) error {
5050
// clean the input so that we know the absolute paths of input directories
5151
directory, err := filepath.Abs(directory)
5252
if err != nil {
@@ -132,7 +132,7 @@ func GenerateFunc(directory, outputDir, packageName, channels, channelDefault st
132132
log.Info("Building Dockerfile")
133133

134134
// Generate Dockerfile
135-
content, err = GenerateDockerfile(mediaType, ManifestsDir, MetadataDir, outManifestDir, outMetadataDir, workingDir, packageName, channels, channelDefault)
135+
content, err = GenerateDockerfile(mediaType, ManifestsDir, MetadataDir, outManifestDir, outMetadataDir, workingDir, packageName, channels, channelDefault, baseImage)
136136
if err != nil {
137137
return err
138138
}
@@ -319,7 +319,7 @@ func GenerateAnnotations(mediaType, manifests, metadata, packageName, channels,
319319
// GenerateDockerfile builds Dockerfile with mediatype, manifests &
320320
// metadata directories in bundle image, package name, channels and default
321321
// channels information in LABEL section.
322-
func GenerateDockerfile(mediaType, manifests, metadata, copyManifestDir, copyMetadataDir, workingDir, packageName, channels, channelDefault string) ([]byte, error) {
322+
func GenerateDockerfile(mediaType, manifests, metadata, copyManifestDir, copyMetadataDir, workingDir, packageName, channels, channelDefault string, baseImage string) ([]byte, error) {
323323
var fileContent string
324324

325325
relativeManifestDirectory, err := filepath.Rel(workingDir, copyManifestDir)
@@ -335,7 +335,7 @@ func GenerateDockerfile(mediaType, manifests, metadata, copyManifestDir, copyMet
335335
relativeMetadataDirectory = filepath.ToSlash(relativeMetadataDirectory)
336336

337337
// FROM
338-
fileContent += "FROM scratch\n\n"
338+
fileContent += fmt.Sprintf("FROM %s\n\n", baseImage)
339339

340340
// LABEL
341341
fileContent += fmt.Sprintf("LABEL %s=%s\n", MediatypeLabel, mediaType)

pkg/lib/bundle/generate_test.go

+16-5
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ func TestGenerateAnnotationsFunc(t *testing.T) {
163163
}
164164

165165
func TestGenerateDockerfile(t *testing.T) {
166-
expected := `FROM scratch
166+
expected := `FROM %s
167167
168168
LABEL operators.operatorframework.io.bundle.mediatype.v1=test1
169169
LABEL operators.operatorframework.io.bundle.manifests.v1=test2
@@ -174,9 +174,20 @@ COPY a/b/c /manifests/
174174
COPY x/y/z /metadata/
175175
`
176176

177-
actual, err := GenerateDockerfile("test1", "test2", "metadata/", filepath.Join("a", "b", "c"), filepath.Join("x", "y", "z"), "./", "test4", "test5", "")
178-
require.NoError(t, err)
179-
require.Equal(t, expected, string(actual))
177+
type DockerfileTest struct {
178+
baseImage string
179+
}
180+
tests := []DockerfileTest{
181+
{baseImage: "scratch"},
182+
{baseImage: "registry/group/image@tag"},
183+
}
184+
185+
for _, tt := range tests {
186+
tt_expected := fmt.Sprintf(expected, tt.baseImage)
187+
actual, err := GenerateDockerfile("test1", "test2", "metadata/", filepath.Join("a", "b", "c"), filepath.Join("x", "y", "z"), "./", "test4", "test5", "", tt.baseImage)
188+
require.NoError(t, err)
189+
require.Equal(t, tt_expected, string(actual))
190+
}
180191
}
181192

182193
func TestCopyYamlOutput(t *testing.T) {
@@ -248,7 +259,7 @@ func TestGenerateFunc(t *testing.T) {
248259
etcdPkgPath := "./testdata/etcd"
249260
outputPath := "./testdata/tmp_output"
250261
defer os.RemoveAll(outputPath)
251-
err := GenerateFunc(filepath.Join(etcdPkgPath, "0.6.1"), outputPath, "", "", "", true)
262+
err := GenerateFunc(filepath.Join(etcdPkgPath, "0.6.1"), outputPath, "", "", "", true, "scratch")
252263
require.NoError(t, err)
253264
os.Remove(filepath.Join("./", DockerFile))
254265

0 commit comments

Comments
 (0)