summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docker/api/build.py22
-rw-r--r--docker/types/services.py7
-rw-r--r--docker/utils/__init__.py1
-rw-r--r--tests/integration/api_service_test.py16
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']