compose_environment_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. Copyright 2020 Docker Compose CLI authors
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package e2e
  14. import (
  15. "os"
  16. "strings"
  17. "testing"
  18. "gotest.tools/v3/assert"
  19. "gotest.tools/v3/icmd"
  20. )
  21. func TestEnvPriority(t *testing.T) {
  22. c := NewParallelE2eCLI(t, binDir)
  23. projectDir := "./fixtures/environment/env-priority"
  24. t.Run("up", func(t *testing.T) {
  25. c.RunDockerOrExitError("rmi", "env-compose-priority")
  26. c.RunDockerComposeCmd("-f", "./fixtures/environment/env-priority/compose-with-env.yaml",
  27. "--project-directory", projectDir, "up", "-d", "--build")
  28. })
  29. // Full options activated
  30. // 1. Compose file <-- Result expected
  31. // 2. Shell environment variables
  32. // 3. Environment file
  33. // 4. Dockerfile
  34. // 5. Variable is not defined
  35. t.Run("compose file priority", func(t *testing.T) {
  36. os.Setenv("WHEREAMI", "shell") //nolint:errcheck
  37. defer os.Unsetenv("WHEREAMI") //nolint:errcheck
  38. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-priority/compose-with-env.yaml",
  39. "--project-directory", projectDir, "--env-file", "./fixtures/environment/env-priority/.env.override",
  40. "run", "--rm", "-e", "WHEREAMI", "env-compose-priority")
  41. assert.Equal(t, strings.TrimSpace(res.Stdout()), "Compose File")
  42. })
  43. // No Compose file, all other options
  44. // 1. Compose file
  45. // 2. Shell environment variables <-- Result expected
  46. // 3. Environment file
  47. // 4. Dockerfile
  48. // 5. Variable is not defined
  49. t.Run("shell priority", func(t *testing.T) {
  50. os.Setenv("WHEREAMI", "shell") //nolint:errcheck
  51. defer os.Unsetenv("WHEREAMI") //nolint:errcheck
  52. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-priority/compose.yaml",
  53. "--project-directory", projectDir, "--env-file", "./fixtures/environment/env-priority/.env.override",
  54. "run", "--rm", "-e", "WHEREAMI", "env-compose-priority")
  55. assert.Equal(t, strings.TrimSpace(res.Stdout()), "shell")
  56. })
  57. // No Compose file and env variable pass to the run command
  58. // 1. Compose file
  59. // 2. Shell environment variables <-- Result expected
  60. // 3. Environment file
  61. // 4. Dockerfile
  62. // 5. Variable is not defined
  63. t.Run("shell priority from run command", func(t *testing.T) {
  64. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-priority/compose.yaml",
  65. "--project-directory", projectDir, "--env-file", "./fixtures/environment/env-priority/.env.override",
  66. "run", "--rm", "-e", "WHEREAMI=shell-run", "env-compose-priority")
  67. assert.Equal(t, strings.TrimSpace(res.Stdout()), "shell-run")
  68. })
  69. // No Compose file & no env variable but override env file
  70. // 1. Compose file
  71. // 2. Shell environment variables
  72. // 3. Environment file <-- Result expected
  73. // 4. Dockerfile
  74. // 5. Variable is not defined
  75. t.Run("override env file", func(t *testing.T) {
  76. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-priority/compose.yaml",
  77. "--project-directory", projectDir, "--env-file", "./fixtures/environment/env-priority/.env.override",
  78. "run", "--rm", "-e", "WHEREAMI", "env-compose-priority")
  79. assert.Equal(t, strings.TrimSpace(res.Stdout()), "override")
  80. })
  81. // No Compose file & no env variable but override env file
  82. // 1. Compose file
  83. // 2. Shell environment variables
  84. // 3. Environment file <-- Result expected
  85. // 4. Dockerfile
  86. // 5. Variable is not defined
  87. t.Run("env file", func(t *testing.T) {
  88. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-priority/compose.yaml",
  89. "--project-directory", projectDir, "run", "--rm", "-e", "WHEREAMI", "env-compose-priority")
  90. assert.Equal(t, strings.TrimSpace(res.Stdout()), "Env File")
  91. })
  92. // No Compose file & no env variable, using an empty override env file
  93. // 1. Compose file
  94. // 2. Shell environment variables
  95. // 3. Environment file
  96. // 4. Dockerfile <-- Result expected
  97. // 5. Variable is not defined
  98. t.Run("use Dockerfile", func(t *testing.T) {
  99. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-priority/compose.yaml",
  100. "--project-directory", projectDir, "--env-file", "./fixtures/environment/env-priority/.env.empty",
  101. "run", "--rm", "-e", "WHEREAMI", "env-compose-priority")
  102. assert.Equal(t, strings.TrimSpace(res.Stdout()), "Dockerfile")
  103. })
  104. t.Run("down", func(t *testing.T) {
  105. c.RunDockerComposeCmd("--project-directory", projectDir, "down")
  106. })
  107. }
  108. func TestEnvInterpolation(t *testing.T) {
  109. c := NewParallelE2eCLI(t, binDir)
  110. projectDir := "./fixtures/environment/env-interpolation"
  111. // No variable defined in the Compose file and env variable pass to the run command
  112. // 1. Compose file
  113. // 2. Shell environment variables <-- Result expected
  114. // 3. Environment file
  115. // 4. Dockerfile
  116. // 5. Variable is not defined
  117. t.Run("shell priority from run command", func(t *testing.T) {
  118. os.Setenv("WHEREAMI", "shell") //nolint:errcheck
  119. defer os.Unsetenv("WHEREAMI") //nolint:errcheck
  120. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-interpolation/compose.yaml",
  121. "--project-directory", projectDir, "config")
  122. res.Assert(t, icmd.Expected{Out: `IMAGE: default_env:shell`})
  123. })
  124. }
  125. func TestCommentsInEnvFile(t *testing.T) {
  126. c := NewParallelE2eCLI(t, binDir)
  127. projectDir := "./fixtures/environment/env-file-comments"
  128. t.Run("comments in env files", func(t *testing.T) {
  129. c.RunDockerOrExitError("rmi", "env-file-comments")
  130. c.RunDockerComposeCmd("-f", "./fixtures/environment/env-file-comments/compose.yaml",
  131. "--project-directory", projectDir, "up", "-d", "--build")
  132. res := c.RunDockerComposeCmd("-f", "./fixtures/environment/env-file-comments/compose.yaml",
  133. "--project-directory", projectDir, "run", "--rm",
  134. "-e", "COMMENT", "-e", "NO_COMMENT", "env-file-comments")
  135. res.Assert(t, icmd.Expected{Out: `COMMENT=1234`})
  136. res.Assert(t, icmd.Expected{Out: `NO_COMMENT=1234#5`})
  137. c.RunDockerComposeCmd("--project-directory", projectDir, "down", "--rmi", "all")
  138. })
  139. }