Skip to content

Commit 4ab556c

Browse files
committed
COMPOSE_DISABLE_ENV_FILE allows to disable use of default .env file
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent 06ab843 commit 4ab556c

File tree

6 files changed

+52
-29
lines changed

6 files changed

+52
-29
lines changed

cli/options.go

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"io"
2222
"os"
2323
"path/filepath"
24+
"strconv"
2425
"strings"
2526

2627
"github.com/pkg/errors"
@@ -248,21 +249,44 @@ func WithEnvFile(file string) ProjectOptionsFn {
248249
return WithEnvFiles(files...)
249250
}
250251

251-
// WithEnvFiles set alternate env files
252+
// WithEnvFiles set env file(s) to be loaded to set project environment.
253+
// defaults to local .env file if no explicit file is selected, until COMPOSE_DISABLE_ENV_FILE is set
252254
func WithEnvFiles(file ...string) ProjectOptionsFn {
253-
return func(options *ProjectOptions) error {
254-
options.EnvFiles = file
255+
return func(o *ProjectOptions) error {
256+
if len(file) > 0 {
257+
o.EnvFiles = file
258+
return nil
259+
}
260+
if v, ok := os.LookupEnv(consts.ComposeDisableDefaultEnvFile); ok {
261+
b, err := strconv.ParseBool(v)
262+
if err != nil {
263+
return err
264+
}
265+
if b {
266+
return nil
267+
}
268+
}
269+
270+
wd, err := o.GetWorkingDir()
271+
if err != nil {
272+
return err
273+
}
274+
defaultDotEnv := filepath.Join(wd, ".env")
275+
276+
s, err := os.Stat(defaultDotEnv)
277+
if os.IsNotExist(err) {
278+
return nil
279+
}
280+
if !s.IsDir() {
281+
o.EnvFiles = []string{defaultDotEnv}
282+
}
255283
return nil
256284
}
257285
}
258286

259287
// WithDotEnv imports environment variables from .env file
260288
func WithDotEnv(o *ProjectOptions) error {
261-
wd, err := o.GetWorkingDir()
262-
if err != nil {
263-
return err
264-
}
265-
envMap, err := dotenv.GetEnvFromFile(o.Environment, wd, o.EnvFiles)
289+
envMap, err := dotenv.GetEnvFromFile(o.Environment, o.EnvFiles)
266290
if err != nil {
267291
return err
268292
}

cli/options_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ func TestProjectName(t *testing.T) {
182182
assert.NilError(t, err)
183183
defer os.Chdir(wd) //nolint:errcheck
184184

185-
opts, err := NewProjectOptions(nil, WithDotEnv, WithConfigFileEnv)
185+
opts, err := NewProjectOptions(nil, WithEnvFiles(), WithDotEnv, WithConfigFileEnv)
186186
assert.NilError(t, err)
187187
p, err := ProjectFromOptions(opts)
188188
assert.NilError(t, err)
@@ -250,7 +250,7 @@ func TestProjectWithDotEnv(t *testing.T) {
250250

251251
opts, err := NewProjectOptions([]string{
252252
"compose-with-variables.yaml",
253-
}, WithName("my_project"), WithDotEnv)
253+
}, WithName("my_project"), WithEnvFiles(), WithDotEnv)
254254
assert.NilError(t, err)
255255
p, err := ProjectFromOptions(opts)
256256
assert.NilError(t, err)
@@ -346,7 +346,7 @@ func TestEnvVariablePrecedence(t *testing.T) {
346346
// First load os.Env variable, higher in precedence rule
347347
WithEnv(test.osEnv),
348348
// Then load dotEnv file
349-
WithWorkingDirectory(wd), WithDotEnv)
349+
WithWorkingDirectory(wd), WithEnvFiles(), WithDotEnv)
350350
assert.NilError(t, err)
351351
assert.DeepEqual(t, test.expected, options.Environment)
352352
})

consts/consts.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
package consts
1818

1919
const (
20-
ComposeProjectName = "COMPOSE_PROJECT_NAME"
21-
ComposePathSeparator = "COMPOSE_PATH_SEPARATOR"
22-
ComposeFilePath = "COMPOSE_FILE"
23-
ComposeProfiles = "COMPOSE_PROFILES"
20+
ComposeProjectName = "COMPOSE_PROJECT_NAME"
21+
ComposePathSeparator = "COMPOSE_PATH_SEPARATOR"
22+
ComposeFilePath = "COMPOSE_FILE"
23+
ComposeDisableDefaultEnvFile = "COMPOSE_DISABLE_ENV_FILE"
24+
ComposeProfiles = "COMPOSE_PROFILES"
2425
)
2526

2627
const Extensions = "#extensions" // Using # prefix, we prevent risk to conflict with an actual yaml key

dotenv/env.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,10 @@ import (
2424
"github.com/pkg/errors"
2525
)
2626

27-
func GetEnvFromFile(currentEnv map[string]string, workingDir string, filenames []string) (map[string]string, error) {
27+
func GetEnvFromFile(currentEnv map[string]string, filenames []string) (map[string]string, error) {
2828
envMap := make(map[string]string)
2929

30-
dotEnvFiles := filenames
31-
if len(dotEnvFiles) == 0 {
32-
dotEnvFiles = append(dotEnvFiles, filepath.Join(workingDir, ".env"))
33-
}
34-
for _, dotEnvFile := range dotEnvFiles {
30+
for _, dotEnvFile := range filenames {
3531
abs, err := filepath.Abs(dotEnvFile)
3632
if err != nil {
3733
return envMap, err
@@ -40,9 +36,6 @@ func GetEnvFromFile(currentEnv map[string]string, workingDir string, filenames [
4036

4137
s, err := os.Stat(dotEnvFile)
4238
if os.IsNotExist(err) {
43-
if len(filenames) == 0 {
44-
return envMap, nil
45-
}
4639
return envMap, errors.Errorf("Couldn't find env file: %s", dotEnvFile)
4740
}
4841
if err != nil {

dotenv/godotenv_test.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -703,9 +703,6 @@ func TestGetEnvFromFile(t *testing.T) {
703703
err := os.Mkdir(f, 0o700)
704704
assert.NilError(t, err)
705705

706-
_, err = GetEnvFromFile(nil, wd, nil)
707-
assert.NilError(t, err)
708-
709-
_, err = GetEnvFromFile(nil, wd, []string{f})
706+
_, err = GetEnvFromFile(nil, []string{f})
710707
assert.Check(t, strings.HasSuffix(err.Error(), ".env is a directory"))
711708
}

loader/include.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package loader
1919
import (
2020
"context"
2121
"fmt"
22+
"os"
2223
"path/filepath"
2324
"reflect"
2425
"strings"
@@ -76,7 +77,14 @@ func ApplyInclude(ctx context.Context, configDetails types.ConfigDetails, model
7677
loadOptions.SkipNormalization = true
7778
loadOptions.SkipConsistencyCheck = true
7879

79-
envFromFile, err := dotenv.GetEnvFromFile(configDetails.Environment, r.ProjectDirectory, r.EnvFile)
80+
if len(r.EnvFile) == 0 {
81+
f := filepath.Join(r.ProjectDirectory, ".env")
82+
if s, err := os.Stat(f); err == nil && !s.IsDir() {
83+
r.EnvFile = types.StringList{f}
84+
}
85+
}
86+
87+
envFromFile, err := dotenv.GetEnvFromFile(configDetails.Environment, r.EnvFile)
8088
if err != nil {
8189
return err
8290
}

0 commit comments

Comments
 (0)