Merge branch 'from_env' of https://github.com/bfirsh/docker-py into bfirsh-from_env

This commit is contained in:
Joffrey F 2016-03-22 17:09:24 -07:00
commit c3f76e6e8f
5 changed files with 55 additions and 40 deletions

View File

@ -17,4 +17,4 @@ from .version import version, version_info
__version__ = version __version__ = version
__title__ = 'docker-py' __title__ = 'docker-py'
from .client import Client, AutoVersionClient # flake8: noqa from .client import Client, AutoVersionClient, from_env # flake8: noqa

View File

@ -28,10 +28,14 @@ from . import errors
from .auth import auth from .auth import auth
from .unixconn import unixconn from .unixconn import unixconn
from .ssladapter import ssladapter from .ssladapter import ssladapter
from .utils import utils, check_resource, update_headers from .utils import utils, check_resource, update_headers, kwargs_from_env
from .tls import TLSConfig from .tls import TLSConfig
def from_env(**kwargs):
return Client.from_env(**kwargs)
class Client( class Client(
requests.Session, requests.Session,
api.BuildApiMixin, api.BuildApiMixin,
@ -84,6 +88,10 @@ class Client(
) )
) )
@classmethod
def from_env(cls, **kwargs):
return cls(**kwargs_from_env(**kwargs))
def _retrieve_server_version(self): def _retrieve_server_version(self):
try: try:
return self.version(api_version=False)["ApiVersion"] return self.version(api_version=False)["ApiVersion"]

View File

@ -1,38 +0,0 @@
# Using with Boot2docker
For usage with boot2docker, there is a helper function in the utils package named `kwargs_from_env`, it will pass any environment variables from Boot2docker to the Client.
First run boot2docker in your shell:
```bash
$ eval "$(boot2docker shellinit)"
Writing /Users/you/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/you/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/you/.boot2docker/certs/boot2docker-vm/key.pem
```
You can then instantiate `docker.Client` like this:
```python
from docker.client import Client
from docker.utils import kwargs_from_env
cli = Client(**kwargs_from_env())
print cli.version()
```
If you're encountering the following error:
`SSLError: hostname '192.168.59.103' doesn't match 'boot2docker'`, you can:
1. Add an entry to your /etc/hosts file matching boot2docker to the daemon's IP
1. disable hostname validation (but please consider the security implications
in doing this)
```python
from docker.client import Client
from docker.utils import kwargs_from_env
kwargs = kwargs_from_env()
kwargs['tls'].assert_hostname = False
cli = Client(**kwargs)
print cli.version()
```

19
docs/machine.md Normal file
View File

@ -0,0 +1,19 @@
# Using with Docker Toolbox and Machine
In development, we recommend using [Docker Toolbox](https://www.docker.com/products/docker-toolbox) to set up Docker. It includes a tool called Machine which will create a VM running Docker Engine and point your shell at it using environment variables.
To configure docker-py with these environment variables
First use Machine to set up the environment variables:
```bash
$ eval "$(docker-machine env)"
```
You can then use docker-py like this:
```python
import docker
client = docker.from_env(assert_hostname=False)
print client.version()
```
**Note:** We are disabling TLS hostname checking with `assert\_hostname=False`. Machine provides us with the exact certificate the server is using so this is safe. If you are not using Machine and verifying the host against a certificate authority, you'll want to enable this.

26
tests/unit/client_test.py Normal file
View File

@ -0,0 +1,26 @@
import os
from docker.client import Client
from .. import base
TEST_CERT_DIR = os.path.join(
os.path.dirname(__file__),
'testdata/certs',
)
class ClientTest(base.BaseTestCase):
def setUp(self):
self.os_environ = os.environ.copy()
def tearDown(self):
os.environ = self.os_environ
def test_from_env(self):
"""Test that environment variables are passed through to
utils.kwargs_from_env(). KwargsFromEnvTest tests that environment
variables are parsed correctly."""
os.environ.update(DOCKER_HOST='tcp://192.168.59.103:2376',
DOCKER_CERT_PATH=TEST_CERT_DIR,
DOCKER_TLS_VERIFY='1')
client = Client.from_env()
self.assertEqual(client.base_url, "https://192.168.59.103:2376")