Skip to content

Commit 1df4c11

Browse files
committed
add mergeYaml
1 parent 143ced7 commit 1df4c11

File tree

4 files changed

+103
-3
lines changed

4 files changed

+103
-3
lines changed

Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
FROM scratch
1+
FROM busybox:glibc
22

33
COPY docker-sync /
4+
COPY entrypoint.sh /
5+
6+
RUN chmod +x /docker-sync
7+
RUN chmod +x /entrypoint.sh
48

59
EXPOSE 9090
610

7-
ENTRYPOINT ["/docker-sync"]
11+
ENTRYPOINT ["/entrypoint.sh"]

cmd/dockersync/cmd/mergeYaml.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"time"
7+
8+
"github.com/spf13/cobra"
9+
"gopkg.in/yaml.v3"
10+
)
11+
12+
var yamlFiles []string
13+
14+
// mergeYamlCmd represents the mergeYaml command
15+
var mergeYamlCmd = &cobra.Command{
16+
Use: "mergeYaml",
17+
Short: "Merge two yaml files",
18+
PreRun: func(cmd *cobra.Command, args []string) {
19+
cmd.Annotations = make(map[string]string)
20+
cmd.Annotations["error"] = ""
21+
},
22+
Run: func(cmd *cobra.Command, args []string) {
23+
outFile := cmd.Flag("output").Value.String()
24+
25+
base := make(map[string]interface{})
26+
currentMap := make(map[string]interface{})
27+
28+
for _, fname := range yamlFiles {
29+
data, err := os.ReadFile(fname)
30+
if err != nil {
31+
cmd.Annotations["error"] = err.Error()
32+
return
33+
}
34+
if err := yaml.Unmarshal(data, &currentMap); err != nil {
35+
cmd.Annotations["error"] = err.Error()
36+
return
37+
}
38+
base = mergeMaps(base, currentMap)
39+
}
40+
41+
config, err := yaml.Marshal(base)
42+
if err != nil {
43+
cmd.Annotations["error"] = err.Error()
44+
return
45+
}
46+
47+
if outFile == "" {
48+
fmt.Println(string(config))
49+
} else {
50+
if err := os.WriteFile(outFile, config, 0644); err != nil {
51+
cmd.Annotations["error"] = err.Error()
52+
return
53+
}
54+
}
55+
},
56+
PostRun: func(cmd *cobra.Command, args []string) {
57+
// Wait for a second to allow for any pending log messages to be flushed
58+
time.Sleep(1 * time.Second)
59+
if cmd.Annotations["error"] != "" {
60+
os.Exit(1)
61+
}
62+
},
63+
}
64+
65+
func init() {
66+
rootCmd.AddCommand(mergeYamlCmd)
67+
68+
mergeYamlCmd.Flags().StringP("output", "o", "", "File to write config to (default is stdout)")
69+
mergeYamlCmd.Flags().StringSliceVarP(&yamlFiles, "yamlFiles", "f", []string{}, "Yaml files to merge")
70+
}
71+
72+
func mergeMaps(a, b map[string]interface{}) map[string]interface{} {
73+
out := make(map[string]interface{}, len(a))
74+
for k, v := range a {
75+
out[k] = v
76+
}
77+
for k, v := range b {
78+
if v, ok := v.(map[string]interface{}); ok {
79+
if bv, ok := out[k]; ok {
80+
if bv, ok := bv.(map[string]interface{}); ok {
81+
out[k] = mergeMaps(bv, v)
82+
continue
83+
}
84+
}
85+
}
86+
out[k] = v
87+
}
88+
return out
89+
}

cmd/dockersync/cmd/writeConfig.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ var writeConfigCmd = &cobra.Command{
1616
outFile := cmd.Flag("output").Value.String()
1717

1818
if outFile == "" {
19-
2019
settings := viper.AllSettings()
2120
yamlSettings, err := yaml.Marshal(settings)
2221
if err != nil {

entrypoint.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/sh
2+
3+
# check if /config.yaml exists
4+
if [ ! -f /config.yaml ]; then
5+
/docker-sync mergeYaml -o /config.yaml -f /config_map.yaml -f /secret.yaml
6+
fi
7+
8+
/docker-sync "$@"

0 commit comments

Comments
 (0)