Skip to content

Commit ab4893c

Browse files
committed
Handle volumes from the Dockerfile.
Signed-off-by: Daniel Nephin <dnephin@gmail.com>
1 parent c0c45a8 commit ab4893c

File tree

5 files changed

+21
-14
lines changed

5 files changed

+21
-14
lines changed

compose/cli/docker_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,4 @@ def docker_client():
3232
)
3333

3434
timeout = int(os.environ.get('DOCKER_CLIENT_TIMEOUT', 60))
35-
return Client(base_url=base_url, tls=tls_config, version='1.14', timeout=timeout)
35+
return Client(base_url=base_url, tls=tls_config, timeout=timeout)

compose/service.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from operator import attrgetter, itemgetter
88
import sys
99

10+
import docker.utils
1011
from docker.errors import APIError
1112

1213
from .container import Container, get_container_name
@@ -281,24 +282,27 @@ def recreate_container(self, container, **override_options):
281282
raise
282283

283284
intermediate_options = dict(self.options, **override_options)
285+
volume_binds = get_container_data_volumes(
286+
container,
287+
intermediate_options.get('volumes'))
284288
intermediate_container = Container.create(
285289
self.client,
286290
image=container.image,
287291
entrypoint=['/bin/echo'],
288292
command=[],
289293
detach=True,
294+
host_config=docker.utils.create_host_config(binds=volume_binds),
290295
)
291-
volume_binds = get_container_data_volumes(
292-
container,
293-
intermediate_options.get('volumes'))
294-
intermediate_container.start(binds=volume_binds)
296+
intermediate_container.start()
295297
intermediate_container.wait()
296298
container.remove()
297299

298300
volumes = remove_existing_volumes(
299301
self.options.get('volumes', []),
300302
volume_binds)
301-
options = dict(override_options, volumes=volumes)
303+
options = dict(
304+
override_options,
305+
host_config=docker.utils.create_host_config(binds=volume_binds))
302306
new_container = self.create_container(do_build=False, **options)
303307
self.start_container(
304308
new_container,
@@ -527,13 +531,18 @@ def get_container_data_volumes(container, volumes_option):
527531
a mapping of volume bindings for those volumes.
528532
"""
529533
volumes = []
530-
for volume in volumes_option or []:
534+
535+
volumes_option = volumes_option or []
536+
container_volumes = container.get('Volumes') or {}
537+
original_volumes = set(volumes_option + container_volumes.keys())
538+
539+
for volume in original_volumes:
531540
volume = parse_volume_spec(volume)
532541
# No need to preserve host volumes
533542
if volume.external:
534543
continue
535544

536-
volume_path = (container.get('Volumes') or {}).get(volume.internal)
545+
volume_path = container_volumes.get(volume.internal)
537546
# New volume, doesn't exist in the old container
538547
if not volume_path:
539548
continue

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
PyYAML==3.10
2-
docker-py==0.6.0
2+
docker-py==0.7.1
33
dockerpty==0.3.2
44
docopt==0.6.1
55
requests==2.2.1

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def find_version(*file_paths):
3030
'requests >= 2.2.1, < 3',
3131
'texttable >= 0.8.1, < 0.9',
3232
'websocket-client >= 0.11.0, < 0.12',
33-
'docker-py >= 0.6.0, < 0.7',
33+
'docker-py >= 0.7.1, < 0.8',
3434
'dockerpty >= 0.3.2, < 0.4',
3535
'six >= 1.3.0, < 2',
3636
]

tests/integration/service_test.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ def test_recreate_containers_when_containers_are_stopped(self):
183183

184184
def test_recreate_containers_with_image_declared_volume(self):
185185
service = Service(
186-
project='figtest',
186+
project='composetest',
187187
name='db',
188188
client=self.client,
189189
build='tests/fixtures/dockerfile-with-volume',
@@ -193,9 +193,7 @@ def test_recreate_containers_with_image_declared_volume(self):
193193
self.assertEqual(old_container.get('Volumes').keys(), ['/data'])
194194
volume_path = old_container.get('Volumes')['/data']
195195

196-
service.recreate_containers()
197-
new_container = service.containers()[0]
198-
service.start_container(new_container)
196+
new_container = service.recreate_containers()[0]
199197
self.assertEqual(new_container.get('Volumes').keys(), ['/data'])
200198
self.assertEqual(new_container.get('Volumes')['/data'], volume_path)
201199

0 commit comments

Comments
 (0)