From 1751899996d6e7c78fedd10904b2fa92e45a4ef7 Mon Sep 17 00:00:00 2001 From: satoru Date: Sun, 17 Aug 2014 20:13:28 +0800 Subject: [PATCH] Add support for the --entrypoint option of docker run Signed-off-by: Satoru Logic --- .gitignore | 1 + fig/cli/main.py | 15 +++++++++------ fig/container.py | 8 ++++++-- .../dockerfile_with_entrypoint/Dockerfile | 2 ++ tests/fixtures/dockerfile_with_entrypoint/fig.yml | 2 ++ tests/integration/cli_test.py | 15 +++++++++++++++ 6 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 tests/fixtures/dockerfile_with_entrypoint/Dockerfile create mode 100644 tests/fixtures/dockerfile_with_entrypoint/fig.yml diff --git a/.gitignore b/.gitignore index d987f272caa..56fd3a8cffe 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /docs/_site /venv fig.spec +*.sw[op] diff --git a/fig/cli/main.py b/fig/cli/main.py index eb19d46d8a4..787d477e63c 100644 --- a/fig/cli/main.py +++ b/fig/cli/main.py @@ -221,12 +221,11 @@ def run(self, project, options): Usage: run [options] SERVICE [COMMAND] [ARGS...] Options: - -d Detached mode: Run container in the background, print - new container name. - -T Disable pseudo-tty allocation. By default `fig run` - allocates a TTY. - --rm Remove container after run. Ignored in detached mode. - --no-deps Don't start linked services. + -d Detached mode: Run container in the background, print new container name. + -T Disable pseudo-tty allocation. By default `fig run` allocates a TTY. + --rm Remove container after run. Ignored in detached mode. + --no-deps Don't start linked services. + --entrypoint= Override entrypoint of the image. """ service = project.get_service(options['SERVICE']) @@ -254,6 +253,10 @@ def run(self, project, options): 'tty': tty, 'stdin_open': not options['-d'], } + + if options['--entrypoint']: + container_options['entrypoint'] = options.get('--entrypoint') + container = service.create_container(one_off=True, **container_options) if options['-d']: service.start_container(container, ports=None, one_off=True) diff --git a/fig/container.py b/fig/container.py index dc3366a6ea2..c9b073a902c 100644 --- a/fig/container.py +++ b/fig/container.py @@ -89,8 +89,12 @@ def human_readable_state(self): @property def human_readable_command(self): self.inspect_if_not_inspected() - if self.dictionary['Config']['Cmd']: - return ' '.join(self.dictionary['Config']['Cmd']) + config = self.dictionary['Config'] + entrypoint = config['Entrypoint'] or [] + cmd = config['Cmd'] or [] + whole_cmd = entrypoint + cmd + if whole_cmd: + return ' '.join(whole_cmd) else: return '' diff --git a/tests/fixtures/dockerfile_with_entrypoint/Dockerfile b/tests/fixtures/dockerfile_with_entrypoint/Dockerfile new file mode 100644 index 00000000000..7d28d29332c --- /dev/null +++ b/tests/fixtures/dockerfile_with_entrypoint/Dockerfile @@ -0,0 +1,2 @@ +FROM busybox:latest +ENTRYPOINT echo "From prebuilt entrypoint" diff --git a/tests/fixtures/dockerfile_with_entrypoint/fig.yml b/tests/fixtures/dockerfile_with_entrypoint/fig.yml new file mode 100644 index 00000000000..a10381187ab --- /dev/null +++ b/tests/fixtures/dockerfile_with_entrypoint/fig.yml @@ -0,0 +1,2 @@ +service: + build: tests/fixtures/dockerfile_with_entrypoint diff --git a/tests/integration/cli_test.py b/tests/integration/cli_test.py index d0c8585ea36..5e967cab4df 100644 --- a/tests/integration/cli_test.py +++ b/tests/integration/cli_test.py @@ -184,6 +184,21 @@ def test_run_without_command(self, __): [u'/bin/true'], ) + @patch('dockerpty.start') + def test_run_service_with_entrypoint_overridden(self, _): + self.command.base_dir = 'tests/fixtures/dockerfile_with_entrypoint' + name = 'service' + self.command.dispatch( + ['run', '--entrypoint', '/bin/echo', name, 'helloworld'], + None + ) + service = self.project.get_service(name) + container = service.containers(stopped=True, one_off=True)[0] + self.assertEqual( + container.human_readable_command, + u'/bin/echo helloworld' + ) + def test_rm(self): service = self.project.get_service('simple') service.create_container()