浏览代码

Allow overriding environements on command line

Add a new command line option -e to override environement variables when
running a service.

Signed-off-by: Chmouel Boudjnah <[email protected]>
Chmouel Boudjnah 11 年之前
父节点
当前提交
92249364b6
共有 3 个文件被更改,包括 36 次插入1 次删除
  1. 9 1
      fig/cli/main.py
  2. 7 0
      tests/fixtures/environment-figfile/fig.yml
  3. 20 0
      tests/integration/cli_test.py

+ 9 - 1
fig/cli/main.py

@@ -261,12 +261,13 @@ class TopLevelCommand(Command):
         running. If you do not want to start linked services, use
         `fig run --no-deps SERVICE COMMAND [ARGS...]`.
 
-        Usage: run [options] SERVICE [COMMAND] [ARGS...]
+        Usage: run [options] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
 
         Options:
             -d                Detached mode: Run container in the background, print
                               new container name.
             --entrypoint CMD  Override the entrypoint of the image.
+            -e KEY=VAL        Set an environment variable (can be used multiple times)
             --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`
@@ -299,6 +300,13 @@ class TopLevelCommand(Command):
             'stdin_open': not options['-d'],
         }
 
+        if options['-e']:
+            for option in options['-e']:
+                if 'environment' not in service.options:
+                    service.options['environment'] = {}
+                k, v = option.split('=', 1)
+                service.options['environment'][k] = v
+
         if options['--entrypoint']:
             container_options['entrypoint'] = options.get('--entrypoint')
 

+ 7 - 0
tests/fixtures/environment-figfile/fig.yml

@@ -0,0 +1,7 @@
+service:
+  image: busybox:latest
+  command: sleep 5
+
+  environment:
+    foo: bar
+    hello: world

+ 20 - 0
tests/integration/cli_test.py

@@ -206,6 +206,26 @@ class CLITestCase(DockerClientTestCase):
             u'/bin/echo helloworld'
         )
 
+    @patch('dockerpty.start')
+    def test_run_service_with_environement_overridden(self, _):
+        name = 'service'
+        self.command.base_dir = 'tests/fixtures/environment-figfile'
+        self.command.dispatch(
+            ['run', '-e', 'foo=notbar', '-e', 'allo=moto=bobo',
+             '-e', 'alpha=beta', name],
+            None
+        )
+        service = self.project.get_service(name)
+        container = service.containers(stopped=True, one_off=True)[0]
+        # env overriden
+        self.assertEqual('notbar', container.environment['foo'])
+        # keep environement from yaml
+        self.assertEqual('world', container.environment['hello'])
+        # added option from command line
+        self.assertEqual('beta', container.environment['alpha'])
+        # make sure a value with a = don't crash out
+        self.assertEqual('moto=bobo', container.environment['allo'])
+
     def test_rm(self):
         service = self.project.get_service('simple')
         service.create_container()