mirror of https://github.com/docker/docker-py.git
Merge pull request #427 from abanna/adding_multiple_dockercfg_support
adding the ability to login with different dockercfg files.
This commit is contained in:
commit
53beba75f4
|
@ -117,14 +117,20 @@ def encode_full_header(auth):
|
||||||
return encode_header({'configs': auth})
|
return encode_header({'configs': auth})
|
||||||
|
|
||||||
|
|
||||||
def load_config(root=None):
|
def load_config(config_path=None):
|
||||||
"""Loads authentication data from a Docker configuration file in the given
|
"""
|
||||||
root directory."""
|
Loads authentication data from a Docker configuration file in the given
|
||||||
|
root directory or if config_path is passed use given path.
|
||||||
|
"""
|
||||||
conf = {}
|
conf = {}
|
||||||
data = None
|
data = None
|
||||||
|
|
||||||
config_file = os.path.join(root or os.environ.get('HOME', '.'),
|
config_file = config_path or os.path.join(os.environ.get('HOME', '.'),
|
||||||
DOCKER_CONFIG_FILENAME)
|
DOCKER_CONFIG_FILENAME)
|
||||||
|
|
||||||
|
# if config path doesn't exist return empty config
|
||||||
|
if not os.path.exists(config_file):
|
||||||
|
return {}
|
||||||
|
|
||||||
# First try as JSON
|
# First try as JSON
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -715,10 +715,14 @@ class Client(requests.Session):
|
||||||
self._raise_for_status(res)
|
self._raise_for_status(res)
|
||||||
|
|
||||||
def login(self, username, password=None, email=None, registry=None,
|
def login(self, username, password=None, email=None, registry=None,
|
||||||
reauth=False, insecure_registry=False):
|
reauth=False, insecure_registry=False, dockercfg_path=None):
|
||||||
# If we don't have any auth data so far, try reloading the config file
|
# If we don't have any auth data so far, try reloading the config file
|
||||||
# one more time in case anything showed up in there.
|
# one more time in case anything showed up in there.
|
||||||
if not self._auth_configs:
|
# If dockercfg_path is passed check to see if the config file exists,
|
||||||
|
# if so load that config.
|
||||||
|
if dockercfg_path and os.path.exists(dockercfg_path):
|
||||||
|
self._auth_configs = auth.load_config(dockercfg_path)
|
||||||
|
elif not self._auth_configs:
|
||||||
self._auth_configs = auth.load_config()
|
self._auth_configs = auth.load_config()
|
||||||
|
|
||||||
registry = auth.expand_registry_url(registry, insecure_registry) \
|
registry = auth.expand_registry_url(registry, insecure_registry) \
|
||||||
|
|
|
@ -29,6 +29,7 @@ import threading
|
||||||
import time
|
import time
|
||||||
import unittest
|
import unittest
|
||||||
import warnings
|
import warnings
|
||||||
|
import random
|
||||||
|
|
||||||
import docker
|
import docker
|
||||||
import requests
|
import requests
|
||||||
|
@ -2004,12 +2005,13 @@ class DockerClientTest(Cleanup, unittest.TestCase):
|
||||||
def test_load_config(self):
|
def test_load_config(self):
|
||||||
folder = tempfile.mkdtemp()
|
folder = tempfile.mkdtemp()
|
||||||
self.addCleanup(shutil.rmtree, folder)
|
self.addCleanup(shutil.rmtree, folder)
|
||||||
f = open(os.path.join(folder, '.dockercfg'), 'w')
|
dockercfg_path = os.path.join(folder, '.dockercfg')
|
||||||
|
f = open(dockercfg_path, 'w')
|
||||||
auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii')
|
auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii')
|
||||||
f.write('auth = {0}\n'.format(auth_))
|
f.write('auth = {0}\n'.format(auth_))
|
||||||
f.write('email = sakuya@scarlet.net')
|
f.write('email = sakuya@scarlet.net')
|
||||||
f.close()
|
f.close()
|
||||||
cfg = docker.auth.load_config(folder)
|
cfg = docker.auth.load_config(dockercfg_path)
|
||||||
self.assertTrue(docker.auth.INDEX_URL in cfg)
|
self.assertTrue(docker.auth.INDEX_URL in cfg)
|
||||||
self.assertNotEqual(cfg[docker.auth.INDEX_URL], None)
|
self.assertNotEqual(cfg[docker.auth.INDEX_URL], None)
|
||||||
cfg = cfg[docker.auth.INDEX_URL]
|
cfg = cfg[docker.auth.INDEX_URL]
|
||||||
|
@ -2018,6 +2020,34 @@ class DockerClientTest(Cleanup, unittest.TestCase):
|
||||||
self.assertEqual(cfg['email'], 'sakuya@scarlet.net')
|
self.assertEqual(cfg['email'], 'sakuya@scarlet.net')
|
||||||
self.assertEqual(cfg.get('auth'), None)
|
self.assertEqual(cfg.get('auth'), None)
|
||||||
|
|
||||||
|
def test_load_config_with_random_name(self):
|
||||||
|
folder = tempfile.mkdtemp()
|
||||||
|
self.addCleanup(shutil.rmtree, folder)
|
||||||
|
|
||||||
|
dockercfg_path = os.path.join(folder,
|
||||||
|
'.{0}.dockercfg'.format(
|
||||||
|
random.randrange(100000)))
|
||||||
|
registry = 'https://your.private.registry.io'
|
||||||
|
auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii')
|
||||||
|
config = {
|
||||||
|
registry: {
|
||||||
|
'auth': '{0}'.format(auth_),
|
||||||
|
'email': 'sakuya@scarlet.net'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(dockercfg_path, 'w') as f:
|
||||||
|
f.write(json.dumps(config))
|
||||||
|
|
||||||
|
cfg = docker.auth.load_config(dockercfg_path)
|
||||||
|
self.assertTrue(registry in cfg)
|
||||||
|
self.assertNotEqual(cfg[registry], None)
|
||||||
|
cfg = cfg[registry]
|
||||||
|
self.assertEqual(cfg['username'], 'sakuya')
|
||||||
|
self.assertEqual(cfg['password'], 'izayoi')
|
||||||
|
self.assertEqual(cfg['email'], 'sakuya@scarlet.net')
|
||||||
|
self.assertEqual(cfg.get('auth'), None)
|
||||||
|
|
||||||
def test_tar_with_excludes(self):
|
def test_tar_with_excludes(self):
|
||||||
base = tempfile.mkdtemp()
|
base = tempfile.mkdtemp()
|
||||||
self.addCleanup(shutil.rmtree, base)
|
self.addCleanup(shutil.rmtree, base)
|
||||||
|
|
Loading…
Reference in New Issue