Resolve environment without values to values on host

For parity with the Docker CLI, allow environment variables without
values to be automatically resolved to their values on the host.

Signed-off-by: Ryan Brainard <brainard@heroku.com>

Conflicts:
	tests/integration/service_test.py
This commit is contained in:
Ryan Brainard 2014-07-11 10:18:05 -07:00
parent 3996947024
commit 44a91e6ba8
2 changed files with 39 additions and 0 deletions

View File

@ -330,6 +330,11 @@ class Service(object):
if 'volumes' in container_options: if 'volumes' in container_options:
container_options['volumes'] = dict((split_volume(v)[1], {}) for v in container_options['volumes']) container_options['volumes'] = dict((split_volume(v)[1], {}) for v in container_options['volumes'])
if 'environment' in container_options:
if isinstance(container_options['environment'], list):
container_options['environment'] = dict(split_env(e) for e in container_options['environment'])
container_options['environment'] = dict(resolve_env(k,v) for k,v in container_options['environment'].iteritems())
if self.can_be_built(): if self.can_be_built():
if len(self.client.images(name=self._build_tag_name())) == 0: if len(self.client.images(name=self._build_tag_name())) == 0:
self.build() self.build()
@ -447,3 +452,16 @@ def split_port(port):
external_port = (external_ip,) external_port = (external_ip,)
return internal_port, external_port return internal_port, external_port
def split_env(env):
if '=' in env:
return env.split('=', 1)
else:
return env, None
def resolve_env(key,val):
if val is not None:
return key, val
elif key in os.environ:
return key, os.environ[key]
else:
return key, ''

View File

@ -5,6 +5,7 @@ from fig.service import CannotBeScaledError
from fig.container import Container from fig.container import Container
from fig.packages.docker.errors import APIError from fig.packages.docker.errors import APIError
from .testcases import DockerClientTestCase from .testcases import DockerClientTestCase
import os
class ServiceTest(DockerClientTestCase): class ServiceTest(DockerClientTestCase):
def test_containers(self): def test_containers(self):
@ -306,3 +307,23 @@ class ServiceTest(DockerClientTestCase):
service = self.create_service('container', working_dir='/working/dir/sample') service = self.create_service('container', working_dir='/working/dir/sample')
container = service.create_container().inspect() container = service.create_container().inspect()
self.assertEqual(container['Config']['WorkingDir'], '/working/dir/sample') self.assertEqual(container['Config']['WorkingDir'], '/working/dir/sample')
def test_split_env(self):
service = self.create_service('web', environment=['NORMAL=F1', 'CONTAINS_EQUALS=F=2', 'TRAILING_EQUALS='])
env = service.start_container().environment
for k,v in {'NORMAL': 'F1', 'CONTAINS_EQUALS': 'F=2', 'TRAILING_EQUALS': ''}.iteritems():
self.assertEqual(env[k], v)
def test_resolve_env(self):
service = self.create_service('web', environment={'FILE_DEF': 'F1', 'FILE_DEF_EMPTY': '', 'ENV_DEF': None, 'NO_DEF': None})
os.environ['FILE_DEF'] = 'E1'
os.environ['FILE_DEF_EMPTY'] = 'E2'
os.environ['ENV_DEF'] = 'E3'
try:
env = service.start_container().environment
for k,v in {'FILE_DEF': 'F1', 'FILE_DEF_EMPTY': '', 'ENV_DEF': 'E3', 'NO_DEF': ''}.iteritems():
self.assertEqual(env[k], v)
finally:
del os.environ['FILE_DEF']
del os.environ['FILE_DEF_EMPTY']
del os.environ['ENV_DEF']