diff --git a/compose/cli/main.py b/compose/cli/main.py index b6ad404dc..f0fbe6437 100644 --- a/compose/cli/main.py +++ b/compose/cli/main.py @@ -1466,7 +1466,12 @@ def call_docker(args, dockeropts, environment): args = [executable_path] + tls_options + args log.debug(" ".join(map(pipes.quote, args))) - return subprocess.call(args, env=environment) + filtered_env = {} + for k, v in environment.items(): + if v is not None: + filtered_env[k] = environment[k] + + return subprocess.call(args, env=filtered_env) def parse_scale_args(options): diff --git a/tests/acceptance/cli_test.py b/tests/acceptance/cli_test.py index 7fa7fc548..43d5a3f5c 100644 --- a/tests/acceptance/cli_test.py +++ b/tests/acceptance/cli_test.py @@ -1711,6 +1711,17 @@ services: assert stderr == "" assert stdout == "/\n" + @mock.patch.dict(os.environ) + def test_exec_novalue_var_dotenv_file(self): + os.environ['MYVAR'] = 'SUCCESS' + self.base_dir = 'tests/fixtures/exec-novalue-var' + self.dispatch(['up', '-d']) + assert len(self.project.containers()) == 1 + + stdout, stderr = self.dispatch(['exec', '-T', 'nginx', 'env']) + assert 'CHECK_VAR=SUCCESS' in stdout + assert not stderr + def test_exec_detach_long_form(self): self.base_dir = 'tests/fixtures/links-composefile' self.dispatch(['up', '--detach', 'console']) diff --git a/tests/fixtures/exec-novalue-var/docker-compose.yml b/tests/fixtures/exec-novalue-var/docker-compose.yml new file mode 100644 index 000000000..1f8502f95 --- /dev/null +++ b/tests/fixtures/exec-novalue-var/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3' +services: + nginx: + image: nginx + environment: + - CHECK_VAR=${MYVAR}