summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <f.joffrey@gmail.com>2017-01-25 12:37:46 -0800
committerGitHub <noreply@github.com>2017-01-25 12:37:46 -0800
commitff83cf406d7dd5d88367aea661cb3dd2a1419f7c (patch)
tree4e9f47fe635098e687b9b3946278ca6ec0a8069c
parent8ca5b2b392ad5625dc726b8ae43f866196ba40df (diff)
parent93877241f9c4d25967e41b050a1fe2966355ede5 (diff)
downloaddocker-py-ff83cf406d7dd5d88367aea661cb3dd2a1419f7c.tar.gz
Merge pull request #1408 from docker/1407-tar-ignore-sockets
Ignore socket files in utils.tar
-rw-r--r--Makefile4
-rw-r--r--docker/errors.py2
-rw-r--r--docker/utils/utils.py9
-rw-r--r--tests/unit/utils_test.py15
4 files changed, 25 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index 8727ada..6788cf6 100644
--- a/Makefile
+++ b/Makefile
@@ -44,7 +44,7 @@ integration-test-py3: build-py3
.PHONY: integration-dind
integration-dind: build build-py3
docker rm -vf dpy-dind || :
- docker run -d --name dpy-dind --privileged dockerswarm/dind:1.13.0-rc3 docker daemon\
+ docker run -d --name dpy-dind --privileged dockerswarm/dind:1.13.0 docker daemon\
-H tcp://0.0.0.0:2375
docker run --rm --env="DOCKER_HOST=tcp://docker:2375" --link=dpy-dind:docker docker-sdk-python\
py.test tests/integration
@@ -57,7 +57,7 @@ integration-dind-ssl: build-dind-certs build build-py3
docker run -d --name dpy-dind-certs dpy-dind-certs
docker run -d --env="DOCKER_HOST=tcp://localhost:2375" --env="DOCKER_TLS_VERIFY=1"\
--env="DOCKER_CERT_PATH=/certs" --volumes-from dpy-dind-certs --name dpy-dind-ssl\
- -v /tmp --privileged dockerswarm/dind:1.13.0-rc3 docker daemon --tlsverify\
+ -v /tmp --privileged dockerswarm/dind:1.13.0 docker daemon --tlsverify\
--tlscacert=/certs/ca.pem --tlscert=/certs/server-cert.pem\
--tlskey=/certs/server-key.pem -H tcp://0.0.0.0:2375
docker run --rm --volumes-from dpy-dind-ssl --env="DOCKER_HOST=tcp://docker:2375"\
diff --git a/docker/errors.py b/docker/errors.py
index 95c462b..d9b197d 100644
--- a/docker/errors.py
+++ b/docker/errors.py
@@ -22,7 +22,7 @@ def create_api_error_from_http_exception(e):
cls = APIError
if response.status_code == 404:
if explanation and ('No such image' in str(explanation) or
- 'not found: does not exist or no read access'
+ 'not found: does not exist or no pull access'
in str(explanation)):
cls = ImageNotFound
else:
diff --git a/docker/utils/utils.py b/docker/utils/utils.py
index e12fcf0..8026c4d 100644
--- a/docker/utils/utils.py
+++ b/docker/utils/utils.py
@@ -4,7 +4,6 @@ import os
import os.path
import json
import shlex
-import sys
import tarfile
import tempfile
import warnings
@@ -15,6 +14,7 @@ from fnmatch import fnmatch
import requests
import six
+from .. import constants
from .. import errors
from .. import tls
@@ -90,7 +90,12 @@ def tar(path, exclude=None, dockerfile=None, fileobj=None, gzip=False):
for path in sorted(exclude_paths(root, exclude, dockerfile=dockerfile)):
i = t.gettarinfo(os.path.join(root, path), arcname=path)
- if sys.platform == 'win32':
+ if i is None:
+ # This happens when we encounter a socket file. We can safely
+ # ignore it and proceed.
+ continue
+
+ if constants.IS_WINDOWS_PLATFORM:
# Windows doesn't keep track of the execute bit, so we make files
# and directories executable by default.
i.mode = i.mode & 0o755 | 0o111
diff --git a/tests/unit/utils_test.py b/tests/unit/utils_test.py
index cf00616..71a8cc7 100644
--- a/tests/unit/utils_test.py
+++ b/tests/unit/utils_test.py
@@ -5,6 +5,7 @@ import json
import os
import os.path
import shutil
+import socket
import sys
import tarfile
import tempfile
@@ -894,6 +895,20 @@ class TarTest(unittest.TestCase):
sorted(tar_data.getnames()), ['bar', 'bar/foo', 'foo']
)
+ def test_tar_socket_file(self):
+ base = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, base)
+ for d in ['foo', 'bar']:
+ os.makedirs(os.path.join(base, d))
+ sock = socket.socket(socket.AF_UNIX)
+ self.addCleanup(sock.close)
+ sock.bind(os.path.join(base, 'test.sock'))
+ with tar(base) as archive:
+ tar_data = tarfile.open(fileobj=archive)
+ self.assertEqual(
+ sorted(tar_data.getnames()), ['bar', 'foo']
+ )
+
class ShouldCheckDirectoryTest(unittest.TestCase):
exclude_patterns = [