Skip to content

Commit 58aa62b

Browse files
authored
swarm: add sysctl support for services (#3029)
Signed-off-by: Quentin Mathorel <[email protected]>
1 parent ff0b4ac commit 58aa62b

File tree

4 files changed

+35
-3
lines changed

4 files changed

+35
-3
lines changed

docker/models/services.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ def create(self, image, command=None, **kwargs):
217217
the default set for the container.
218218
cap_drop (:py:class:`list`): A list of kernel capabilities to drop
219219
from the default set for the container.
220+
sysctls (:py:class:`dict`): A dict of sysctl values to add to the
221+
container
220222
221223
Returns:
222224
:py:class:`Service`: The created service.
@@ -305,6 +307,7 @@ def list(self, **kwargs):
305307
'tty',
306308
'user',
307309
'workdir',
310+
'sysctls',
308311
]
309312

310313
# kwargs to copy straight over to TaskTemplate

docker/types/services.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ class ContainerSpec(dict):
115115
default set for the container.
116116
cap_drop (:py:class:`list`): A list of kernel capabilities to drop from
117117
the default set for the container.
118+
sysctls (:py:class:`dict`): A dict of sysctl values to add to
119+
the container
118120
"""
119121

120122
def __init__(self, image, command=None, args=None, hostname=None, env=None,
@@ -123,7 +125,7 @@ def __init__(self, image, command=None, args=None, hostname=None, env=None,
123125
open_stdin=None, read_only=None, stop_signal=None,
124126
healthcheck=None, hosts=None, dns_config=None, configs=None,
125127
privileges=None, isolation=None, init=None, cap_add=None,
126-
cap_drop=None):
128+
cap_drop=None, sysctls=None):
127129
self['Image'] = image
128130

129131
if isinstance(command, str):
@@ -205,6 +207,12 @@ def __init__(self, image, command=None, args=None, hostname=None, env=None,
205207

206208
self['CapabilityDrop'] = cap_drop
207209

210+
if sysctls is not None:
211+
if not isinstance(sysctls, dict):
212+
raise TypeError('sysctls must be a dict')
213+
214+
self['Sysctls'] = sysctls
215+
208216

209217
class Mount(dict):
210218
"""

tests/integration/api_service_test.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,3 +1419,23 @@ def test_create_service_cap_drop(self):
14191419
assert services[0]['ID'] == svc_id['ID']
14201420
spec = services[0]['Spec']['TaskTemplate']['ContainerSpec']
14211421
assert 'CAP_SYSLOG' in spec['CapabilityDrop']
1422+
1423+
@requires_api_version('1.40')
1424+
def test_create_service_with_sysctl(self):
1425+
name = self.get_service_name()
1426+
sysctls = {
1427+
'net.core.somaxconn': '1024',
1428+
'net.ipv4.tcp_syncookies': '0',
1429+
}
1430+
container_spec = docker.types.ContainerSpec(
1431+
TEST_IMG, ['echo', 'hello'], sysctls=sysctls
1432+
)
1433+
task_tmpl = docker.types.TaskTemplate(container_spec)
1434+
svc_id = self.client.create_service(task_tmpl, name=name)
1435+
assert self.client.inspect_service(svc_id)
1436+
services = self.client.services(filters={'name': name})
1437+
assert len(services) == 1
1438+
assert services[0]['ID'] == svc_id['ID']
1439+
spec = services[0]['Spec']['TaskTemplate']['ContainerSpec']
1440+
assert spec['Sysctls']['net.core.somaxconn'] == '1024'
1441+
assert spec['Sysctls']['net.ipv4.tcp_syncookies'] == '0'

tests/unit/models_services_test.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ def test_get_create_service_kwargs(self):
2929
'constraints': ['foo=bar'],
3030
'preferences': ['bar=baz'],
3131
'platforms': [('x86_64', 'linux')],
32-
'maxreplicas': 1
32+
'maxreplicas': 1,
33+
'sysctls': {'foo': 'bar'}
3334
})
3435

3536
task_template = kwargs.pop('task_template')
@@ -59,5 +60,5 @@ def test_get_create_service_kwargs(self):
5960
assert task_template['Networks'] == [{'Target': 'somenet'}]
6061
assert set(task_template['ContainerSpec'].keys()) == {
6162
'Image', 'Command', 'Args', 'Hostname', 'Env', 'Dir', 'User',
62-
'Labels', 'Mounts', 'StopGracePeriod'
63+
'Labels', 'Mounts', 'StopGracePeriod', 'Sysctls'
6364
}

0 commit comments

Comments
 (0)