Skip to content

Commit 4d518cd

Browse files
committed
feat: run a simple command
Run a very simple command, with no user configuration docker runx yvesbrissaud/docker-runx-dev:alpine-2 hello Signed-off-by: Yves Brissaud <[email protected]>
1 parent 83b59da commit 4d518cd

File tree

5 files changed

+108
-10
lines changed

5 files changed

+108
-10
lines changed

docs/reference/docker_runx.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
command: docker runx
22
short: Docker Run, better
33
long: Docker Run, better
4-
usage: docker runx [IMAGE]
4+
usage: docker runx [IMAGE] [ACTION]
55
pname: docker
66
plink: docker.yaml
77
cname:

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ require (
1010
github.com/spf13/cobra v1.8.1
1111
github.com/spf13/pflag v1.0.5
1212
gopkg.in/yaml.v2 v2.4.0
13+
mvdan.cc/sh/v3 v3.9.0
1314
)
1415

1516
require (
@@ -49,6 +50,7 @@ require (
4950
github.com/moby/sys/sequential v0.6.0 // indirect
5051
github.com/moby/term v0.5.0 // indirect
5152
github.com/morikuni/aec v1.0.0 // indirect
53+
github.com/muesli/cancelreader v0.2.2 // indirect
5254
github.com/opencontainers/go-digest v1.0.0 // indirect
5355
github.com/opencontainers/image-spec v1.1.0 // indirect
5456
github.com/pkg/errors v0.9.1 // indirect

go.sum

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t
4444
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
4545
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
4646
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
47-
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
48-
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
47+
github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0=
48+
github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
4949
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5050
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5151
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -94,6 +94,8 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
9494
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
9595
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
9696
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
97+
github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
98+
github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=
9799
github.com/go-sql-driver/mysql v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE=
98100
github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
99101
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -193,6 +195,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
193195
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
194196
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
195197
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
198+
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
199+
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
196200
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
197201
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
198202
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
@@ -236,8 +240,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
236240
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
237241
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
238242
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
239-
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
240-
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
243+
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
244+
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
241245
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
242246
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
243247
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
@@ -427,3 +431,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
427431
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
428432
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
429433
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
434+
mvdan.cc/sh/v3 v3.9.0 h1:it14fyjCdQUk4jf/aYxLO3FG8jFarR9GzMCtnlvvD7c=
435+
mvdan.cc/sh/v3 v3.9.0/go.mod h1:cdBk8bgoiBI7lSZqK5JhUuq7OB64VQ7fgm85xelw3Nk=

internal/commands/root/root.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55

66
"github.com/spf13/cobra"
7-
"gopkg.in/yaml.v2"
87

98
"github.com/docker/cli/cli"
109
"github.com/docker/cli/cli-plugins/plugin"
@@ -20,21 +19,31 @@ func NewCmd(dockerCli command.Cli, isPlugin bool) *cobra.Command {
2019
var (
2120
name = commandName(isPlugin)
2221
cmd = &cobra.Command{
23-
Use: fmt.Sprintf("%s [IMAGE]", name),
22+
Use: fmt.Sprintf("%s [IMAGE] [ACTION]", name),
2423
Short: "Docker Run, better",
2524
RunE: func(cmd *cobra.Command, args []string) error {
26-
if len(args) == 0 {
25+
if len(args) == 0 || len(args) != 2 {
2726
return cmd.Help()
2827
}
2928

30-
src := args[0]
29+
var (
30+
src = args[0]
31+
action = args[1]
32+
)
3133

3234
actions, err := runkit.Get(cmd.Context(), src)
3335
if err != nil {
3436
return err
3537
}
3638

37-
return yaml.NewEncoder(cmd.OutOrStdout()).Encode(actions)
39+
runnable, err := actions.GetRunnable(action)
40+
if err != nil {
41+
return err
42+
}
43+
44+
_, _ = fmt.Fprintf(dockerCli.Out(), "\nRunning the following command:\n$ %s\n\n", runnable)
45+
46+
return runnable.Run(cmd.Context())
3847
},
3948
}
4049
)

runkit/run.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package runkit
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"strings"
8+
"text/template"
9+
10+
"mvdan.cc/sh/v3/expand"
11+
"mvdan.cc/sh/v3/interp"
12+
"mvdan.cc/sh/v3/syntax"
13+
)
14+
15+
type (
16+
Runnable struct {
17+
Command string
18+
Args string
19+
}
20+
21+
TemplateData struct {
22+
Ref string
23+
}
24+
)
25+
26+
func GetRunnable(actions *RunKit, action string) (*Runnable, error) {
27+
return actions.GetRunnable(action)
28+
}
29+
30+
func (actions *RunKit) GetRunnable(action string) (*Runnable, error) {
31+
for _, a := range actions.Actions {
32+
if a.ID == action {
33+
return a.GetRunnable(actions.src)
34+
}
35+
}
36+
37+
return nil, fmt.Errorf("action %s not found", action)
38+
}
39+
40+
func (action Action) GetRunnable(ref string) (*Runnable, error) {
41+
if action.Type != ActionTypeRun {
42+
return nil, fmt.Errorf("unsupported action type %s", action.Type)
43+
}
44+
45+
runnable := Runnable{
46+
Command: "docker run",
47+
}
48+
49+
tmpl, err := template.New(action.ID).Parse(action.Command)
50+
if err != nil {
51+
return nil, err
52+
}
53+
54+
out := strings.Builder{}
55+
err = tmpl.Execute(&out, TemplateData{
56+
Ref: ref,
57+
})
58+
if err != nil {
59+
return nil, err
60+
}
61+
runnable.Args = out.String()
62+
63+
return &runnable, nil
64+
}
65+
66+
func (r Runnable) String() string {
67+
return fmt.Sprintf("%s %s", r.Command, r.Args)
68+
}
69+
70+
func (r Runnable) Run(ctx context.Context) error {
71+
parsedCmd, err := syntax.NewParser().Parse(strings.NewReader(r.String()), "")
72+
if err != nil {
73+
return err
74+
}
75+
76+
runner, err := interp.New(interp.Env(expand.ListEnviron(os.Environ()...)), interp.StdIO(os.Stdin, os.Stdout, os.Stderr))
77+
if err != nil {
78+
return err
79+
}
80+
return runner.Run(ctx, parsedCmd)
81+
}

0 commit comments

Comments
 (0)