diff --git a/docker/auth/auth.py b/docker/auth/auth.py
index eedb7944..d23e6f3c 100644
--- a/docker/auth/auth.py
+++ b/docker/auth/auth.py
@@ -117,7 +117,7 @@ def parse_auth(entries, raise_on_error=False):
 
     conf = {}
     for registry, entry in six.iteritems(entries):
-        if not (isinstance(entry, dict) and 'auth' in entry):
+        if not isinstance(entry, dict):
             log.debug(
                 'Config entry for key {0} is not auth config'.format(registry)
             )
@@ -130,6 +130,16 @@ def parse_auth(entries, raise_on_error=False):
                     'Invalid configuration for registry {0}'.format(registry)
                 )
             return {}
+        if 'auth' not in entry:
+            # Starting with engine v1.11 (API 1.23), an empty dictionary is
+            # a valid value in the auths config.
+            # https://github.com/docker/compose/issues/3265
+            log.debug(
+                'Auth data for {0} is absent. Client might be using a '
+                'credentials store instead.'
+            )
+            return {}
+
         username, password = decode_auth(entry['auth'])
         log.debug(
             'Found entry (registry={0}, username={1})'
@@ -189,6 +199,9 @@ def load_config(config_path=None):
             if data.get('HttpHeaders'):
                 log.debug("Found 'HttpHeaders' section")
                 res.update({'HttpHeaders': data['HttpHeaders']})
+            if data.get('credsStore'):
+                log.debug("Found 'credsStore' section")
+                res.update({'credsStore': data['credsStore']})
             if res:
                 return res
             else:

diff --git a/tests/unit/auth_test.py b/tests/unit/auth_test.py
index 921aae00..4ea40477 100644
--- a/tests/unit/auth_test.py
+++ b/tests/unit/auth_test.py
@@ -459,6 +459,5 @@ class LoadConfigTest(base.Cleanup, base.BaseTestCase):
         with open(dockercfg_path, 'w') as f:
             json.dump(config, f)
 
-        self.assertRaises(
-            errors.InvalidConfigFile, auth.load_config, dockercfg_path
-        )
+        cfg = auth.load_config(dockercfg_path)
+        assert cfg == {}

Empty auth dictionary should be valid
docker/compose#3265
tests/unit/auth_test.py::LoadConfigTest::test_load_config_invalid_auth_dict
tests/unit/auth_test.py::RegressionTest::test_803_urlsafe_encode tests/unit/auth_test.py::ResolveRepositoryNameTest::test_explicit_hub_index_library_image tests/unit/auth_test.py::ResolveRepositoryNameTest::test_explicit_legacy_hub_index_library_image tests/unit/auth_test.py::ResolveRepositoryNameTest::test_invalid_index_name tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_dotted_hub_library_image tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_hub_image tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_hub_library_image tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_localhost tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_localhost_with_username tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_no_dots_but_port tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_no_dots_but_port_and_username tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_private_registry tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_private_registry_with_port tests/unit/auth_test.py::ResolveRepositoryNameTest::test_resolve_repository_name_private_registry_with_username tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_default_explicit_none tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_default_registry tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_fully_explicit tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_hostname_only tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_legacy_config tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_no_match tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_no_path tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_no_path_trailing_slash tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_no_path_wrong_insecure_proto tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_no_path_wrong_secure_proto tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_no_protocol tests/unit/auth_test.py::ResolveAuthTest::test_resolve_authconfig_path_wrong_proto tests/unit/auth_test.py::ResolveAuthTest::test_resolve_registry_and_auth_explicit_hub tests/unit/auth_test.py::ResolveAuthTest::test_resolve_registry_and_auth_explicit_legacy_hub tests/unit/auth_test.py::ResolveAuthTest::test_resolve_registry_and_auth_hub_image tests/unit/auth_test.py::ResolveAuthTest::test_resolve_registry_and_auth_library_image tests/unit/auth_test.py::ResolveAuthTest::test_resolve_registry_and_auth_private_registry tests/unit/auth_test.py::ResolveAuthTest::test_resolve_registry_and_auth_unauthenticated_registry tests/unit/auth_test.py::LoadConfigTest::test_load_config tests/unit/auth_test.py::LoadConfigTest::test_load_config_custom_config_env tests/unit/auth_test.py::LoadConfigTest::test_load_config_custom_config_env_utf8 tests/unit/auth_test.py::LoadConfigTest::test_load_config_custom_config_env_with_auths tests/unit/auth_test.py::LoadConfigTest::test_load_config_custom_config_env_with_headers tests/unit/auth_test.py::LoadConfigTest::test_load_config_no_file tests/unit/auth_test.py::LoadConfigTest::test_load_config_unknown_keys tests/unit/auth_test.py::LoadConfigTest::test_load_config_with_random_name