indocker 0.0.2 → 0.0.5

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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +42 -6
  3. data/bin/indocker +1 -1
  4. data/indocker.gemspec +4 -0
  5. data/lib/indocker/application_initializer.rb +1 -12
  6. data/lib/indocker/cli.rb +10 -0
  7. data/lib/indocker/configs/config.rb +93 -22
  8. data/lib/indocker/configs/config_factory.rb +17 -16
  9. data/lib/indocker/configs/config_initializer.rb +9 -0
  10. data/lib/indocker/container/container_builder.rb +29 -0
  11. data/lib/indocker/{directives → container}/container_directives_runner.rb +8 -0
  12. data/lib/indocker/container/container_dsl.rb +26 -3
  13. data/lib/indocker/container/container_inspector.rb +26 -0
  14. data/lib/indocker/container/container_manager.rb +43 -32
  15. data/lib/indocker/container/container_metadata.rb +31 -26
  16. data/lib/indocker/container/container_metadata_factory.rb +5 -2
  17. data/lib/indocker/directives/base.rb +6 -10
  18. data/lib/indocker/directives/container_directives/base.rb +4 -0
  19. data/lib/indocker/directives/container_directives/cmd.rb +7 -0
  20. data/lib/indocker/directives/container_directives/env.rb +7 -0
  21. data/lib/indocker/directives/container_directives/env_file.rb +3 -3
  22. data/lib/indocker/directives/container_directives/from.rb +4 -2
  23. data/lib/indocker/directives/container_directives/ports.rb +11 -4
  24. data/lib/indocker/directives/container_directives/volume.rb +23 -0
  25. data/lib/indocker/directives/{docker_directives → image_directives}/base.rb +13 -1
  26. data/lib/indocker/directives/{docker_directives → image_directives}/cmd.rb +5 -1
  27. data/lib/indocker/directives/image_directives/copy.rb +32 -0
  28. data/lib/indocker/directives/{prepare_directives → image_directives}/docker_cp.rb +5 -1
  29. data/lib/indocker/directives/{docker_directives → image_directives}/entrypoint.rb +5 -1
  30. data/lib/indocker/directives/image_directives/env.rb +9 -0
  31. data/lib/indocker/directives/image_directives/env_file.rb +19 -0
  32. data/lib/indocker/directives/image_directives/expose.rb +9 -0
  33. data/lib/indocker/directives/image_directives/from.rb +36 -0
  34. data/lib/indocker/directives/image_directives/registry.rb +30 -0
  35. data/lib/indocker/directives/image_directives/run.rb +17 -0
  36. data/lib/indocker/directives/image_directives/workdir.rb +9 -0
  37. data/lib/indocker/directives/partial.rb +9 -1
  38. data/lib/indocker/docker_api/container_config.rb +121 -0
  39. data/lib/indocker/{docker_api.rb → docker_api/docker_api.rb} +79 -52
  40. data/lib/indocker/dsl_context.rb +4 -0
  41. data/lib/indocker/envs/env_metadata.rb +4 -0
  42. data/lib/indocker/errors.rb +5 -1
  43. data/lib/indocker/git/git_api.rb +32 -0
  44. data/lib/indocker/git/git_helper.rb +34 -0
  45. data/lib/indocker/git/git_service.rb +21 -0
  46. data/lib/indocker/handlers/{run_container.rb → container_run.rb} +4 -13
  47. data/lib/indocker/handlers/container_stop.rb +17 -0
  48. data/lib/indocker/handlers/performable.rb +22 -0
  49. data/lib/indocker/image/image_builder.rb +22 -7
  50. data/lib/indocker/image/image_dependencies_manager.rb +13 -9
  51. data/lib/indocker/image/image_directives_runner.rb +99 -0
  52. data/lib/indocker/image/image_dockerfile_builder.rb +24 -0
  53. data/lib/indocker/image/image_dsl.rb +38 -18
  54. data/lib/indocker/image/image_evaluator.rb +1 -1
  55. data/lib/indocker/image/image_helper.rb +9 -0
  56. data/lib/indocker/image/image_metadata.rb +9 -9
  57. data/lib/indocker/image/image_metadata_factory.rb +11 -10
  58. data/lib/indocker/image/image_metadata_repository.rb +8 -9
  59. data/lib/indocker/registry/registry_api.rb +46 -0
  60. data/lib/indocker/registry/registry_helper.rb +20 -0
  61. data/lib/indocker/registry/registry_service.rb +28 -0
  62. data/lib/indocker/utils/logger_factory.rb +1 -0
  63. data/lib/indocker/utils/registry_authenticator.rb +5 -5
  64. data/lib/indocker/utils/tar_helper.rb +5 -5
  65. data/lib/indocker/version.rb +1 -1
  66. data/lib/indocker/volumes/volume_metadata.rb +9 -0
  67. data/lib/indocker/volumes/volume_metadata_factory.rb +9 -0
  68. data/lib/indocker/volumes/volume_metadata_repository.rb +34 -0
  69. data/lib/indocker.rb +56 -27
  70. data/spec/example/.indocker/config.rb +14 -7
  71. data/spec/fixtures/spec.env +2 -0
  72. data/spec/indocker/configs/config_spec.rb +52 -1
  73. data/spec/indocker/container/container_builder_spec.rb +67 -0
  74. data/spec/indocker/container/container_manager_spec.rb +177 -129
  75. data/spec/indocker/docker_api/container_config_spec.rb +64 -0
  76. data/spec/indocker/{utils → docker_api}/docker_api_spec.rb +38 -13
  77. data/spec/indocker/handlers/container_run_spec.rb +60 -0
  78. data/spec/indocker/image/image_builder_spec.rb +64 -26
  79. data/spec/indocker/image/image_directives_runner_spec.rb +141 -0
  80. data/spec/indocker/image/image_dockerfile_builder_spec.rb +25 -0
  81. data/spec/indocker/image/image_evaluator_spec.rb +29 -9
  82. data/spec/spec_helper.rb +38 -16
  83. metadata +108 -32
  84. data/lib/indocker/directives/docker_directives/copy.rb +0 -27
  85. data/lib/indocker/directives/docker_directives/env.rb +0 -5
  86. data/lib/indocker/directives/docker_directives/from.rb +0 -30
  87. data/lib/indocker/directives/docker_directives/run.rb +0 -5
  88. data/lib/indocker/directives/docker_directives/workdir.rb +0 -5
  89. data/lib/indocker/directives/image_directives_runner.rb +0 -120
  90. data/lib/indocker/directives/prepare_directives/base.rb +0 -6
  91. data/lib/indocker/envs/manager.rb +0 -30
  92. data/lib/indocker/handlers/base.rb +0 -13
  93. data/spec/indocker/directives/image_directives_runner_spec.rb +0 -121
  94. data/spec/indocker/handlers/run_container_spec.rb +0 -107
  95. data/spec/tmp/indocker_list_container_files/deeper/example3.txt +0 -1
  96. data/spec/tmp/indocker_list_container_files/deeper/example4.txt +0 -1
  97. data/spec/tmp/indocker_list_container_files/example1.txt +0 -1
  98. data/spec/tmp/indocker_list_container_files/example2.txt +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fdb2662214284a258402e89353e394035152a7c7
4
- data.tar.gz: 783bc54b20a2d70d7382b3d9f7822ff07b5f15a8
3
+ metadata.gz: bbe4627a9f936ec5d771857d794648c14cb5ebf8
4
+ data.tar.gz: 58d394820260d8b77bddbd87c72d56df2682c317
5
5
  SHA512:
6
- metadata.gz: 4d614dd32a0202080dafb6f9d6469fb1a8158804ba86a58556c6c74f1f1a5d7ebab8941a658696752bde584893c507d0dd85f59eece3a7b57472fe18d4b62e98
7
- data.tar.gz: 3d6cd30433a7c2173633b30b730783d32f43b2869310f678fe404ad11c47da2386491b6ec2b5484e24372245df9a891cdf50e313e0ff60951b4e847d256b5bf8
6
+ metadata.gz: d57be13657ee31659a52d4adcec2deec04e12ee2f6b8e9f2addfbc3483c4e59410b551fd13416f35607c38e4c576639fa119f30b16b1369d7b717949e529888f
7
+ data.tar.gz: d4e51c196fb6ea6532f957bef347f0f6c01e92cf383ded6b902c6fb467525c271fa5b8cd8e2d51ecca7a0c5fcbc87624c6bcbb4e40c25b1dedce1fe0ddffb51b
data/Gemfile.lock CHANGED
@@ -1,9 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- indocker (0.0.0)
4
+ indocker (0.0.5)
5
+ byebug
5
6
  colorize
6
7
  docker-api
8
+ docker_registry2
9
+ git
7
10
  smart_ioc
8
11
  thor
9
12
 
@@ -12,13 +15,45 @@ GEM
12
15
  specs:
13
16
  byebug (9.1.0)
14
17
  colorize (0.8.1)
15
- docker-api (1.33.6)
16
- excon (>= 0.38.0)
17
- json
18
+ diff-lcs (1.3)
19
+ docker-api (1.34.0)
20
+ excon (>= 0.47.0)
21
+ multi_json
22
+ docker_registry2 (1.3.0)
23
+ rest-client (>= 1.8.0)
24
+ domain_name (0.5.20170404)
25
+ unf (>= 0.0.5, < 1.0.0)
18
26
  excon (0.59.0)
19
- json (2.1.0)
27
+ git (1.3.0)
28
+ http-cookie (1.0.3)
29
+ domain_name (~> 0.5)
30
+ mime-types (3.1)
31
+ mime-types-data (~> 3.2015)
32
+ mime-types-data (3.2016.0521)
33
+ multi_json (1.12.2)
34
+ netrc (0.11.0)
35
+ rest-client (2.0.2)
36
+ http-cookie (>= 1.0.2, < 2.0)
37
+ mime-types (>= 1.16, < 4.0)
38
+ netrc (~> 0.8)
39
+ rspec (3.7.0)
40
+ rspec-core (~> 3.7.0)
41
+ rspec-expectations (~> 3.7.0)
42
+ rspec-mocks (~> 3.7.0)
43
+ rspec-core (3.7.0)
44
+ rspec-support (~> 3.7.0)
45
+ rspec-expectations (3.7.0)
46
+ diff-lcs (>= 1.2.0, < 2.0)
47
+ rspec-support (~> 3.7.0)
48
+ rspec-mocks (3.7.0)
49
+ diff-lcs (>= 1.2.0, < 2.0)
50
+ rspec-support (~> 3.7.0)
51
+ rspec-support (3.7.0)
20
52
  smart_ioc (0.2.1)
21
53
  thor (0.20.0)
54
+ unf (0.1.4)
55
+ unf_ext
56
+ unf_ext (0.0.7.4)
22
57
 
23
58
  PLATFORMS
24
59
  ruby
@@ -26,6 +61,7 @@ PLATFORMS
26
61
  DEPENDENCIES
27
62
  byebug
28
63
  indocker!
64
+ rspec
29
65
 
30
66
  BUNDLED WITH
31
- 1.15.4
67
+ 1.16.0.pre.3
data/bin/indocker CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  require 'rubygems'
5
5
  require 'bundler/setup'
6
- require 'indocker'
6
+ require_relative '../lib/indocker'
7
7
 
8
8
  # $thor_runner = true
9
9
  Indocker::CLI::Application.start( ARGV )
data/indocker.gemspec CHANGED
@@ -13,11 +13,15 @@ Gem::Specification.new do |s|
13
13
  s.test_files = s.files.grep(%r{^(spec)/})
14
14
 
15
15
  s.add_development_dependency "byebug"
16
+ s.add_development_dependency "rspec"
16
17
 
17
18
  s.add_dependency "smart_ioc"
18
19
  s.add_dependency "docker-api"
20
+ s.add_dependency "docker_registry2"
19
21
  s.add_dependency "thor"
20
22
  s.add_dependency "colorize"
23
+ s.add_dependency "git"
24
+ s.add_dependency "byebug" # TODO: remove after release
21
25
 
22
26
  s.homepage = 'https://github.com/droidlabs/indocker'
23
27
  s.license = 'MIT'
@@ -6,25 +6,14 @@ class Indocker::ApplicationInitializer
6
6
  inject :config_locator
7
7
  inject :docker_api
8
8
  inject :registry_authenticator
9
- inject :envs_manager
10
9
  inject :config
11
10
 
12
11
 
13
12
  def init_app(current_path, env: :development)
14
13
  docker_api.check_docker_installed!
15
14
 
16
- config.root(
17
- Pathname.new(
18
- File.expand_path(
19
- File.join(config_locator.locate(current_path), '../..')
20
- )
21
- )
22
- )
23
-
24
15
  require(config_locator.locate(current_path))
25
16
 
26
- registry_authenticator.authenticate!
27
-
28
- envs_manager.load_init_application_env_variables
17
+ # registry_authenticator.authenticate!()
29
18
  end
30
19
  end
data/lib/indocker/cli.rb CHANGED
@@ -12,6 +12,16 @@ module Indocker
12
12
  env: env
13
13
  )
14
14
  end
15
+
16
+ desc "container:stop CONTAINER_NAME", "stops specified container"
17
+ option :env
18
+ define_method('container:stop') do |name, env = :development|
19
+ ioc.stop_container_handler.perform(
20
+ name: name,
21
+ current_path: Dir.pwd,
22
+ env: env
23
+ )
24
+ end
15
25
  end
16
26
  end
17
27
  end
@@ -1,21 +1,41 @@
1
1
  module Indocker::Configs
2
2
  class Config
3
+ attr_reader :scope
4
+
3
5
  def scope
4
- @scope ||= Hash.new({})
6
+ @scope ||= Hash.new()
7
+ end
8
+
9
+ def options
10
+ scope.reject {|_, opt| opt.is_a?(Indocker::Configs::Config)}.keys
11
+ end
12
+
13
+ def configs
14
+ scope.select {|_, opt| opt.is_a?(Indocker::Configs::Config)}.keys
5
15
  end
6
16
 
7
17
  def set(&block)
8
18
  instance_exec(&block)
19
+
20
+ self
9
21
  end
10
22
 
11
- def option(name, group: :default, type: :string)
12
- define_singleton_method(name) do |value = nil, &block|
13
- write_value = block || value
23
+ def option(name, group: nil, type: nil, required: nil)
24
+ raise Indocker::Errors::ReservedKeywordUsed, name if respond_to?(name.to_sym)
14
25
 
15
- if write_value
16
- validate!(name, write_value, type)
26
+ define_singleton_method(name) do |value = nil, &block|
27
+ if type == :config and options.include?(name) and block
28
+ return read_setting(name).set(&block)
29
+ end
17
30
 
18
- write_setting(name, write_value, group)
31
+ if block || value
32
+ write_setting(
33
+ name: name,
34
+ value: block || value,
35
+ group: group,
36
+ type: type,
37
+ required: required
38
+ )
19
39
  else
20
40
  read_setting(name)
21
41
  end
@@ -23,32 +43,87 @@ module Indocker::Configs
23
43
  end
24
44
 
25
45
  def config(name, group: :default, &block)
46
+ raise Indocker::Errors::ReservedKeywordUsed, name if respond_to?(name.to_sym)
47
+
26
48
  subconfiguration = Indocker::Configs::Config.new
27
49
  subconfiguration.instance_exec(&block)
28
50
 
29
51
  option(name, group: group, type: :config)
30
52
  send(name, subconfiguration)
53
+
54
+ subconfiguration
55
+ end
56
+
57
+ def hash_config(hash_config_name, group: :default, &hash_config_block)
58
+ raise Indocker::Errors::ReservedKeywordUsed, hash_config_name if respond_to?(hash_config_name.to_sym)
59
+
60
+ define_singleton_method(hash_config_name) do |name, &self_block|
61
+ config = config(name, &hash_config_block)
62
+ config.set(&self_block)
63
+
64
+ config
65
+ end
31
66
  end
32
67
 
33
- def read_setting(key)
34
- read_value = scope[key.to_s][:value]
68
+ private
69
+
70
+ def read_setting(name)
71
+ read_value = scope.has_key?(name.intern) ? scope[name.intern].value : nil
35
72
 
36
73
  read_value.is_a?(Proc) ? read_value.call : read_value
37
74
  end
38
75
 
39
- def write_setting(key, value, group)
40
- scope[key.to_s] = {
41
- value: value,
42
- group: group
43
- }
76
+ def write_setting(name:, value:, group:, type:, required:)
77
+ new_option = Option.new(
78
+ name: name,
79
+ value: value,
80
+ group: group,
81
+ required: required,
82
+ type: type
83
+ )
84
+
85
+ new_option.validate!
86
+
87
+ scope[name.intern] = new_option
44
88
  end
45
89
 
46
- def validate!(name, value, type)
47
- value_type = cast_class_to_type(value)
48
90
 
49
- if type != value_type
91
+ def method_missing(method, *args, &block)
92
+ raise "Undefined keyword #{method.inspect} for Indocker configuration file"
93
+ end
94
+ end
95
+
96
+ class Option
97
+ attr_reader :value, :required, :type, :group
98
+
99
+ def initialize(name:, value:, required: nil, type: nil, group: nil)
100
+ @name = name
101
+ @value = value
102
+ @required = required || false
103
+ @type = type || :string
104
+ @group = group || :default
105
+ end
106
+
107
+ def validate!
108
+ check_required
109
+ check_type
110
+ end
111
+
112
+ private
113
+
114
+ def check_required
115
+ if @required && @value.nil?
116
+ raise Indocker::Errors::ConfigInitializationError,
117
+ "Configuration option :#{option} is required"
118
+ end
119
+ end
120
+
121
+ def check_type
122
+ value_type = cast_class_to_type(@value)
123
+
124
+ if @type != value_type
50
125
  raise Indocker::Errors::ConfigOptionTypeMismatch,
51
- "Expected option #{name.inspect} => #{value.inspect} to be a #{type.inspect}, not a #{value_type.inspect}"
126
+ "Expected option #{@name.inspect} => #{@value.inspect} to be a #{@type.inspect}, not a #{value_type.inspect}"
52
127
  end
53
128
 
54
129
  nil
@@ -68,9 +143,5 @@ module Indocker::Configs
68
143
  Indocker::StringUtils.underscore(value.class.name).to_sym
69
144
  end
70
145
  end
71
-
72
- def method_missing(method, *args, &block)
73
- raise "Undefined keyword #{method.inspect} for Indocker configuration file"
74
- end
75
146
  end
76
147
  end
@@ -4,33 +4,34 @@ class Indocker::Configs::ConfigFactory
4
4
  bean :config, factory_method: :build
5
5
 
6
6
  CONFIG_STRUCTURE = Proc.new do
7
- option :namespace, group: :common
8
- option :root, group: :common, type: :pathname
7
+ option :namespace, group: :common, type: :symbol
8
+ option :build_dir, group: :common, type: :pathname
9
9
 
10
10
  option :load_env_file, group: :load, type: :array
11
11
  option :load_docker_items, group: :load, type: :array
12
12
 
13
13
  config :git, group: :git do
14
- option :repository
15
- option :tag
16
- option :branch
17
- option :workdir
14
+ option :cache_dir, group: :common, type: :pathname
15
+
16
+ hash_config :repo do
17
+ option :repository
18
+ option :tag
19
+ option :branch
20
+ end
18
21
  end
19
22
 
20
23
  config :docker, group: :docker do
21
- option :registry
22
- option :email
23
- option :password
24
- option :username
25
- option :skip_push, type: :boolean
24
+ hash_config :registry do
25
+ option :serveraddress, required: true
26
+ option :email
27
+ option :password
28
+ option :username
29
+ option :skip_push, type: :boolean
30
+ end
26
31
  end
27
32
  end
28
33
 
29
34
  def build(&block)
30
- return @configuration if @configuration
31
-
32
- @configuration = Indocker::Configs::Config.new
33
- @configuration.instance_exec(&CONFIG_STRUCTURE)
34
- @configuration
35
+ @configuration ||= Indocker::Configs::Config.new.set(&CONFIG_STRUCTURE)
35
36
  end
36
37
  end
@@ -0,0 +1,9 @@
1
+ class Indocker::Configs::ConfigInitializer
2
+ include SmartIoC::Iocify
3
+
4
+ bean :config_initializer
5
+
6
+ def initialize
7
+
8
+ end
9
+ end
@@ -0,0 +1,29 @@
1
+ class Indocker::ContainerBuilder
2
+ include SmartIoC::Iocify
3
+
4
+ bean :container_builder
5
+
6
+ inject :container_metadata_repository
7
+ inject :envs_loader
8
+ inject :config
9
+
10
+ def build(name)
11
+ container_metadata = container_metadata_repository.get_by_name(name)
12
+
13
+ env_metadata = container_metadata.env_files.inject(Indocker::Envs::EnvMetadata.new) do |all, path|
14
+ all += envs_loader.parse(path)
15
+ end
16
+
17
+ Indocker::DockerAPI::ContainerConfig.new(
18
+ name: name,
19
+ repo: container_metadata.repo,
20
+ tag: container_metadata.tag,
21
+ exposed_ports: container_metadata.exposed_ports,
22
+ port_bindings: container_metadata.port_bindings,
23
+ cmd: container_metadata.command,
24
+ volumes: container_metadata.volumes,
25
+ binds: container_metadata.binds,
26
+ env: env_metadata.to_array + container_metadata.envs
27
+ )
28
+ end
29
+ end
@@ -18,6 +18,8 @@ class Indocker::ContainerDirectivesRunner
18
18
  run_network(directive)
19
19
  when Indocker::ContainerDirectives::Ready
20
20
  run_ready(directive)
21
+ when Indocker::ContainerDirectives::Volume
22
+ run_volume(directive)
21
23
  else
22
24
  # do nothing
23
25
  end
@@ -43,4 +45,10 @@ class Indocker::ContainerDirectivesRunner
43
45
  rescue Timeout::Error
44
46
  raise Indocker::Errors::ContainerTimeoutError
45
47
  end
48
+
49
+ def run_volume(directive)
50
+ if !docker_api.volume_exists?(directive.name)
51
+ docker_api.create_volume(directive.name)
52
+ end
53
+ end
46
54
  end
@@ -26,23 +26,46 @@ class Indocker::ContainerDSL
26
26
  container_name: @context.container_name,
27
27
  network_name: item.name
28
28
  )
29
+ when Indocker::Volumes::VolumeMetadata
30
+ @directives << Indocker::ContainerDirectives::Volume.new(
31
+ volume_name: item.name
32
+ )
29
33
  end
30
34
  end
31
35
 
36
+ # TODO: Add contract
37
+ def mount(volume, to:)
38
+ @directives << Indocker::ContainerDirectives::Volume.new(
39
+ name: volume.name,
40
+ to: to
41
+ )
42
+ end
43
+
44
+ def cmd(command)
45
+ first_cmd_directive = @directives.detect {|c| c.instance_of?(Indocker::ContainerDirectives::Cmd)}
46
+ raise Indocker::Errors::DirectiveAlreadyInUse, first_cmd_directive if first_cmd_directive
47
+
48
+ @directives << Indocker::ContainerDirectives::Cmd.new(command)
49
+ end
50
+
32
51
  def env_file(path)
33
52
  @directives << Indocker::ContainerDirectives::EnvFile.new(path)
34
53
  end
35
54
 
55
+ def env(env_string)
56
+ @directives << Indocker::ContainerDirectives::Env.new(env_string)
57
+ end
58
+
36
59
  def expose(port)
37
60
  @directives << Indocker::ContainerDirectives::Expose.new(path)
38
61
  end
39
62
 
40
63
  def ports(ports)
41
- docker_port, host_port = ports.split(':').map(&:strip)
64
+ container_port, host_port = ports.split(':').map(&:strip)
42
65
 
43
66
  @directives << Indocker::ContainerDirectives::Ports.new(
44
- docker_port: docker_port,
45
- host_port: host_port
67
+ container_port: container_port,
68
+ host_port: host_port
46
69
  )
47
70
  end
48
71
 
@@ -0,0 +1,26 @@
1
+ class Indocker::ContainerInspector
2
+ include SmartIoC::Iocify
3
+
4
+ bean :container_inspector
5
+
6
+ inject :container_builder
7
+
8
+ def changed?(name)
9
+ container_config = docker_api.inspect_container(name)[Config]
10
+ host_config = docker_api.inspect_container(name)[HostConfig]
11
+
12
+ inspected_config = Indocker::ContainerConfig.new(
13
+ image: container_config['Image'],
14
+ cmd: container_config['Cmd'],
15
+ env: container_config['Env'],
16
+ volumes: container_config['Volumes'],
17
+ binds: host_config['Binds'],
18
+ exposed_ports: container_config['ExposedPorts'],
19
+ port_bindings: host_config['PortBindings']
20
+ )
21
+
22
+ metadata_config = container_builder.build(name)
23
+
24
+ inspected_config == metadata_config
25
+ end
26
+ end
@@ -3,7 +3,7 @@ class Indocker::ContainerManager
3
3
 
4
4
  include SmartIoC::Iocify
5
5
 
6
- bean :container_manager
6
+ bean :container_manager
7
7
 
8
8
  inject :container_metadata_repository
9
9
  inject :image_metadata_repository
@@ -12,30 +12,41 @@ class Indocker::ContainerManager
12
12
  inject :logger
13
13
  inject :tar_helper
14
14
  inject :config
15
- inject :envs_loader
15
+ inject :container_builder
16
16
 
17
17
  def create(name)
18
- container_metadata = container_metadata_repository.get_by_name(name)
19
-
20
- env_metadata = container_metadata.env_files
21
- .map {|path| envs_loader.parse(config.root.join(path))}
22
- .inject(Indocker::Envs::EnvMetadata.new) {|sum, env| sum += env}
18
+ container_config = container_builder.build(name)
23
19
 
24
- container_id = docker_api.create_container(
25
- name: name,
26
- repo: container_metadata.repo,
27
- tag: container_metadata.tag,
28
- exposed_ports: container_metadata.exposed_ports,
29
- port_bindings: container_metadata.port_bindings,
30
- env: env_metadata.to_array
31
- )
20
+ container_id = docker_api.create_container(container_config)
32
21
 
33
22
  logger.info "Successfully created container :#{name}"
34
23
 
35
24
  container_id
36
25
  end
37
26
 
38
- def start(name)
27
+ def run(name)
28
+ container_metadata = container_metadata_repository.get_by_name(name)
29
+
30
+ container_image_id = docker_api.get_container_image_id(name)
31
+ image_id = docker_api.get_image_id(container_metadata.repo, tag: container_metadata.tag)
32
+
33
+ raise Indocker::Errors::ImageIsNotBuilded, container_metadata.image if image_id.nil?
34
+
35
+ if docker_api.container_exists?(name)
36
+ if image_id != container_image_id
37
+ stop(name)
38
+ delete(name)
39
+ create(name)
40
+ end
41
+ else
42
+ create(name)
43
+ end
44
+
45
+ stop(name)
46
+ start(name, attach: container_metadata.attach)
47
+ end
48
+
49
+ def start(name, attach: false)
39
50
  container_metadata = container_metadata_repository.get_by_name(name)
40
51
 
41
52
  container_directives_runner.run_all(
@@ -43,14 +54,17 @@ class Indocker::ContainerManager
43
54
  )
44
55
 
45
56
  container_metadata.container_dependencies.each do |dependency|
57
+ dependency_metadata = container_metadata_repository.get_by_name(dependency)
46
58
  create(dependency) unless docker_api.container_exists?(dependency)
47
59
 
48
- unless docker_api.get_container_state(dependency) == Indocker::ContainerMetadata::States::RUNNING
49
- start(dependency)
60
+ if docker_api.get_container_state(dependency) == Indocker::ContainerMetadata::States::RUNNING
61
+ logger.info "Dependency container :#{dependency} already running"
62
+ else
63
+ start(dependency, attach: dependency_metadata.attach)
50
64
  end
51
65
  end
52
66
 
53
- container_id = docker_api.start_container(name)
67
+ container_id = docker_api.start_container(name, attach: attach)
54
68
 
55
69
  logger.info "Successfully started container :#{name}"
56
70
 
@@ -59,9 +73,6 @@ class Indocker::ContainerManager
59
73
  )
60
74
 
61
75
  container_id
62
- rescue Docker::Error::ClientError => e
63
- logger.error "The following error occured when starting :#{name} container"
64
- logger.error e.message
65
76
  end
66
77
 
67
78
  def stop(name)
@@ -73,6 +84,8 @@ class Indocker::ContainerManager
73
84
  end
74
85
 
75
86
  def delete(name)
87
+ stop(name)
88
+
76
89
  container_id = docker_api.delete_container(name)
77
90
 
78
91
  logger.info "Successfully deleted container :#{name}"
@@ -82,19 +95,17 @@ class Indocker::ContainerManager
82
95
 
83
96
  def copy(name:, copy_from:, copy_to:)
84
97
  container_metadata = container_metadata_repository.get_by_name(name)
85
-
86
- container_id = docker_api.create_container(
87
- repo: container_metadata.repo,
88
- tag: container_metadata.tag,
89
- command: KEEP_CONTAINER_RUNNING_COMMAND
90
- ) if !docker_api.container_exists?(name)
91
-
92
- tar_snapshot = File.join(config.root, 'tmp', "#{name.to_s}.tar")
93
98
 
99
+ container_id = docker_api.get_container_id(name) ||
100
+ docker_api.create_container(container_builder.build(name))
101
+
102
+ tar_snapshot = config.build_dir.join('snapshots', "#{name.to_s}.tar")
103
+
104
+ FileUtils.mkdir_p(File.dirname(tar_snapshot))
94
105
  docker_api.copy_from_container(name: container_id, path: copy_from) do |tar_archive|
95
- File.open(tar_snapshot, 'w') {|f| f.write(tar_archive)}
106
+ File.open(tar_snapshot, 'a+') {|f| f.write(tar_archive)}
96
107
  end
97
-
108
+
98
109
  files_list = tar_helper.untar(
99
110
  io: File.open(tar_snapshot, 'r'),
100
111
  destination: copy_to,