Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit ec9d985

Browse files
Merge pull request #434 from simonferquel/image-map-support
Image map support
2 parents dcbc2dd + f6142ba commit ec9d985

21 files changed

Lines changed: 188 additions & 58 deletions

File tree

Gopkg.lock

Lines changed: 8 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,9 @@ required = ["github.com/wadey/gocovmerge"]
3131
name = "github.com/docker/cli"
3232
revision = "f95ca8e1ba6c22c9abcdbf65e8dcc39c53958bba"
3333

34-
# Waiting for https://github.com/deislabs/duffle/pull/617 to be merged
3534
[[override]]
3635
name = "github.com/deislabs/duffle"
37-
branch = "master-docker-app"
38-
source = "github.com/silvin-lubecki/duffle"
36+
branch = "master"
3937

4038
[[constraint]]
4139
name = "github.com/sirupsen/logrus"

cmd/cnab-run/install.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package main
22

33
import (
4+
"encoding/json"
5+
"io/ioutil"
46
"os"
57

8+
"github.com/deislabs/duffle/pkg/bundle"
69
"github.com/docker/app/internal/packager"
710
"github.com/docker/app/render"
811
"github.com/docker/cli/cli/command"
@@ -13,6 +16,12 @@ import (
1316
"github.com/spf13/pflag"
1417
)
1518

19+
const (
20+
// imageMapFilePath is the path where the CNAB runtime will put the actual
21+
// service to image mapping to use
22+
imageMapFilePath = "/cnab/app/image-map.json"
23+
)
24+
1625
func install(instanceName string) error {
1726
cli, err := setupDockerContext()
1827
if err != nil {
@@ -30,8 +39,12 @@ func install(instanceName string) error {
3039
if err != nil {
3140
return err
3241
}
42+
imageMap, err := getBundleImageMap()
43+
if err != nil {
44+
return err
45+
}
3346
parameters := packager.ExtractCNABParametersValues(packager.ExtractCNABParameterMapping(app.Parameters()), os.Environ())
34-
rendered, err := render.Render(app, parameters)
47+
rendered, err := render.Render(app, parameters, imageMap)
3548
if err != nil {
3649
return err
3750
}
@@ -53,3 +66,15 @@ func getFlagset(orchestrator command.Orchestrator) *pflag.FlagSet {
5366
}
5467
return result
5568
}
69+
70+
func getBundleImageMap() (map[string]bundle.Image, error) {
71+
mapJSON, err := ioutil.ReadFile(imageMapFilePath)
72+
if err != nil {
73+
return nil, err
74+
}
75+
var result map[string]bundle.Image
76+
if err := json.Unmarshal(mapJSON, &result); err != nil {
77+
return nil, err
78+
}
79+
return result, nil
80+
}

cmd/docker-app/bundle.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func makeBundleFromApp(dockerCli command.Cli, app *types.App, namespace, invocat
9999
if err := jsonmessage.DisplayJSONMessagesStream(buildResp.Body, ioutil.Discard, 0, false, func(jsonmessage.JSONMessage) {}); err != nil {
100100
return nil, err
101101
}
102-
return packager.ToCNAB(app, invocationImageName), nil
102+
return packager.ToCNAB(app, invocationImageName)
103103
}
104104

105105
func makeImageName(meta metadata.AppMetadata, namespace, name, suffix string) (string, error) {

cmd/docker-app/inspect.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func inspectCmd(dockerCli command.Cli) *cobra.Command {
2929
}
3030
defer app.Cleanup()
3131
argParameters := cliopts.ConvertKVStringsToMap(inspectEnv)
32-
return inspect.Inspect(dockerCli.Out(), app, argParameters)
32+
return inspect.Inspect(dockerCli.Out(), app, argParameters, nil)
3333
},
3434
}
3535
cmd.Flags().StringArrayVarP(&inspectParametersFile, "parameters-files", "f", []string{}, "Override with parameters from files")

cmd/docker-app/render.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func renderCmd(dockerCli command.Cli) *cobra.Command {
3939
}
4040
defer app.Cleanup()
4141
d := cliopts.ConvertKVStringsToMap(renderEnv)
42-
rendered, err := render.Render(app, d)
42+
rendered, err := render.Render(app, d, nil)
4343
if err != nil {
4444
return err
4545
}

cmd/docker-app/validate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func validateCmd() *cobra.Command {
2828
}
2929
defer app.Cleanup()
3030
argParameters := cliopts.ConvertKVStringsToMap(validateEnv)
31-
_, err = render.Render(app, argParameters)
31+
_, err = render.Render(app, argParameters, nil)
3232
return err
3333
},
3434
}

examples_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ func Example() {
1818
defer f.Close()
1919
app, err := loader.LoadFromSingleFile("myApp", f)
2020
if err != nil {
21-
panic("cannot load application")
21+
panic("cannot load application: " + err.Error())
2222
}
2323
// Render the app to a composefile format, using some user provided parameters
2424
c, err := render.Render(app, map[string]string{
2525
"text": "hello examples!",
26-
})
26+
}, nil)
2727
if err != nil {
2828
panic("cannot render application")
2929
}

internal/compose/compose.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,29 +26,32 @@ var (
2626
)
2727

2828
// Load applies the specified function when loading a slice of compose data
29-
func Load(composes [][]byte, apply func(string) (string, error)) ([]composetypes.ConfigFile, error) {
29+
func Load(composes [][]byte, apply func(string) (string, error)) ([]composetypes.ConfigFile, map[string]string, error) {
3030
configFiles := []composetypes.ConfigFile{}
3131
for _, data := range composes {
3232
s, err := apply(string(data))
3333
if err != nil {
34-
return nil, err
34+
return nil, nil, err
3535
}
3636
parsed, err := loader.ParseYAML([]byte(s))
3737
if err != nil {
38-
return nil, errors.Wrapf(err, "failed to parse Compose file %s", data)
38+
return nil, nil, errors.Wrapf(err, "failed to parse Compose file %s", data)
3939
}
4040
configFiles = append(configFiles, composetypes.ConfigFile{Config: parsed})
4141
}
4242

43-
if err := validateImageInConfigFiles(configFiles); err != nil {
44-
return nil, err
43+
images, err := validateImagesInConfigFiles(configFiles)
44+
if err != nil {
45+
return nil, nil, err
4546
}
4647

47-
return configFiles, nil
48+
return configFiles, images, nil
4849
}
4950

50-
func validateImageInConfigFiles(configFiles []composetypes.ConfigFile) error {
51+
// validateImagesInConfigFiles validates that there is no unsupported variable expensions in service images and returns a map of service name -> image
52+
func validateImagesInConfigFiles(configFiles []composetypes.ConfigFile) (map[string]string, error) {
5153
var errors []string
54+
images := map[string]string{}
5255
for _, configFile := range configFiles {
5356
services, ok := configFile.Config["services"].(map[string]interface{})
5457
if !ok {
@@ -63,6 +66,7 @@ func validateImageInConfigFiles(configFiles []composetypes.ConfigFile) error {
6366
if !ok {
6467
continue
6568
}
69+
images[serviceName] = imageName
6670

6771
if ExtrapolationPattern.MatchString(imageName) {
6872
errors = append(errors,
@@ -73,10 +77,10 @@ func validateImageInConfigFiles(configFiles []composetypes.ConfigFile) error {
7377
}
7478

7579
if len(errors) > 0 {
76-
return fmt.Errorf("%s", strings.Join(errors, "\n"))
80+
return nil, fmt.Errorf("%s", strings.Join(errors, "\n"))
7781
}
7882

79-
return nil
83+
return images, nil
8084
}
8185

8286
// ExtractVariables extracts the variables from the specified compose data

internal/compose/compose_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ services:
5454
}
5555

5656
func runLoad(composeFile []byte) ([]composetypes.ConfigFile, error) {
57-
return Load([][]byte{composeFile}, func(data string) (string, error) {
57+
files, _, err := Load([][]byte{composeFile}, func(data string) (string, error) {
5858
return renderer.Apply(data, map[string]interface{}{"image": "nginx"})
5959
})
60+
return files, err
6061
}

0 commit comments

Comments
 (0)