indocker 0.0.0 → 0.0.1

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rspec +1 -0
  4. data/Gemfile.lock +12 -0
  5. data/bin/indocker +9 -0
  6. data/indocker.gemspec +7 -2
  7. data/lib/indocker/application_initializer.rb +30 -0
  8. data/lib/indocker/cli.rb +17 -0
  9. data/lib/indocker/configs/config.rb +76 -0
  10. data/lib/indocker/configs/config_factory.rb +36 -0
  11. data/lib/indocker/configs/locator.rb +23 -0
  12. data/lib/indocker/container/container_dsl.rb +60 -0
  13. data/lib/indocker/container/container_evaluator.rb +13 -0
  14. data/lib/indocker/container/container_manager.rb +111 -0
  15. data/lib/indocker/container/container_metadata.rb +107 -0
  16. data/lib/indocker/container/container_metadata_factory.rb +27 -0
  17. data/lib/indocker/container/container_metadata_repository.rb +27 -0
  18. data/lib/indocker/directives/base.rb +21 -0
  19. data/lib/indocker/directives/container_directives/base.rb +19 -0
  20. data/lib/indocker/directives/container_directives/depends_on.rb +7 -0
  21. data/lib/indocker/directives/container_directives/env_file.rb +7 -0
  22. data/lib/indocker/directives/container_directives/expose.rb +7 -0
  23. data/lib/indocker/directives/container_directives/from.rb +12 -0
  24. data/lib/indocker/directives/container_directives/network.rb +12 -0
  25. data/lib/indocker/directives/container_directives/ports.rb +8 -0
  26. data/lib/indocker/directives/container_directives/ready.rb +16 -0
  27. data/lib/indocker/directives/container_directives_runner.rb +46 -0
  28. data/lib/indocker/directives/docker_directives/base.rb +15 -0
  29. data/lib/indocker/directives/docker_directives/cmd.rb +15 -0
  30. data/lib/indocker/directives/docker_directives/copy.rb +27 -0
  31. data/lib/indocker/directives/docker_directives/entrypoint.rb +15 -0
  32. data/lib/indocker/directives/docker_directives/env.rb +5 -0
  33. data/lib/indocker/directives/docker_directives/from.rb +30 -0
  34. data/lib/indocker/directives/docker_directives/run.rb +5 -0
  35. data/lib/indocker/directives/docker_directives/workdir.rb +5 -0
  36. data/lib/indocker/directives/image_directives_runner.rb +120 -0
  37. data/lib/indocker/directives/partial.rb +13 -0
  38. data/lib/indocker/directives/prepare_directives/base.rb +6 -0
  39. data/lib/indocker/directives/prepare_directives/docker_cp.rb +16 -0
  40. data/lib/indocker/docker_api.rb +180 -0
  41. data/lib/indocker/dsl_context.rb +17 -0
  42. data/lib/indocker/envs/env_metadata.rb +35 -0
  43. data/lib/indocker/envs/loader.rb +19 -0
  44. data/lib/indocker/envs/manager.rb +30 -0
  45. data/lib/indocker/errors.rb +17 -0
  46. data/lib/indocker/handlers/base.rb +13 -0
  47. data/lib/indocker/handlers/run_container.rb +29 -0
  48. data/lib/indocker/image/image_builder.rb +39 -0
  49. data/lib/indocker/image/image_dependencies_manager.rb +43 -0
  50. data/lib/indocker/image/image_dsl.rb +69 -0
  51. data/lib/indocker/image/image_evaluator.rb +21 -0
  52. data/lib/indocker/image/image_metadata.rb +50 -0
  53. data/lib/indocker/image/image_metadata_factory.rb +30 -0
  54. data/lib/indocker/image/image_metadata_repository.rb +30 -0
  55. data/lib/indocker/networks/network_metadata.rb +9 -0
  56. data/lib/indocker/networks/network_metadata_factory.rb +9 -0
  57. data/lib/indocker/networks/network_metadata_repository.rb +34 -0
  58. data/lib/indocker/partial/partial_metadata.rb +8 -0
  59. data/lib/indocker/partial/partial_metadata_repository.rb +26 -0
  60. data/lib/indocker/utils/ioc_container.rb +17 -0
  61. data/lib/indocker/utils/logger.rb +62 -0
  62. data/lib/indocker/utils/logger_factory.rb +12 -0
  63. data/lib/indocker/utils/registry_authenticator.rb +19 -0
  64. data/lib/indocker/utils/render_namespace.rb +11 -0
  65. data/lib/indocker/utils/render_util.rb +15 -0
  66. data/lib/indocker/utils/string_utils.rb +11 -0
  67. data/lib/indocker/utils/tar_helper.rb +40 -0
  68. data/lib/indocker/utils/test_logger_factory.rb +9 -0
  69. data/lib/indocker/version.rb +2 -2
  70. data/lib/indocker.rb +123 -1
  71. data/spec/example/.indocker/config.rb +23 -0
  72. data/spec/example/.indocker/images_and_containers.rb +25 -0
  73. data/spec/example/assets/index.css +1 -0
  74. data/spec/example/assets/index.js +1 -0
  75. data/spec/indocker/configs/config_factory_spec.rb +18 -0
  76. data/spec/indocker/configs/config_spec.rb +37 -0
  77. data/spec/indocker/container/container_manager_spec.rb +230 -0
  78. data/spec/indocker/directives/image_directives_runner_spec.rb +121 -0
  79. data/spec/indocker/handlers/run_container_spec.rb +107 -0
  80. data/spec/indocker/image/image_builder_spec.rb +115 -0
  81. data/spec/indocker/image/image_evaluator_spec.rb +65 -0
  82. data/spec/indocker/utils/docker_api_spec.rb +87 -0
  83. data/spec/spec_helper.rb +46 -0
  84. data/spec/tmp/indocker_list_container_files/deeper/example3.txt +1 -0
  85. data/spec/tmp/indocker_list_container_files/deeper/example4.txt +1 -0
  86. data/spec/tmp/indocker_list_container_files/example1.txt +1 -0
  87. data/spec/tmp/indocker_list_container_files/example2.txt +1 -0
  88. metadata +159 -6
  89. data/spec/.gitkeep +0 -0
@@ -0,0 +1,12 @@
1
+ class Indocker::ContainerDirectives::From < Indocker::ContainerDirectives::Base
2
+ attr_accessor :repo, :tag
3
+
4
+ def initialize(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
5
+ @repo = repo
6
+ @tag = tag
7
+ end
8
+
9
+ def image
10
+ "#{@repo}:#{@tag}"
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ class Indocker::ContainerDirectives::Network < Indocker::ContainerDirectives::Base
2
+ attr_accessor :network_name, :container_name
3
+
4
+ def initialize(network_name:, container_name:)
5
+ @network_name = network_name
6
+ @container_name = container_name
7
+ end
8
+
9
+ def before_start?
10
+ true
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ class Indocker::ContainerDirectives::Ports < Indocker::ContainerDirectives::Base
2
+ attr_accessor :docker_port, :host_port
3
+
4
+ def initialize(docker_port:, host_port:)
5
+ @docker_port = docker_port
6
+ @host_port = host_port
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ class Indocker::ContainerDirectives::Ready < Indocker::ContainerDirectives::Base
2
+ attr_accessor :ready_block, :sleep, :timeout
3
+
4
+ DEFAULT_SLEEP = 0.1
5
+ DEFAULT_TIMEPUT = 10
6
+
7
+ def initialize(sleep: DEFAULT_SLEEP, timeout: DEFAULT_TIMEPUT, ready_block:)
8
+ @sleep = sleep
9
+ @timeout = timeout
10
+ @ready_block = ready_block
11
+ end
12
+
13
+ def after_start?
14
+ true
15
+ end
16
+ end
@@ -0,0 +1,46 @@
1
+ require 'timeout'
2
+
3
+ class Indocker::ContainerDirectivesRunner
4
+ include SmartIoC::Iocify
5
+
6
+ bean :container_directives_runner
7
+
8
+ inject :docker_api
9
+ inject :config
10
+
11
+ def run_all(directives)
12
+ directives.each {|c| run(c)}
13
+ end
14
+
15
+ def run(directive)
16
+ case directive
17
+ when Indocker::ContainerDirectives::Network
18
+ run_network(directive)
19
+ when Indocker::ContainerDirectives::Ready
20
+ run_ready(directive)
21
+ else
22
+ # do nothing
23
+ end
24
+ end
25
+
26
+ def run_network(directive)
27
+ if !docker_api.network_exists?(directive.network_name)
28
+ docker_api.create_network(directive.network_name)
29
+ end
30
+
31
+ docker_api.add_container_to_network(
32
+ container_name: directive.container_name,
33
+ network_name: directive.network_name
34
+ )
35
+ end
36
+
37
+ def run_ready(directive)
38
+ Timeout::timeout(directive.timeout) do
39
+ while (!directive.ready_block.call)
40
+ sleep directive.sleep
41
+ end
42
+ end
43
+ rescue Timeout::Error
44
+ raise Indocker::Errors::ContainerTimeoutError
45
+ end
46
+ end
@@ -0,0 +1,15 @@
1
+ module Indocker
2
+ module DockerDirectives
3
+ class Base < Indocker::Directives::Base
4
+ attr_reader :args
5
+
6
+ def initialize(*args)
7
+ @args = args
8
+ end
9
+
10
+ def to_s
11
+ "#{type} #{@args.join(' ')}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class Indocker::DockerDirectives::Cmd < Indocker::DockerDirectives::Base
2
+ attr_reader :command
3
+
4
+ def initialize(command)
5
+ @command = command
6
+ end
7
+
8
+ def to_s
9
+ "#{type} #{command.inspect}"
10
+ end
11
+
12
+ def type
13
+ 'CMD'
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ class Indocker::DockerDirectives::Copy < Indocker::DockerDirectives::Base
2
+ attr_reader :copy_actions, :context, :compile
3
+
4
+ def initialize(context:, copy_actions:, compile: false)
5
+ @copy_actions = copy_actions
6
+ @context = context
7
+ @compile = compile
8
+ end
9
+
10
+ def type
11
+ 'COPY'
12
+ end
13
+
14
+ def to_s
15
+ result = []
16
+
17
+ copy_actions.each do |from, to|
18
+ result.push "#{type} #{from} #{to}"
19
+ end
20
+
21
+ result.join("\n")
22
+ end
23
+
24
+ def prepare_directive?
25
+ true
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ class Indocker::DockerDirectives::Entrypoint < Indocker::DockerDirectives::Base
2
+ attr_reader :command
3
+
4
+ def initialize(command)
5
+ @command = command
6
+ end
7
+
8
+ def to_s
9
+ "#{type} #{command.inspect}"
10
+ end
11
+
12
+ def type
13
+ 'ENTRYPOINT'
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class Indocker::DockerDirectives::Env < Indocker::DockerDirectives::Base
2
+ def type
3
+ 'ENV'
4
+ end
5
+ end
@@ -0,0 +1,30 @@
1
+ class Indocker::DockerDirectives::From < Indocker::DockerDirectives::Base
2
+ attr_reader :repo, :tag
3
+
4
+ def initialize(repo_tag, tag: nil)
5
+ case repo_tag
6
+ when String
7
+ @repo = repo_tag.split(':')[0]
8
+ @tag = tag || repo_tag.split(':')[1] || Indocker::ImageMetadata::DEFAULT_TAG
9
+ else
10
+ @repo = repo_tag
11
+ @tag = tag || Indocker::ImageMetadata::DEFAULT_TAG
12
+ end
13
+ end
14
+
15
+ def full_name
16
+ "#{repo}:#{tag}"
17
+ end
18
+
19
+ def dockerhub_image?
20
+ repo.is_a?(String)
21
+ end
22
+
23
+ def to_s
24
+ "#{type} #{repo}:#{tag}"
25
+ end
26
+
27
+ def type
28
+ 'FROM'
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ class Indocker::DockerDirectives::Run < Indocker::DockerDirectives::Base
2
+ def type
3
+ 'RUN'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Indocker::DockerDirectives::Workdir < Indocker::DockerDirectives::Base
2
+ def type
3
+ 'WORKDIR'
4
+ end
5
+ end
@@ -0,0 +1,120 @@
1
+ class Indocker::ImageDirectivesRunner
2
+ include SmartIoC::Iocify
3
+
4
+ bean :image_directives_runner
5
+
6
+ inject :container_manager
7
+ inject :config
8
+ inject :render_util
9
+
10
+ def run_all(directives)
11
+ directives.each {|c| run(c)}
12
+ end
13
+
14
+ def run(directive)
15
+ case directive
16
+ when Indocker::PrepareDirectives::DockerCp
17
+ run_docker_cp(directive)
18
+ when Indocker::DockerDirectives::Copy
19
+ run_copy(directive)
20
+ else
21
+ # do nothing
22
+ end
23
+ end
24
+
25
+ def run_docker_cp(directive)
26
+ directive.copy_actions.each do |from, to|
27
+ container_manager.copy(
28
+ name: directive.container_name,
29
+ copy_from: from,
30
+ copy_to: to
31
+ )
32
+ end
33
+ end
34
+
35
+ def run_copy(directive)
36
+ directive.copy_actions.each do |from, to|
37
+ build_dir_file = File.join(directive.context.build_dir, from)
38
+
39
+ source_dir = File.join(config.root, from)
40
+
41
+ if File.directory?(from)
42
+ dest_dir = File.join(directive.context.build_dir, from)
43
+ else
44
+ dest_dir = File.join(directive.context.build_dir, File.dirname(from))
45
+ end
46
+
47
+ if File.exists?(build_dir_file) && File.file?(build_dir_file)
48
+ copy_compile_file(
49
+ from: build_dir_file,
50
+ to: build_dir_file,
51
+ locals: directive.context.storage,
52
+ compile: directive.compile
53
+ )
54
+
55
+ return
56
+ end
57
+
58
+ if File.exist?(build_dir_file) && File.directory?(build_dir_file)
59
+ files_list = Dir.glob(File.join(build_dir_file, '**', '*'), File::FNM_DOTMATCH)
60
+
61
+ files_list.each do |from|
62
+ copy_compile_file(
63
+ from: from,
64
+ to: from,
65
+ locals: directive.context.storage,
66
+ compile: directive.compile
67
+ )
68
+ end
69
+
70
+ return
71
+ end
72
+
73
+ if File.exists?(source_dir) && File.file?(source_dir)
74
+ copy_compile_file(
75
+ from: source_dir,
76
+ to: File.join(dest_dir, File.basename(source_dir)),
77
+ locals: directive.context.storage,
78
+ compile: directive.compile
79
+ )
80
+
81
+ return
82
+ end
83
+
84
+ if Dir.exist?(source_dir) && File.directory?(source_dir)
85
+ files_list = Dir.glob(File.join(source_dir, '**', '*'), File::FNM_DOTMATCH)
86
+
87
+ files_list.each do |from|
88
+ relative_to = Pathname.new(from).relative_path_from( Pathname.new(source_dir) ).to_s
89
+ absolute_to = File.join(dest_dir, relative_to)
90
+
91
+ copy_compile_file(
92
+ from: from,
93
+ to: absolute_to,
94
+ locals: directive.context.storage,
95
+ compile: directive.compile
96
+ )
97
+ end
98
+
99
+ return
100
+ end
101
+
102
+ raise Indocker::Errors::FileDoesNotExists
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def copy_compile_file(from:, to:, locals: {}, compile: false)
109
+ return if !File.exists?(from) || File.directory?(from)
110
+
111
+ FileUtils.mkdir_p(File.dirname(to)) unless Dir.exist?(File.dirname(to))
112
+
113
+ write_content = compile ? render_util.render( File.read(from), locals ) :
114
+ File.read(from)
115
+
116
+ File.write(to, write_content)
117
+
118
+ File.chmod(File.stat(from).mode, to)
119
+ end
120
+ end
@@ -0,0 +1,13 @@
1
+ class Indocker::Directives::Partial < Indocker::Directives::Base
2
+ attr_reader :name, :context
3
+
4
+ def initialize(name, context, opts = {})
5
+ @name = name
6
+ @context = context
7
+ @opts = opts
8
+ end
9
+
10
+ def to_s
11
+ inspect
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ module Indocker
2
+ module PrepareDirectives
3
+ class Base < Indocker::Directives::Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ class Indocker::PrepareDirectives::DockerCp < Indocker::PrepareDirectives::Base
2
+ attr_reader :container_name, :copy_actions, :build_dir
3
+
4
+ def initialize(container_name, build_dir, &block)
5
+ @container_name = container_name
6
+ @build_dir = build_dir
7
+
8
+ instance_exec &block if block_given?
9
+ end
10
+
11
+ private
12
+
13
+ def copy(copy_actions)
14
+ @copy_actions = copy_actions
15
+ end
16
+ end
@@ -0,0 +1,180 @@
1
+ class Indocker::DockerApi
2
+ include SmartIoC::Iocify
3
+
4
+ bean :docker_api
5
+
6
+ inject :logger
7
+
8
+ def check_docker_installed!
9
+ Docker.info
10
+ nil
11
+ rescue Excon::Error::Socket
12
+ raise Indocker::Errors::DockerDoesNotInstalled
13
+ end
14
+
15
+ def authenticate!(serveraddress:, email:, password:, username:)
16
+ params = {
17
+ 'serveraddress' => serveraddress,
18
+ 'email' => email,
19
+ 'password' => password,
20
+ 'username' => username
21
+ }.delete_if {|_, value| value.to_s.empty?}
22
+
23
+ Docker.authenticate!(params)
24
+ end
25
+
26
+ # Networks
27
+
28
+ def create_network(name)
29
+ Docker::Network.create(name.to_s).id
30
+ end
31
+
32
+ def add_container_to_network(network_name:, container_name:)
33
+ container_id = get_container_id(container_name.to_s)
34
+
35
+ Docker::Network.get(network_name.to_s).connect(container_id.to_s)
36
+ end
37
+
38
+ def remove_network(name)
39
+ Docker::Network.get(name.to_s).remove
40
+ end
41
+
42
+ def network_exists?(name)
43
+ !Docker::Network.get(name.to_s).nil? rescue false
44
+ end
45
+
46
+ def get_network_id(name)
47
+ Docker::Network.get(name.to_s).id
48
+ end
49
+
50
+ def inspect_network(name)
51
+ Docker::Network.get(name.to_s).info
52
+ end
53
+
54
+ def delete_networks_where(&condition)
55
+ Docker::Network.all.select(&condition).map do |network|
56
+ network.remove
57
+ end
58
+ end
59
+
60
+ # Images
61
+
62
+ def get_image_id(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
63
+ Docker::Image.get(full_name(repo, tag)).id
64
+ end
65
+
66
+ def image_exists?(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
67
+ Docker::Image.exist?(full_name(repo, tag))
68
+ end
69
+
70
+ def delete_image(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
71
+ Docker::Image.get(full_name(repo, tag)).remove(force: true)
72
+ end
73
+
74
+ def build_from_dir(repo:, tag:, build_dir:)
75
+ image = Docker::Image.build_from_dir(build_dir) do |x|
76
+ x.split("\r\n").each do |y|
77
+ if (log = JSON.parse(y)) && log.has_key?("stream")
78
+ yield log["stream"].strip
79
+ end
80
+ end
81
+ end
82
+
83
+ image.tag(
84
+ repo: repo,
85
+ tag: tag,
86
+ force: true
87
+ )
88
+
89
+ image.id
90
+ end
91
+
92
+ def pull(opts)
93
+ image = Docker::Image.create(opts)
94
+
95
+ image.id
96
+ end
97
+
98
+ def delete_images_where(&condition)
99
+ Docker::Image.all.select(&condition).map do |image|
100
+ image.remove(force: true)
101
+ end
102
+ end
103
+
104
+
105
+ # Containers
106
+
107
+ def inspect_container(name)
108
+ Docker::Container.get(name.to_s).info
109
+ end
110
+
111
+ def get_container_id(name)
112
+ Docker::Container.get(name.to_s).id
113
+ end
114
+
115
+ def get_container_state(name)
116
+ Docker::Container.get(name.to_s).info["State"]["Status"]
117
+ end
118
+
119
+ def container_exists?(name)
120
+ !Docker::Container.get(name.to_s).nil? rescue false
121
+ end
122
+
123
+ def start_container(name)
124
+ Docker::Container.get(name.to_s).start!.id
125
+ end
126
+
127
+ def stop_container(name)
128
+ Docker::Container.get(name.to_s).stop
129
+ end
130
+
131
+ def copy_from_container(name:, path:)
132
+ Docker::Container.get(name.to_s).copy(path) { |chunk| yield chunk }
133
+ end
134
+
135
+ def create_container(repo:, tag:, name: nil, command: nil, env: nil,
136
+ exposed_ports: nil, port_bindings: nil)
137
+ params = {
138
+ 'Image' => full_name(repo, tag),
139
+ 'name' => name.to_s,
140
+ 'Cmd' => command,
141
+ 'Env' => env,
142
+ 'ExposedPorts' => exposed_ports,
143
+ 'HostConfig' => {
144
+ 'PortBindings' => port_bindings
145
+ }
146
+ }.delete_if { |_, value| value.to_s.empty? }
147
+
148
+ Docker::Container.create(params).id
149
+ end
150
+
151
+ def exec_container(name:, command:)
152
+ Docker::Container.get(name.to_s).exec(command) do |stream, chunk|
153
+ yield stream, chunk
154
+ end
155
+ end
156
+
157
+ def delete_container(name)
158
+ Docker::Container.get(name.to_s).delete(:force => true)
159
+ end
160
+
161
+ def delete_containers_where(&condition)
162
+ Docker::Container.all(all: true).select(&condition).map do |container|
163
+ container.stop
164
+ container.delete(force: true)
165
+ end
166
+ end
167
+
168
+ def container_run(repo:, tag:, command:)
169
+ container = Docker::Container.create(
170
+ 'Image' => full_name(repo, tag),
171
+ 'Cmd' => command
172
+ ).id
173
+ end
174
+
175
+ private
176
+
177
+ def full_name(repo, tag)
178
+ "#{repo.to_s}:#{tag.to_s}"
179
+ end
180
+ end
@@ -0,0 +1,17 @@
1
+ class Indocker::DSLContext
2
+ attr_reader :storage
3
+
4
+ def initialize(storage = {})
5
+ @storage = storage
6
+ end
7
+
8
+ def method_missing(method, *args)
9
+ super unless @storage.key?(method)
10
+
11
+ @storage.fetch(method)
12
+ end
13
+
14
+ def set_value(key, value)
15
+ @storage[key] = value
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ module Indocker::Envs
2
+ class EnvMetadata
3
+ def initialize(variables = {})
4
+ @variables = variables
5
+ end
6
+
7
+ def to_hash
8
+ @variables
9
+ end
10
+
11
+ def to_json
12
+ to_hash.to_json
13
+ end
14
+
15
+ def to_array
16
+ to_hash.inject([]) do |all, (k, v)|
17
+ all.push "#{k}=#{v}"
18
+ end
19
+ end
20
+
21
+ def set(key:, value:)
22
+ overwritten = @variables.has_key?(key) and @variables[key] != value
23
+
24
+ @variables[key] = value
25
+
26
+ overwritten
27
+ end
28
+
29
+ def +(other)
30
+ combined_hash = to_hash.merge(other.to_hash)
31
+
32
+ Indocker::Envs::EnvMetadata.new(combined_hash)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ class Indocker::Envs::Loader
2
+ include SmartIoC::Iocify
3
+
4
+ bean :envs_loader
5
+
6
+ def parse(path)
7
+ raise Indocker::Errors::EnvFileDoesNotExist if !File.exists?(path)
8
+
9
+ env_metadata = Indocker::Envs::EnvMetadata.new
10
+
11
+ File.foreach(path) do |line|
12
+ key, value = line.split('=').map(&:strip)
13
+
14
+ env_metadata.set(key: key, value: value)
15
+ end
16
+
17
+ env_metadata
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ class Indocker::Envs::Manager
2
+ include SmartIoC::Iocify
3
+
4
+ bean :envs_manager
5
+
6
+ inject :config
7
+ inject :logger
8
+ inject :envs_loader
9
+
10
+ def load_init_application_env_variables
11
+ config.load_env_file.each do |path|
12
+ env_file = File.join(config.root, path)
13
+
14
+ begin
15
+ metadata = envs_loader.parse(env_file)
16
+ rescue Indocker::Errors::EnvFileDoesNotExist
17
+ logger.warn "File #{env_file} doesn't exist. Check path to environment_path"
18
+ return
19
+ end
20
+
21
+ metadata.to_hash.each do |key, value|
22
+ if ENV.has_key?(key) && ENV[key] != value
23
+ logger.warn "Environment file '#{path}' overwrites ENV['#{key}'] from '#{ENV[key]}' to '#{value}'!"
24
+ end
25
+
26
+ ENV[key] = value
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ module Indocker::Errors
2
+ class ImageIsNotDefined < StandardError; end
3
+ class PartialIsNotDefined < StandardError; end
4
+ class ContainerIsNotDefined < StandardError; end
5
+ class CircularImageDependency < StandardError; end
6
+ class ImageForContainerDoesNotExist < StandardError; end
7
+ class DockerDoesNotInstalled < StandardError; end
8
+ class ConfigFilesDoesNotFound < StandardError; end
9
+ class ConfigOptionTypeMismatch < StandardError; end
10
+ class DockerRegistryAuthenticationError < StandardError; end
11
+ class FileDoesNotExists < StandardError; end
12
+ class EnvFileDoesNotExist < StandardError; end
13
+ class ContainerTimeoutError < StandardError; end
14
+
15
+ class ContainerImageAlreadyDefined < StandardError; end
16
+ class NetworkAlreadyDefined < StandardError; end
17
+ end