Skip to content

Commit 17d4bc8

Browse files
authored
fix: Allow to use the COMPOSE_FILE variable in finch compose (runfinch#994)
nerdctl allows us to launch containers using a Docker Compose file specified in the COMPOSE_FILE environment variable. For example, suppose we have created the following Docker Compose file. ``` > cat a.yaml services: test: image: amazonlinux:2023 ``` By specifying this Docker Compose file in the COMPOSE_FILE environment variable and running nerdctl compose up, we can start the container. ``` > sudo COMPOSE_FILE=a.yaml _output/nerdctl compose up INFO[0000] Ensuring image amazonlinux:2023 INFO[0000] Re-creating container nerdctl-test-1 INFO[0000] Attaching to logs INFO[0000] Container "nerdctl-test-1" exited INFO[0000] All the containers have exited INFO[0000] Stopping containers (forcibly) INFO[0000] Stopping container nerdctl-test-1 ``` However, since the COMPOSE_FILE environment variable is not passed in finch compose, the following error occurs. ``` > COMPOSE_FILE=a.yaml finch compose up FATA[0000] no configuration file provided: not found FATA[0000] exit status 1 ``` And this bug is reported in the following issue. - runfinch#347 Therefore, this fix allows the finch compose command to use the Docker Compose file specified in the COMPOSE_FILE environment variable. Issue #, if available: runfinch#347 *Description of changes:* The details are described in this commit message. *Testing done:* Yes - [x] I've reviewed the guidance in CONTRIBUTING.md #### License Acceptance By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Signed-off-by: Hayato Kiwata <[email protected]>
1 parent 9d85f25 commit 17d4bc8

File tree

6 files changed

+75
-6
lines changed

6 files changed

+75
-6
lines changed

Diff for: cmd/finch/nerdctl.go

+12-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"encoding/json"
99
"fmt"
1010
"path/filepath"
11+
"runtime"
1112
"strings"
1213

1314
"golang.org/x/exp/slices"
@@ -234,15 +235,23 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error {
234235

235236
passedEnvs := []string{
236237
"COSIGN_PASSWORD", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY",
237-
"AWS_SESSION_TOKEN",
238+
"AWS_SESSION_TOKEN", "COMPOSE_FILE",
238239
}
239240

240241
var passedEnvArgs []string
241242
for _, e := range passedEnvs {
242243
v, b := nc.systemDeps.LookupEnv(e)
243-
if b {
244-
passedEnvArgs = append(passedEnvArgs, fmt.Sprintf("%s=%s", e, v))
244+
if !b {
245+
continue
246+
}
247+
if runtime.GOOS == "windows" && e == "COMPOSE_FILE" {
248+
wslPath, err := convertToWSLPath(nc.systemDeps, v)
249+
if err != nil {
250+
return err
251+
}
252+
v = wslPath
245253
}
254+
passedEnvArgs = append(passedEnvArgs, fmt.Sprintf("%s=%s", e, v))
246255
}
247256

248257
var additionalEnv []string

Diff for: cmd/finch/nerdctl_darwin.go

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ import (
1616
"github.com/runfinch/finch/pkg/flog"
1717
)
1818

19+
func convertToWSLPath(_ NerdctlCommandSystemDeps, _ string) (string, error) {
20+
return "", nil
21+
}
22+
1923
var aliasMap = map[string]string{}
2024

2125
var argHandlerMap = map[string]map[string]argHandler{}

Diff for: cmd/finch/nerdctl_darwin_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func TestNerdctlCommand_runAdaptor(t *testing.T) {
4848
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
4949
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
5050
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
51+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
5152
c := mocks.NewCommand(ctrl)
5253
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "info").Return(c)
5354
c.EXPECT().Run()
@@ -114,6 +115,7 @@ func TestNerdctlCommand_run(t *testing.T) {
114115
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
115116
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
116117
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
118+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
117119
c := mocks.NewCommand(ctrl)
118120
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "build", "-t", "demo", ".").Return(c)
119121
c.EXPECT().Run()
@@ -143,6 +145,7 @@ func TestNerdctlCommand_run(t *testing.T) {
143145
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
144146
logger.EXPECT().SetLevel(flog.Debug)
145147
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
148+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
146149
c := mocks.NewCommand(ctrl)
147150
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "pull", "test:tag").Return(c)
148151
c.EXPECT().Run()
@@ -174,6 +177,7 @@ func TestNerdctlCommand_run(t *testing.T) {
174177
ncsd.EXPECT().LookupEnv("ARG2")
175178
ncsd.EXPECT().LookupEnv("ARG3")
176179
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
180+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
177181

178182
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
179183
"--rm", "-e", "ARG1=val1", "alpine:latest", "env").Return(c)
@@ -206,6 +210,7 @@ func TestNerdctlCommand_run(t *testing.T) {
206210
ncsd.EXPECT().LookupEnv("ARG2")
207211
ncsd.EXPECT().LookupEnv("ARG3").Return("val3", true)
208212
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
213+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
209214
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
210215
"--rm", "-e", "ARG3=val3", "alpine:latest", "env").Return(c)
211216
c.EXPECT().Run()
@@ -238,6 +243,7 @@ func TestNerdctlCommand_run(t *testing.T) {
238243
ncsd.EXPECT().LookupEnv("ARG2")
239244
ncsd.EXPECT().LookupEnv("ARG3").Return("val3", true)
240245
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
246+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
241247
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
242248
"--rm", "-e", "ARG3=val3", "alpine:latest", "env").Return(c)
243249
c.EXPECT().Run()
@@ -272,6 +278,7 @@ func TestNerdctlCommand_run(t *testing.T) {
272278
ncsd.EXPECT().LookupEnv("ARG2")
273279
ncsd.EXPECT().LookupEnv("NOTSETARG")
274280
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
281+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
275282
lcc.EXPECT().
276283
Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run", "--rm", "-e", "ARG1=val1", "alpine:latest", "env").
277284
Return(c)
@@ -308,6 +315,7 @@ func TestNerdctlCommand_run(t *testing.T) {
308315
ncsd.EXPECT().LookupEnv("ARG2")
309316
ncsd.EXPECT().LookupEnv("NOTSETARG")
310317
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
318+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
311319
lcc.EXPECT().
312320
Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run", "--rm", "-e", "ARG1=val1", "alpine:latest", "env").
313321
Return(c)
@@ -343,6 +351,7 @@ func TestNerdctlCommand_run(t *testing.T) {
343351
ncsd.EXPECT().LookupEnv("ARG2").Return("val2", true)
344352
ncsd.EXPECT().LookupEnv("NOTSETARG")
345353
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
354+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
346355
lcc.EXPECT().
347356
Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run", "--rm", "-e", "ARG2=val2", "alpine:latest", "env").
348357
Return(c)
@@ -393,6 +402,7 @@ func TestNerdctlCommand_run(t *testing.T) {
393402
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
394403
logger.EXPECT().Debugf(`Resolving special IP "host-gateway" to %q for host %q`, "192.168.5.2", "name")
395404
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
405+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
396406
c := mocks.NewCommand(ctrl)
397407
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
398408
"--rm", "--add-host", "name:192.168.5.2", "alpine:latest").Return(c)
@@ -422,6 +432,7 @@ func TestNerdctlCommand_run(t *testing.T) {
422432
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
423433
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
424434
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
435+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
425436
c := mocks.NewCommand(ctrl)
426437
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
427438
"--rm", "--add-host", "name:0.0.0.0", "alpine:latest").Return(c)
@@ -451,6 +462,7 @@ func TestNerdctlCommand_run(t *testing.T) {
451462
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
452463
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
453464
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
465+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
454466
c := mocks.NewCommand(ctrl)
455467
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
456468
"--rm", "--add-host", "alpine:latest").Return(c)
@@ -481,6 +493,7 @@ func TestNerdctlCommand_run(t *testing.T) {
481493
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
482494
logger.EXPECT().Debugf(`Resolving special IP "host-gateway" to %q for host %q`, "192.168.5.2", "name")
483495
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
496+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
484497
c := mocks.NewCommand(ctrl)
485498
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
486499
"--rm", "--add-host=name:192.168.5.2", "alpine:latest").Return(c)
@@ -510,6 +523,7 @@ func TestNerdctlCommand_run(t *testing.T) {
510523
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
511524
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
512525
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
526+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
513527

514528
c := mocks.NewCommand(ctrl)
515529
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
@@ -543,6 +557,7 @@ func TestNerdctlCommand_run(t *testing.T) {
543557
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
544558
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
545559
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
560+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
546561
c := mocks.NewCommand(ctrl)
547562
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "run",
548563
"--rm", "-v", "/tmp:/tmp1/tmp2:rro", "--volume", "/tmp:/tmp1:rprivate,rro", "-v=/tmp:/tmp1/tmp2/tmp3/tmp4:rro",
@@ -576,6 +591,7 @@ func TestNerdctlCommand_run(t *testing.T) {
576591
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
577592
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
578593
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
594+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
579595
c := mocks.NewCommand(ctrl)
580596
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "container", "run",
581597
"--rm", "-v", "/tmp:/tmp1/tmp2:rro", "--volume", "/tmp:/tmp1:rprivate,rro",
@@ -606,6 +622,7 @@ func TestNerdctlCommand_run(t *testing.T) {
606622
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
607623
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
608624
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
625+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
609626
lcc.EXPECT().RunWithReplacingStdout(
610627
testStdoutRs, "shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "pull", "test:tag", "--help").Return(nil)
611628
},
@@ -633,6 +650,7 @@ func TestNerdctlCommand_run(t *testing.T) {
633650
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
634651
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
635652
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
653+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
636654
lcc.EXPECT().RunWithReplacingStdout(
637655
testStdoutRs, "shell", limaInstanceName, "sudo", "-E", nerdctlCmdName, "pull", "test:tag", "--help").
638656
Return(fmt.Errorf("failed to replace"))
@@ -661,6 +679,7 @@ func TestNerdctlCommand_run(t *testing.T) {
661679
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
662680
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
663681
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("test", true)
682+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
664683
c := mocks.NewCommand(ctrl)
665684
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", "COSIGN_PASSWORD=test", nerdctlCmdName,
666685
"push", "--sign=cosign", "test:tag").Return(c)
@@ -690,6 +709,7 @@ func TestNerdctlCommand_run(t *testing.T) {
690709
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
691710
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
692711
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("test", true)
712+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
693713
c := mocks.NewCommand(ctrl)
694714
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", "COSIGN_PASSWORD=test", nerdctlCmdName,
695715
"pull", "--verify=cosign", "test:tag").Return(c)
@@ -719,6 +739,7 @@ func TestNerdctlCommand_run(t *testing.T) {
719739
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("", false)
720740
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("", false)
721741
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("test", true)
742+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
722743
c := mocks.NewCommand(ctrl)
723744
lcc.EXPECT().Create("shell", limaInstanceName, "sudo", "-E", "COSIGN_PASSWORD=test",
724745
nerdctlCmdName, "pull", "test:tag").Return(c)
@@ -750,6 +771,7 @@ func TestNerdctlCommand_run(t *testing.T) {
750771
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("TEST_SECRET_ACCESS_KEY", true)
751772
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("TEST_SESSION_TOKEN", true)
752773
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
774+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
753775

754776
awsCmd := mocks.NewCommand(ctrl)
755777
ecc.EXPECT().Create(
@@ -809,6 +831,7 @@ func TestNerdctlCommand_run(t *testing.T) {
809831
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("TEST_SECRET_ACCESS_KEY", false)
810832
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("TEST_SESSION_TOKEN", false)
811833
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
834+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
812835

813836
awsCmd := mocks.NewCommand(ctrl)
814837
ecc.EXPECT().Create(
@@ -865,6 +888,7 @@ func TestNerdctlCommand_run(t *testing.T) {
865888
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("TEST_SECRET_ACCESS_KEY", true)
866889
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("TEST_SESSION_TOKEN", true)
867890
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
891+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
868892

869893
awsCmd := mocks.NewCommand(ctrl)
870894
ecc.EXPECT().Create(
@@ -917,6 +941,7 @@ func TestNerdctlCommand_run(t *testing.T) {
917941
ncsd.EXPECT().LookupEnv("AWS_SECRET_ACCESS_KEY").Return("TEST_SECRET_ACCESS_KEY", true)
918942
ncsd.EXPECT().LookupEnv("AWS_SESSION_TOKEN").Return("TEST_SESSION_TOKEN", true)
919943
ncsd.EXPECT().LookupEnv("COSIGN_PASSWORD").Return("", false)
944+
ncsd.EXPECT().LookupEnv("COMPOSE_FILE").Return("", false)
920945

921946
awsCmd := mocks.NewCommand(ctrl)
922947
ecc.EXPECT().Create(

0 commit comments

Comments
 (0)