Skip to content

Commit

Permalink
Merge branch 'jannefleischer/main'
Browse files Browse the repository at this point in the history
Manually merging #3164.

Signed-off-by: Milas Bowman <milas.bowman@docker.com>
  • Loading branch information
milas committed Aug 15, 2023
2 parents 8b9ad78 + bea6322 commit 0f0b20a
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 4 deletions.
8 changes: 7 additions & 1 deletion docker/api/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,11 @@ def create_container(self, image, command=None, hostname=None, user=None,
'/var/www': {
'bind': '/mnt/vol1',
'mode': 'ro',
},
'/autofs/user1': {
'bind': '/mnt/vol3',
'mode': 'rw',
'propagation': 'shared'
}
})
)
Expand All @@ -329,10 +334,11 @@ def create_container(self, image, command=None, hostname=None, user=None,
.. code-block:: python
container_id = client.api.create_container(
'busybox', 'ls', volumes=['/mnt/vol1', '/mnt/vol2'],
'busybox', 'ls', volumes=['/mnt/vol1', '/mnt/vol2', '/mnt/vol3'],
host_config=client.api.create_host_config(binds=[
'/home/user1/:/mnt/vol2',
'/var/www:/mnt/vol1:ro',
'/autofs/user1:/mnt/vol3:rw,shared',
])
)
Expand Down
17 changes: 16 additions & 1 deletion docker/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

from urllib.parse import urlparse, urlunparse


URLComponents = collections.namedtuple(
'URLComponents',
'scheme netloc url params query fragment',
Expand Down Expand Up @@ -141,6 +140,22 @@ def convert_volume_binds(binds):
else:
mode = 'rw'

# NOTE: this is only relevant for Linux hosts
# (doesn't apply in Docker Desktop)
propagation_modes = [
'rshared',
'shared',
'rslave',
'slave',
'rprivate',
'private',
]
if 'propagation' in v and v['propagation'] in propagation_modes:
if mode:
mode = ','.join([mode, v['propagation']])
else:
mode = v['propagation']

result.append(
f'{k}:{bind}:{mode}'
)
Expand Down
13 changes: 13 additions & 0 deletions tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,19 @@ def untar_file(tardata, filename):
return result


def skip_if_desktop():
def fn(f):
@functools.wraps(f)
def wrapped(self, *args, **kwargs):
info = self.client.info()
if info['Name'] == 'docker-desktop':
pytest.skip('Test does not support Docker Desktop')
return f(self, *args, **kwargs)

return wrapped

return fn

def requires_api_version(version):
test_version = os.environ.get(
'DOCKER_TEST_API_VERSION', docker.constants.DEFAULT_DOCKER_API_VERSION
Expand Down
43 changes: 41 additions & 2 deletions tests/integration/api_container_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from .. import helpers
from ..helpers import assert_cat_socket_detached_with_keys
from ..helpers import ctrl_with
from ..helpers import requires_api_version
from ..helpers import requires_api_version, skip_if_desktop
from .base import BaseAPIIntegrationTest
from .base import TEST_IMG
from docker.constants import IS_WINDOWS_PLATFORM
Expand Down Expand Up @@ -542,6 +542,27 @@ def test_create_with_binds_ro(self):
inspect_data = self.client.inspect_container(container)
self.check_container_data(inspect_data, False)

@skip_if_desktop()
def test_create_with_binds_rw_rshared(self):
container = self.run_with_volume_propagation(
False,
'rshared',
TEST_IMG,
['touch', os.path.join(self.mount_dest, self.filename)],
)
inspect_data = self.client.inspect_container(container)
self.check_container_data(inspect_data, True, 'rshared')
container = self.run_with_volume_propagation(
True,
'rshared',
TEST_IMG,
['ls', self.mount_dest],
)
logs = self.client.logs(container).decode('utf-8')
assert self.filename in logs
inspect_data = self.client.inspect_container(container)
self.check_container_data(inspect_data, False, 'rshared')

@requires_api_version('1.30')
def test_create_with_mounts(self):
mount = docker.types.Mount(
Expand Down Expand Up @@ -597,7 +618,7 @@ def test_create_with_volume_mount(self):
assert mount['Source'] == mount_data['Name']
assert mount_data['RW'] is True

def check_container_data(self, inspect_data, rw):
def check_container_data(self, inspect_data, rw, propagation='rprivate'):
assert 'Mounts' in inspect_data
filtered = list(filter(
lambda x: x['Destination'] == self.mount_dest,
Expand All @@ -607,6 +628,7 @@ def check_container_data(self, inspect_data, rw):
mount_data = filtered[0]
assert mount_data['Source'] == self.mount_origin
assert mount_data['RW'] == rw
assert mount_data['Propagation'] == propagation

def run_with_volume(self, ro, *args, **kwargs):
return self.run_container(
Expand All @@ -624,6 +646,23 @@ def run_with_volume(self, ro, *args, **kwargs):
**kwargs
)

def run_with_volume_propagation(self, ro, propagation, *args, **kwargs):
return self.run_container(
*args,
volumes={self.mount_dest: {}},
host_config=self.client.create_host_config(
binds={
self.mount_origin: {
'bind': self.mount_dest,
'ro': ro,
'propagation': propagation
},
},
network_mode='none'
),
**kwargs
)


class ArchiveTest(BaseAPIIntegrationTest):
def test_get_file_archive_from_container(self):
Expand Down

0 comments on commit 0f0b20a

Please sign in to comment.