-
Notifications
You must be signed in to change notification settings - Fork 230
/
eject.go
104 lines (90 loc) · 2.28 KB
/
eject.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package main
import (
"context"
"fmt"
"os"
"os/signal"
"runtime"
"github.com/spf13/cobra"
daemonpb "encr.dev/proto/encore/daemon"
)
func init() {
ejectCmd := &cobra.Command{
Use: "eject",
Short: "eject provides ways to eject your application to migrate away from using Encore",
}
p := ejectParams{
CgoEnabled: os.Getenv("CGO_ENABLED") == "1",
Goos: or(os.Getenv("GOOS"), "linux"),
Goarch: or(os.Getenv("GOARCH"), runtime.GOARCH),
}
dockerEjectCmd := &cobra.Command{
Use: "docker IMAGE_TAG",
Short: "docker builds a portable docker image of your Encore application",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
p.AppRoot, _ = determineAppRoot()
p.ImageTag = args[0]
dockerEject(p)
},
}
dockerEjectCmd.Flags().BoolVarP(&p.Push, "push", "p", false, "push image to remote repository")
dockerEjectCmd.Flags().StringVar(&p.BaseImg, "base", "scratch", "base image to build from")
rootCmd.AddCommand(ejectCmd)
ejectCmd.AddCommand(dockerEjectCmd)
}
type ejectParams struct {
AppRoot string
ImageTag string
Push bool
BaseImg string
Goos string
Goarch string
CgoEnabled bool
}
func dockerEject(p ejectParams) {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
ctx, cancel := context.WithCancel(context.Background())
go func() {
<-interrupt
cancel()
}()
daemon := setupDaemon(ctx)
params := &daemonpb.DockerExportParams{
BaseImageTag: p.BaseImg,
}
if p.Push {
params.PushDestinationTag = p.ImageTag
} else {
params.LocalDaemonTag = p.ImageTag
}
stream, err := daemon.Export(ctx, &daemonpb.ExportRequest{
AppRoot: p.AppRoot,
CgoEnabled: p.CgoEnabled,
Goos: p.Goos,
Goarch: p.Goarch,
Environ: os.Environ(),
Format: &daemonpb.ExportRequest_Docker{
Docker: params,
},
})
if err != nil {
fmt.Fprintln(os.Stderr, "fatal: ", err)
os.Exit(1)
}
if code := streamCommandOutput(stream, convertJSONLogs()); code != 0 {
os.Exit(code)
}
fmt.Print(`
Successfully ejected Encore application.
To run the container, specify the environment variables ENCORE_RUNTIME_CONFIG and ENCORE_APP_SECRETS
as documented here: https://encore.dev/docs/how-to/migrate-away.
`)
}
func or(a, b string) string {
if a != "" {
return a
}
return b
}