| import gzip |
| import io |
| import shutil |
| |
| import docker |
| from docker import auth |
| from docker.api.build import process_dockerfile |
| |
| import pytest |
| |
| from ..helpers import make_tree |
| from .api_test import BaseAPIClientTest, fake_request, url_prefix |
| |
| |
| class BuildTest(BaseAPIClientTest): |
| def test_build_container(self): |
| script = io.BytesIO('\n'.join([ |
| 'FROM busybox', |
| 'RUN mkdir -p /tmp/test', |
| 'EXPOSE 8080', |
| 'ADD https://dl.dropboxusercontent.com/u/20637798/silence.tar.gz' |
| ' /tmp/silence.tar.gz' |
| ]).encode('ascii')) |
| |
| self.client.build(fileobj=script) |
| |
| def test_build_container_pull(self): |
| script = io.BytesIO('\n'.join([ |
| 'FROM busybox', |
| 'RUN mkdir -p /tmp/test', |
| 'EXPOSE 8080', |
| 'ADD https://dl.dropboxusercontent.com/u/20637798/silence.tar.gz' |
| ' /tmp/silence.tar.gz' |
| ]).encode('ascii')) |
| |
| self.client.build(fileobj=script, pull=True) |
| |
| def test_build_container_custom_context(self): |
| script = io.BytesIO('\n'.join([ |
| 'FROM busybox', |
| 'RUN mkdir -p /tmp/test', |
| 'EXPOSE 8080', |
| 'ADD https://dl.dropboxusercontent.com/u/20637798/silence.tar.gz' |
| ' /tmp/silence.tar.gz' |
| ]).encode('ascii')) |
| context = docker.utils.mkbuildcontext(script) |
| |
| self.client.build(fileobj=context, custom_context=True) |
| |
| def test_build_container_custom_context_gzip(self): |
| script = io.BytesIO('\n'.join([ |
| 'FROM busybox', |
| 'RUN mkdir -p /tmp/test', |
| 'EXPOSE 8080', |
| 'ADD https://dl.dropboxusercontent.com/u/20637798/silence.tar.gz' |
| ' /tmp/silence.tar.gz' |
| ]).encode('ascii')) |
| context = docker.utils.mkbuildcontext(script) |
| gz_context = gzip.GzipFile(fileobj=context) |
| |
| self.client.build( |
| fileobj=gz_context, |
| custom_context=True, |
| encoding="gzip" |
| ) |
| |
| def test_build_remote_with_registry_auth(self): |
| self.client._auth_configs = auth.AuthConfig({ |
| 'auths': { |
| 'https://example.com': { |
| 'user': 'example', |
| 'password': 'example', |
| 'email': 'example@example.com' |
| } |
| } |
| }) |
| |
| expected_params = {'t': None, 'q': False, 'dockerfile': None, |
| 'rm': False, 'nocache': False, 'pull': False, |
| 'forcerm': False, |
| 'remote': 'https://github.com/docker-library/mongo'} |
| expected_headers = { |
| 'X-Registry-Config': auth.encode_header( |
| self.client._auth_configs.auths |
| ) |
| } |
| |
| self.client.build(path='https://github.com/docker-library/mongo') |
| |
| fake_request.assert_called_with( |
| 'POST', |
| url_prefix + 'build', |
| stream=True, |
| data=None, |
| headers=expected_headers, |
| params=expected_params, |
| timeout=None |
| ) |
| |
| def test_build_container_with_named_dockerfile(self): |
| self.client.build('.', dockerfile='nameddockerfile') |
| |
| def test_build_container_with_container_limits(self): |
| self.client.build('.', container_limits={ |
| 'memory': 1024 * 1024, |
| 'cpusetcpus': 1, |
| 'cpushares': 1000, |
| 'memswap': 1024 * 1024 * 8 |
| }) |
| |
| def test_build_container_invalid_container_limits(self): |
| with pytest.raises(docker.errors.DockerException): |
| self.client.build('.', container_limits={ |
| 'foo': 'bar' |
| }) |
| |
| def test_set_auth_headers_with_empty_dict_and_auth_configs(self): |
| self.client._auth_configs = auth.AuthConfig({ |
| 'auths': { |
| 'https://example.com': { |
| 'user': 'example', |
| 'password': 'example', |
| 'email': 'example@example.com' |
| } |
| } |
| }) |
| |
| headers = {} |
| expected_headers = { |
| 'X-Registry-Config': auth.encode_header( |
| self.client._auth_configs.auths |
| ) |
| } |
| |
| self.client._set_auth_headers(headers) |
| assert headers == expected_headers |
| |
| def test_set_auth_headers_with_dict_and_auth_configs(self): |
| self.client._auth_configs = auth.AuthConfig({ |
| 'auths': { |
| 'https://example.com': { |
| 'user': 'example', |
| 'password': 'example', |
| 'email': 'example@example.com' |
| } |
| } |
| }) |
| |
| headers = {'foo': 'bar'} |
| expected_headers = { |
| 'X-Registry-Config': auth.encode_header( |
| self.client._auth_configs.auths |
| ), |
| 'foo': 'bar' |
| } |
| |
| self.client._set_auth_headers(headers) |
| assert headers == expected_headers |
| |
| def test_set_auth_headers_with_dict_and_no_auth_configs(self): |
| headers = {'foo': 'bar'} |
| expected_headers = { |
| 'foo': 'bar' |
| } |
| |
| self.client._set_auth_headers(headers) |
| assert headers == expected_headers |
| |
| @pytest.mark.skipif( |
| not docker.constants.IS_WINDOWS_PLATFORM, |
| reason='Windows-specific syntax') |
| def test_process_dockerfile_win_longpath_prefix(self): |
| dirs = [ |
| 'foo', 'foo/bar', 'baz', |
| ] |
| |
| files = [ |
| 'Dockerfile', 'foo/Dockerfile.foo', 'foo/bar/Dockerfile.bar', |
| 'baz/Dockerfile.baz', |
| ] |
| |
| base = make_tree(dirs, files) |
| self.addCleanup(shutil.rmtree, base) |
| |
| def pre(path): |
| return docker.constants.WINDOWS_LONGPATH_PREFIX + path |
| |
| assert process_dockerfile(None, pre(base)) == (None, None) |
| assert process_dockerfile('Dockerfile', pre(base)) == ( |
| 'Dockerfile', None |
| ) |
| assert process_dockerfile('foo/Dockerfile.foo', pre(base)) == ( |
| 'foo/Dockerfile.foo', None |
| ) |
| assert process_dockerfile( |
| '../Dockerfile', pre(base + '\\foo') |
| )[1] is not None |
| assert process_dockerfile( |
| '../baz/Dockerfile.baz', pre(base + '/baz') |
| ) == ('../baz/Dockerfile.baz', None) |
| |
| def test_process_dockerfile(self): |
| dirs = [ |
| 'foo', 'foo/bar', 'baz', |
| ] |
| |
| files = [ |
| 'Dockerfile', 'foo/Dockerfile.foo', 'foo/bar/Dockerfile.bar', |
| 'baz/Dockerfile.baz', |
| ] |
| |
| base = make_tree(dirs, files) |
| self.addCleanup(shutil.rmtree, base) |
| |
| assert process_dockerfile(None, base) == (None, None) |
| assert process_dockerfile('Dockerfile', base) == ('Dockerfile', None) |
| assert process_dockerfile('foo/Dockerfile.foo', base) == ( |
| 'foo/Dockerfile.foo', None |
| ) |
| assert process_dockerfile( |
| '../Dockerfile', base + '/foo' |
| )[1] is not None |
| assert process_dockerfile('../baz/Dockerfile.baz', base + '/baz') == ( |
| '../baz/Dockerfile.baz', None |
| ) |