diff options
-rw-r--r-- | docker/api/build.py | 22 | ||||
-rw-r--r-- | docker/types/services.py | 7 | ||||
-rw-r--r-- | docker/utils/__init__.py | 1 | ||||
-rw-r--r-- | tests/integration/api_service_test.py | 16 |
4 files changed, 41 insertions, 5 deletions
diff --git a/docker/api/build.py b/docker/api/build.py index 7cf4e0f..eb01bce 100644 --- a/docker/api/build.py +++ b/docker/api/build.py @@ -230,19 +230,35 @@ class BuildApiMixin(object): # Send the full auth configuration (if any exists), since the build # could use any (or all) of the registries. if self._auth_configs: + auth_data = {} + if self._auth_configs.get('credsStore'): + # Using a credentials store, we need to retrieve the + # credentials for each registry listed in the config.json file + # Matches CLI behavior: https://github.com/docker/docker/blob/ + # 67b85f9d26f1b0b2b240f2d794748fac0f45243c/cliconfig/ + # credentials/native_store.go#L68-L83 + for registry in self._auth_configs.keys(): + if registry == 'credsStore' or registry == 'HttpHeaders': + continue + auth_data[registry] = auth.resolve_authconfig( + self._auth_configs, registry + ) + else: + auth_data = self._auth_configs + log.debug( 'Sending auth config ({0})'.format( - ', '.join(repr(k) for k in self._auth_configs.keys()) + ', '.join(repr(k) for k in auth_data.keys()) ) ) if utils.compare_version('1.19', self._version) >= 0: headers['X-Registry-Config'] = auth.encode_header( - self._auth_configs + auth_data ) else: headers['X-Registry-Config'] = auth.encode_header({ - 'configs': self._auth_configs + 'configs': auth_data }) else: log.debug('No auth config found') diff --git a/docker/types/services.py b/docker/types/services.py index 82d1e60..5041f89 100644 --- a/docker/types/services.py +++ b/docker/types/services.py @@ -1,7 +1,7 @@ import six from .. import errors -from ..utils import split_command +from ..utils import format_environment, split_command class TaskTemplate(dict): @@ -82,7 +82,10 @@ class ContainerSpec(dict): self['Args'] = args if env is not None: - self['Env'] = env + if isinstance(env, dict): + self['Env'] = format_environment(env) + else: + self['Env'] = env if workdir is not None: self['Dir'] = workdir if user is not None: diff --git a/docker/utils/__init__.py b/docker/utils/__init__.py index 061c26e..747743c 100644 --- a/docker/utils/__init__.py +++ b/docker/utils/__init__.py @@ -6,6 +6,7 @@ from .utils import ( create_host_config, parse_bytes, ping_registry, parse_env_file, version_lt, version_gte, decode_json_header, split_command, create_ipam_config, create_ipam_pool, parse_devices, normalize_links, convert_service_networks, + format_environment ) from .decorators import check_resource, minimum_version, update_headers diff --git a/tests/integration/api_service_test.py b/tests/integration/api_service_test.py index 3581f99..bdf7c01 100644 --- a/tests/integration/api_service_test.py +++ b/tests/integration/api_service_test.py @@ -231,3 +231,19 @@ class ServiceTest(BaseAPIIntegrationTest): 'PublishedPort': 12357, 'TargetPort': 1990, 'Protocol': 'udp' } in ports assert len(ports) == 3 + + def test_create_service_with_env(self): + container_spec = docker.types.ContainerSpec( + 'busybox', ['true'], env={'DOCKER_PY_TEST': 1} + ) + task_tmpl = docker.types.TaskTemplate( + container_spec, + ) + name = self.get_service_name() + svc_id = self.client.create_service(task_tmpl, name=name) + svc_info = self.client.inspect_service(svc_id) + assert 'TaskTemplate' in svc_info['Spec'] + assert 'ContainerSpec' in svc_info['Spec']['TaskTemplate'] + con_spec = svc_info['Spec']['TaskTemplate']['ContainerSpec'] + assert 'Env' in con_spec + assert con_spec['Env'] == ['DOCKER_PY_TEST=1'] |