2 # Licensed under the Apache License, Version 2.0 (the "License"); you may
3 # not use this file except in compliance with the License. You may obtain
4 # a copy of the License at
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11 # License for the specific language governing permissions and limitations
20 docker_cmd = '/bin/docker'
22 # Tool to start docker containers as configured via
23 # tripleo-heat-templates.
25 # This tool reads data from a json file generated from heat when the
26 # TripleO stack is run. All the configuration data used to start the
27 # containerized services is in this file.
29 # By default this tool lists all the containers that are started and
32 # If you wish to see the command line used to start a given container,
33 # specify it by name using the --container argument. --run can then be
34 # used with this to actually execute docker to run the container.\n
36 # Other options listed allow you to modify this command line for
37 # debugging purposes. For example:
39 # docker-toool -c swift-proxy -r -e /bin/bash -u root -i -n test
41 # will run the swift proxy container as user root, executing /bin/bash,
43 # named 'test', and will run interactively (eg -ti).
47 parser = argparse.ArgumentParser("Tool to start docker containers via "
48 "TripleO configurations")
49 parser.add_argument('-f', '--config',
50 help="""File to use as docker startup configuration data.""",
51 default='/var/lib/docker-container-startup-configs.json')
52 parser.add_argument('-r', '--run',
54 help="""Run the container as specified with --container.""",
56 parser.add_argument('-e', '--command',
57 help="""Override the command used to run the container.""",
59 parser.add_argument('-c', '--container',
60 help="""Specify a container to run or show the command for.""",
62 parser.add_argument('-u', '--user',
63 help="""User to run container as.""",
65 parser.add_argument('-n', '--name',
66 help="""Name of container.""",
68 parser.add_argument('-i', '--interactive',
70 help="""Start docker container interactively (-ti).""",
72 parser.add_argument('-d', '--detach',
74 help="""Start container detached.""",
76 opts = parser.parse_args(argv[1:])
81 def docker_arg_map(key, value):
82 value = str(value).encode('ascii', 'ignore')
87 'environment': "--env=%s" % value,
89 'net': "--net=%s" % value,
90 'pid': "--pid=%s" % value,
91 'privileged': "--privileged=%s" % value.lower(),
92 'user': "--user=%s" % value,
93 'volumes': "--volume=%s" % value,
94 'volumes_from': "--volumes-from=%s" % value,
98 def run_docker_container(opts, container_name):
99 container_found = False
101 with open(opts.config) as f:
102 json_data = json.load(f)
104 for step in (json_data or []):
107 for container in (json_data[step] or []):
108 if container == container_name:
109 print('container found: %s' % container)
110 container_found = True
111 # A few positional arguments:
119 opts.name or container
121 for container_data in (json_data[step][container] or []):
122 if container_data == "environment":
123 for env in (json_data[step][container][container_data] or []):
124 arg = docker_arg_map("environment", env)
127 elif container_data == "volumes":
128 for volume in (json_data[step][container][container_data] or []):
129 arg = docker_arg_map("volumes", volume)
132 elif container_data == "volumes_from":
133 for volume in (json_data[step][container][container_data] or []):
134 arg = docker_arg_map("volumes_from", volume)
137 elif container_data == 'command':
138 command = json_data[step][container][container_data]
139 elif container_data == 'image':
140 image = json_data[step][container][container_data]
142 # Only add a restart if we're not interactive
143 if container_data == 'restart':
146 if container_data == 'user':
149 arg = docker_arg_map(container_data,
150 json_data[step][container][container_data])
156 cmd.append(opts.user)
158 cmd.append('--detach')
161 # May as well remove it when we're done too
165 cmd.append(opts.command)
172 os.execl(docker_cmd, *cmd)
174 if not container_found:
175 print("Container '%s' not found!" % container_name)
178 def list_docker_containers(opts):
179 with open(opts.config) as f:
180 json_data = json.load(f)
182 for step in (json_data or []):
185 for container in (json_data[step] or []):
186 print('\tcontainer: %s' % container)
187 for container_data in (json_data[step][container] or []):
188 if container_data == "start_order":
189 print('\t\tstart_order: %s' % json_data[step][container][container_data])
191 opts = parse_opts(sys.argv)
194 run_docker_container(opts, opts.container)
196 list_docker_containers(opts)