Skip to content

Commit 15030cb

Browse files
authored
Merge pull request #1661 from shin-/1622-service-tty
Add support for ContainerSpec.TTY
2 parents be8c144 + 06d2553 commit 15030cb

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

docker/api/service.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ def _check_api_features(version, task_template, update_config):
3838
'Placement.preferences is not supported in'
3939
' API version < 1.27'
4040
)
41+
if task_template.container_spec.get('TTY'):
42+
if utils.version_lt(version, '1.25'):
43+
raise errors.InvalidVersion(
44+
'ContainerSpec.TTY is not supported in API version < 1.25'
45+
)
4146

4247

4348
class ServiceApiMixin(object):

docker/models/services.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def create(self, image, command=None, **kwargs):
146146
of the service. Default: ``None``
147147
user (str): User to run commands as.
148148
workdir (str): Working directory for commands to run.
149+
tty (boolean): Whether a pseudo-TTY should be allocated.
149150
150151
Returns:
151152
(:py:class:`Service`) The created service.
@@ -212,6 +213,7 @@ def list(self, **kwargs):
212213
'mounts',
213214
'stop_grace_period',
214215
'secrets',
216+
'tty'
215217
]
216218

217219
# kwargs to copy straight over to TaskTemplate

docker/types/services.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,11 @@ class ContainerSpec(dict):
8484
terminate before forcefully killing it.
8585
secrets (list of py:class:`SecretReference`): List of secrets to be
8686
made available inside the containers.
87+
tty (boolean): Whether a pseudo-TTY should be allocated.
8788
"""
8889
def __init__(self, image, command=None, args=None, hostname=None, env=None,
8990
workdir=None, user=None, labels=None, mounts=None,
90-
stop_grace_period=None, secrets=None):
91+
stop_grace_period=None, secrets=None, tty=None):
9192
self['Image'] = image
9293

9394
if isinstance(command, six.string_types):
@@ -125,6 +126,9 @@ def __init__(self, image, command=None, args=None, hostname=None, env=None,
125126
raise TypeError('secrets must be a list')
126127
self['Secrets'] = secrets
127128

129+
if tty is not None:
130+
self['TTY'] = tty
131+
128132

129133
class Mount(dict):
130134
"""

tests/integration/api_service_test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,23 @@ def test_create_service_with_env(self):
359359
assert 'Env' in con_spec
360360
assert con_spec['Env'] == ['DOCKER_PY_TEST=1']
361361

362+
@requires_api_version('1.25')
363+
def test_create_service_with_tty(self):
364+
container_spec = docker.types.ContainerSpec(
365+
BUSYBOX, ['true'], tty=True
366+
)
367+
task_tmpl = docker.types.TaskTemplate(
368+
container_spec,
369+
)
370+
name = self.get_service_name()
371+
svc_id = self.client.create_service(task_tmpl, name=name)
372+
svc_info = self.client.inspect_service(svc_id)
373+
assert 'TaskTemplate' in svc_info['Spec']
374+
assert 'ContainerSpec' in svc_info['Spec']['TaskTemplate']
375+
con_spec = svc_info['Spec']['TaskTemplate']['ContainerSpec']
376+
assert 'TTY' in con_spec
377+
assert con_spec['TTY'] is True
378+
362379
def test_create_service_global_mode(self):
363380
container_spec = docker.types.ContainerSpec(
364381
BUSYBOX, ['echo', 'hello']

0 commit comments

Comments
 (0)