docker-builder 0.1.50 → 0.1.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/{Rakefile → Rakefile_temp} +8 -7
  3. data/install_local.sh +1 -1
  4. data/lib/docker_builder.rb +4 -1
  5. data/lib/docker_builder/cli.rb +23 -56
  6. data/lib/docker_builder/config.rb +75 -34
  7. data/lib/docker_builder/config/dsl.rb +17 -1
  8. data/lib/docker_builder/{manager.rb → manager_container.rb} +25 -308
  9. data/lib/docker_builder/manager_image.rb +103 -0
  10. data/lib/docker_builder/provisioner/base.rb +188 -0
  11. data/lib/docker_builder/provisioner/{provisioner_chef.rb → chef.rb} +5 -1
  12. data/lib/docker_builder/server_settings.rb +34 -64
  13. data/lib/docker_builder/version.rb +1 -1
  14. data/readme.md +118 -79
  15. data/temp_config.rb +17 -0
  16. metadata +8 -58
  17. data/examples/example-apps-php/.chef/knife.rb +0 -6
  18. data/examples/example-apps-php/config.rb +0 -19
  19. data/examples/example-apps-php/servers/apps-php/.chef/knife.rb +0 -2
  20. data/examples/example-apps-php/servers/apps-php/config.rb +0 -69
  21. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/README.md +0 -1
  22. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/metadata.rb +0 -9
  23. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/build.rb +0 -43
  24. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/install.rb +0 -55
  25. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/install_app.rb +0 -27
  26. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/install_host.rb +0 -9
  27. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/index.html.erb +0 -4
  28. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/nginx-sites/app.conf.erb +0 -55
  29. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/nginx-sites/app.conf.erb.1 +0 -55
  30. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/nginx-sites/default.conf.erb +0 -45
  31. data/examples/example-apps-php/servers/apps-php/readme.md +0 -0
  32. data/examples/example-apps-php/temp/apps-php.1.json +0 -14
  33. data/examples/example-base-chef/.chef/knife.rb +0 -6
  34. data/examples/example-base-chef/config.rb +0 -19
  35. data/examples/example-base-chef/readme.md +0 -8
  36. data/examples/example-base-chef/servers/my/.chef/knife.rb +0 -2
  37. data/examples/example-base-chef/servers/my/config.rb +0 -53
  38. data/examples/example-base-chef/servers/my/cookbooks/my/README.md +0 -1
  39. data/examples/example-base-chef/servers/my/cookbooks/my/metadata.rb +0 -9
  40. data/examples/example-base-chef/servers/my/cookbooks/my/recipes/build.rb +0 -23
  41. data/examples/example-base-chef/servers/my/cookbooks/my/recipes/install.rb +0 -0
  42. data/examples/example-base-chef/servers/my/cookbooks/my/recipes/install_host.rb +0 -9
  43. data/examples/example-base-chef/servers/my/readme.md +0 -0
  44. data/examples/example-kafka-zookeeper/config.rb +0 -87
  45. data/examples/example-kafka-zookeeper/servers/kafka/Dockerfile +0 -21
  46. data/examples/example-kafka-zookeeper/servers/kafka/README.md +0 -78
  47. data/examples/example-kafka-zookeeper/servers/kafka/files/LICENSE +0 -202
  48. data/examples/example-kafka-zookeeper/servers/kafka/files/broker-list.sh +0 -5
  49. data/examples/example-kafka-zookeeper/servers/kafka/files/create-topics.sh +0 -32
  50. data/examples/example-kafka-zookeeper/servers/kafka/files/download-kafka.sh +0 -5
  51. data/examples/example-kafka-zookeeper/servers/kafka/files/start-kafka-shell.sh +0 -2
  52. data/examples/example-kafka-zookeeper/servers/kafka/files/start-kafka.sh +0 -67
  53. data/examples/example-nginx/config.rb +0 -19
  54. data/examples/example-nginx/servers/nginx/.chef/knife.rb +0 -8
  55. data/examples/example-nginx/servers/nginx/config.rb +0 -55
  56. data/examples/example-nginx/servers/nginx/cookbooks/nginx/README.md +0 -1
  57. data/examples/example-nginx/servers/nginx/cookbooks/nginx/metadata.rb +0 -9
  58. data/examples/example-nginx/servers/nginx/cookbooks/nginx/recipes/build.rb +0 -10
  59. data/examples/example-nginx/servers/nginx/cookbooks/nginx/recipes/install.rb +0 -28
  60. data/examples/example-nginx/servers/nginx/cookbooks/nginx/recipes/install_host.rb +0 -9
  61. data/examples/example-nginx/servers/nginx/cookbooks/nginx/templates/index.html.erb +0 -4
  62. data/examples/example-nginx/servers/nginx/cookbooks/nginx/templates/nginx-sites/default.conf.erb +0 -45
  63. data/examples/example-nginx/servers/nginx/readme.md +0 -0
  64. data/examples/example-nginx/servers/nginx/scripts/install.sh +0 -3
  65. data/examples/example-nginx/temp/ex_nginx.json +0 -20
  66. data/examples/example-nginx/temp/nginx.json +0 -1
  67. data/examples/example-swarm-redis/config.rb +0 -61
  68. data/examples/example-swarm-redis/readme.md +0 -10
  69. data/lib/docker_builder/temp.rb +0 -1
@@ -0,0 +1,103 @@
1
+ module DockerBuilder
2
+ class ManagerImage
3
+
4
+ ###
5
+ def self.build_image(server_name, settings=nil)
6
+ puts "building image for #{server_name}..."
7
+ #puts "settings: #{settings}"
8
+ #puts "debug: #{settings['properties']}"
9
+
10
+ #settings = load_settings(server_name)
11
+
12
+ t = settings['build']['build_type']
13
+ if t=='' || t=='none'
14
+ #
15
+ puts "no build needed..."
16
+
17
+ elsif t.downcase=='dockerfile'
18
+ return build_image_with_dockerfile(settings)
19
+ elsif t=='chef'
20
+ return build_image_with_chef(settings)
21
+ elsif t=='packer'
22
+ return build_image_with_packer(settings)
23
+ end
24
+ end
25
+
26
+ def self.build_image_with_dockerfile(settings)
27
+ puts "build image with Dockerfile"
28
+
29
+ #cmd %Q(cd #{name} && docker build -t #{settings.image_name} . )
30
+ cmd %Q(docker build -t #{settings.image_name} #{settings.dir_server_root} )
31
+
32
+ end
33
+
34
+ def self.build_image_with_chef(settings)
35
+ puts "build image with chef"
36
+
37
+ # config json
38
+ save_chef_config(settings)
39
+
40
+ # check node
41
+ cmd %Q(cd #{Config.root_path} && chef exec knife node show #{settings.chef_node_name} -c #{chef_config_knife_path})
42
+
43
+
44
+ #cmd %Q(SERVER_NAME=#{settings.name} SERVER_PATH=#{settings.dir_server_root} chef exec chef-client -z -N #{settings.image_name} -j #{settings.filename_config_json} -c #{chef_config_knife_path} #{chef_recipe_path('chef_build_image.rb')} )
45
+ res_recipe = run_chef_recipe(settings, 'chef_build_image.rb')
46
+ end
47
+
48
+
49
+ def self.build_image_with_packer(settings)
50
+ require_relative '../../lib/docker_builder/builder/packer'
51
+
52
+ puts "build image with packer"
53
+
54
+ builder = DockerBuilder::Builder::Packer.new(settings)
55
+ builder.build
56
+ end
57
+
58
+
59
+ def self.destroy_image(server_name, settings={})
60
+ puts "destroying image for server #{server_name}"
61
+
62
+ cmd %Q(docker rmi #{settings.image_name} )
63
+ cmd %Q(docker rm -f chef.converge.#{settings.image_name} )
64
+
65
+ # delete chef data
66
+ if settings['build']['build_type']=='chef'
67
+ return destroy_image_chef(settings)
68
+ end
69
+ end
70
+
71
+
72
+ def self.destroy_image_chef(settings)
73
+ puts "destroying image with chef..."
74
+
75
+ # config json
76
+ save_chef_config(settings)
77
+
78
+ # destroy temp container
79
+ cmd %Q(docker rm -f chef-converge.#{settings.image_name} )
80
+
81
+ #
82
+ cmd %Q(cd #{Config.root_path} && chef exec knife node delete #{settings.chef_node_name} -y -c #{chef_config_knife_path})
83
+
84
+ res_recipe = run_chef_recipe(settings, 'chef_destroy_image.rb')
85
+
86
+ chef_remove_data(settings)
87
+
88
+ # work - before 2016-nov-19
89
+ #cmd %Q(cd #{Config.root_path} && chef exec knife node delete #{settings.chef_node_name} -y -c #{chef_config_knife_path})
90
+
91
+ # clean chef client, node
92
+ #cmd %Q(cd #{Config.root_path} && rm -f #{settings.filename_chef_node_json} )
93
+ #cmd %Q(cd #{Config.root_path} && rm -f #{settings.filename_chef_client_json} )
94
+ end
95
+
96
+
97
+ ###
98
+ def self.cmd(s)
99
+ Command.cmd(s)
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,188 @@
1
+ module DockerBuilder
2
+ module Provisioner
3
+ class Base
4
+
5
+ def self.run_provision_scripts_setup(settings)
6
+ #
7
+ setup_scripts = (settings['provision']['setup'] rescue [])
8
+ if setup_scripts
9
+ setup_scripts.each do |script|
10
+ _run_setup_script(settings, script)
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+
17
+ def self.run_provision_scripts_bootstrap(settings)
18
+ #
19
+ bootstrap_scripts = (settings['provision']['bootstrap'] rescue [])
20
+ if bootstrap_scripts
21
+ bootstrap_scripts.each do |script|
22
+ _run_bootstrap_script(settings, script)
23
+ end
24
+ end
25
+
26
+
27
+ =begin
28
+ # commented - 2017-02-22
29
+
30
+ #
31
+ install_node_script_type = (settings['install']['node']['script_type'] rescue nil)
32
+ install_bootstrap_script = (settings['install']['bootstrap']['script'] rescue nil)
33
+
34
+ if install_node_script_type && install_node_script_type=='chef_recipe'
35
+ # run container and provision with chef
36
+ #_run_container_chef(settings)
37
+
38
+ # ???
39
+ #_provision_container_chef_recipe(settings)
40
+
41
+ elsif install_node_script_type && install_node_script_type=='shell'
42
+ # docker run
43
+ #create_and_run_container(settings)
44
+
45
+ # provision with shell script
46
+ run_shell_script_in_container(settings, "install.sh")
47
+
48
+ else
49
+ # no script for provision
50
+ #_run_container_docker(settings)
51
+
52
+ # docker run
53
+ #create_and_run_container(settings)
54
+
55
+ end
56
+
57
+ # bootstrap
58
+ if install_bootstrap_script
59
+ #script = settings['install']['bootstrap']['script'] || '/opt/bootstrap/bootstrap.sh'
60
+
61
+ # bootstsrap with shell script
62
+ run_bootstrap_shell_script_in_container(settings, install_bootstrap_script)
63
+ end
64
+ =end
65
+
66
+ end
67
+
68
+ def self._run_bootstrap_script(settings, script)
69
+ puts "run BS script #{script}"
70
+
71
+ if script['type']=='shell' && script['run_from']=='host'
72
+ return _run_bootstrap_script_shell_from_host(settings, script)
73
+ elsif script['type']=='shell' && (script['run_from'].nil? || script['run_from']=='')
74
+ _run_bootstrap_script_shell_in_container(settings, script)
75
+ elsif script['type']=='chef'
76
+ # TODO: do it
77
+ _run_bootstrap_script_chef(settings, script)
78
+ end
79
+
80
+ return nil
81
+ end
82
+
83
+
84
+ ### provision - setup
85
+
86
+ def self._run_setup_script(settings, script)
87
+ puts "run script #{script}"
88
+ if script['type']=='shell'
89
+ return _run_setup_script_shell_from_host(settings, script)
90
+ end
91
+
92
+ return nil
93
+ end
94
+
95
+ def self._run_setup_script_shell_from_host(settings, script)
96
+ cmd %Q(cd #{settings.dir_server_root} && #{script['script']} )
97
+ end
98
+
99
+
100
+ def self._provision_container_chef_recipe(settings)
101
+ puts "provisioning container #{settings.container_name}"
102
+
103
+ #cmd %Q(SERVER_NAME=#{settings.name} chef-client -z -N #{settings.name} #{settings.name}/cookbooks/#{settings.name}/ )
104
+ end
105
+
106
+
107
+
108
+ ### provision - bootstrap
109
+
110
+ def self._run_bootstrap_script_shell_from_host(settings, script)
111
+ cmd %Q(cd #{settings.dir_server_root} && #{script['script']} )
112
+
113
+ end
114
+
115
+
116
+ def self._run_bootstrap_script_shell_in_container(settings, script)
117
+ script_path = script['script']
118
+ # exec
119
+ cmd %Q(docker exec #{settings.container_name} #{script_path} )
120
+ end
121
+
122
+ =begin
123
+ def self._install_container_provision_host(settings)
124
+ script_type = (settings['install']['host']['script_type'] rescue nil)
125
+ return true unless script_type
126
+
127
+ # run provision script on the host machine
128
+ if script_type=='chef_recipe'
129
+ return _install_container_provision_host_chef_recipe(settings)
130
+ else
131
+ # do nothing
132
+ end
133
+
134
+ true
135
+ end
136
+
137
+ #
138
+ def self._install_container_provision_host_chef_recipe(settings)
139
+ # run script on host machine
140
+ script_name = settings['install']['host']['script'] || 'install_host'
141
+
142
+ # check script exists
143
+ #script_path = "#{settings.name}/cookbooks/#{settings.name}/recipes/#{script_name}.rb"
144
+ #f = File.expand_path('.', script_path)
145
+
146
+ #if !File.exists?(f)
147
+ # puts "script not found: #{f}. Skipping"
148
+ # return false
149
+ #end
150
+
151
+ #puts "pwd= #{Dir.pwd}"
152
+ #puts "root = #{Config.root_path}"
153
+ #exit
154
+
155
+ #
156
+ res_chef = run_chef_recipe_server_recipe(settings, script_name)
157
+ #cmd %Q(SERVER_NAME=#{settings.name} chef-client -z -N #{settings.name} --override-runlist 'recipe[#{settings.name}::#{script_name}]' )
158
+
159
+ return true
160
+ end
161
+
162
+
163
+ =end
164
+
165
+ ### helpers - shell
166
+
167
+ def self.run_shell_script_in_container(settings, script_name)
168
+ script_path = settings.make_path_full("scripts/#{script_name}")
169
+
170
+ # copy
171
+ cmd %Q(cd #{Config.root_path} && docker cp #{script_path} #{settings.container_name}:/tmp/#{script_name} )
172
+
173
+ # exec
174
+ cmd %Q(docker exec #{settings.container_name} chmod +x /tmp/#{script_name} )
175
+ cmd %Q(docker exec #{settings.container_name} /tmp/#{script_name} )
176
+ end
177
+
178
+
179
+ ###
180
+ def self.cmd(s)
181
+ Command.cmd(s)
182
+ end
183
+
184
+
185
+ end
186
+ end
187
+ end
188
+
@@ -1,6 +1,6 @@
1
1
  module DockerBuilder
2
2
  module Provisioner
3
- class ProvisionerChef
3
+ class Chef
4
4
 
5
5
  attr_accessor :server
6
6
 
@@ -61,6 +61,10 @@ module DockerBuilder
61
61
  res
62
62
  end
63
63
 
64
+
65
+ ### run recipes
66
+
67
+
64
68
  end
65
69
  end
66
70
  end
@@ -2,6 +2,7 @@ module DockerBuilder
2
2
 
3
3
  class ServerSettings
4
4
  attr_accessor :properties
5
+ attr_accessor :common_config
5
6
 
6
7
  def get_binding
7
8
  return binding()
@@ -42,6 +43,23 @@ class ServerSettings
42
43
  end
43
44
 
44
45
  ### DSL
46
+
47
+
48
+ def build=(opts={})
49
+ build(opts)
50
+ end
51
+ def docker=(opts={})
52
+ docker(opts)
53
+ end
54
+ def provision=(opts={})
55
+ provision(opts)
56
+ end
57
+
58
+ def attributes=(opts={})
59
+ attributes(opts)
60
+ end
61
+
62
+
45
63
  def set(name, v)
46
64
  properties[name] = v
47
65
  end
@@ -91,20 +109,25 @@ class ServerSettings
91
109
 
92
110
 
93
111
  ###
112
+ def properties_common(opt_name)
113
+ common_config.options[opt_name] || common_config.send(opt_name)
114
+ end
115
+
94
116
  def prefix
95
- properties['common']['prefix']
117
+ #properties['common']['prefix']
118
+ properties_common('prefix')
96
119
  end
97
120
 
98
121
  def container_prefix
99
- "#{properties['common']['prefix']}#{properties['common']['container_prefix']}"
122
+ "#{prefix}#{properties_common('container_prefix')}"
100
123
  end
101
124
 
102
125
  def image_prefix
103
- "#{properties['common']['prefix']}#{properties['common']['image_prefix']}"
126
+ "#{prefix}#{properties_common('image_prefix')}"
104
127
  end
105
128
 
106
129
  def service_prefix
107
- "#{properties['common']['prefix']}#{properties['common']['service_prefix']}"
130
+ "#{prefix}#{properties_common('service_prefix')}"
108
131
  end
109
132
 
110
133
 
@@ -159,9 +182,10 @@ class ServerSettings
159
182
 
160
183
  #res = "$PWD/servers/#{self.name}/#{s}"
161
184
  res = File.expand_path(s, dir_server_root)
185
+ #res = File.expand_path(s, properties_common('root_path'))
162
186
 
163
187
  elsif v =~ /^\/\//
164
- res = self.properties['common']['dir_data']+(v.gsub /^\/\//, '')
188
+ res = dir_data_base+(v.gsub /^\/\//, '')
165
189
  elsif v =~ /^\//
166
190
  res = v
167
191
  else
@@ -171,8 +195,12 @@ class ServerSettings
171
195
  res
172
196
  end
173
197
 
198
+ def dir_data_base
199
+ "#{properties_common('dir_data')}"
200
+ end
201
+
174
202
  def dir_data
175
- "#{properties['common']['dir_data']}#{self.name}/"
203
+ "#{properties_common('dir_data')}#{self.name}/"
176
204
  end
177
205
 
178
206
 
@@ -189,8 +217,6 @@ class ServerSettings
189
217
  def docker_volumes
190
218
  a = properties['docker']['volumes'] || []
191
219
 
192
- #puts "volumes a=#{a}"
193
-
194
220
  # fix paths
195
221
  res = a.map do |r|
196
222
  path_local = volume_path_local(r[0])
@@ -198,8 +224,6 @@ class ServerSettings
198
224
  [path_local, r[1]]
199
225
  end
200
226
 
201
- #puts "volumes: #{res}"
202
-
203
227
  res
204
228
  end
205
229
 
@@ -334,58 +358,4 @@ class ServerSettings
334
358
 
335
359
  end
336
360
 
337
-
338
-
339
- class Settings
340
-
341
- def self.load_settings_for_server(name, opts={})
342
- settings = ServerSettings.new
343
-
344
- settings.set 'name', name
345
-
346
- # set from main Config
347
- Config.servers[name].each do |k,v|
348
- settings.properties[k]=v
349
- end
350
-
351
-
352
- #puts "current=#{File.dirname(__FILE__)}"
353
- #puts "ff=#{file_base_settings}"
354
-
355
- #
356
- #t = File.read(file_base_settings) rescue ''
357
- #eval(t, settings.get_binding)
358
-
359
-
360
- #
361
- f = file_settings_for_server(name)
362
- #puts "loading server settings from #{f}"
363
- t = File.read(f) rescue ''
364
- eval(t, settings.get_binding)
365
-
366
- #
367
- settings.properties['name'] ||= name
368
-
369
- # from common config
370
- settings.properties['common'] = Config.options[:common]
371
-
372
- settings
373
- end
374
-
375
-
376
- ### helpers
377
-
378
- def self.file_settings_for_server(name)
379
- #File.join(File.dirname(__FILE__), '..', 'config', "#{name}.rb")
380
- File.join(Config.root_path, 'servers', name, 'config.rb')
381
- end
382
-
383
- def self.file_base_settings
384
- File.join(File.dirname(__FILE__), '..', 'config' ,'common.rb')
385
- end
386
-
387
-
388
-
389
-
390
- end
391
361
  end