diff --git a/fig/cli/main.py b/fig/cli/main.py index 2c6a04020f7..02cf81746f7 100644 --- a/fig/cli/main.py +++ b/fig/cli/main.py @@ -276,6 +276,7 @@ def run(self, project, options): new container name. --entrypoint CMD Override the entrypoint of the image. -e KEY=VAL Set an environment variable (can be used multiple times) + -u --user USER Run as specified user. --no-deps Don't start linked services. --rm Remove container after run. Ignored in detached mode. -T Disable pseudo-tty allocation. By default `fig run` @@ -320,6 +321,10 @@ def run(self, project, options): if options['--entrypoint']: container_options['entrypoint'] = options.get('--entrypoint') + + if options['--user']: + container_options['user'] = options.get('--user') + container = service.create_container( one_off=True, insecure_registry=insecure_registry, diff --git a/tests/fixtures/user-figfile/fig.yml b/tests/fixtures/user-figfile/fig.yml new file mode 100644 index 00000000000..6251319877f --- /dev/null +++ b/tests/fixtures/user-figfile/fig.yml @@ -0,0 +1,3 @@ +service: + image: busybox:latest + command: id diff --git a/tests/integration/cli_test.py b/tests/integration/cli_test.py index f03d72d2d88..0675ade1cce 100644 --- a/tests/integration/cli_test.py +++ b/tests/integration/cli_test.py @@ -1,6 +1,7 @@ from __future__ import absolute_import import sys +from docker.errors import APIError from six import StringIO from mock import patch @@ -8,6 +9,7 @@ from fig.cli.main import TopLevelCommand + class CLITestCase(DockerClientTestCase): def setUp(self): super(CLITestCase, self).setUp() @@ -217,6 +219,21 @@ def test_run_service_with_entrypoint_overridden(self, _): u'/bin/echo helloworld' ) + @patch('dockerpty.start') + def test_run_service_with_user_overridden(self, _): + name = 'service' + self.command.base_dir = 'tests/fixtures/user-figfile' + # NOTE(chmou): available in default busybox and has a shell + user = 'sshd' + args = ['run', '--user', user, name] + + self.command.dispatch(args, None) + + service = self.project.get_service(name) + container = service.containers(stopped=True, one_off=True)[0] + container.inspect() + self.assertEqual(user, container.dictionary['Config']['User']) + @patch('dockerpty.start') def test_run_service_with_environement_overridden(self, _): name = 'service'