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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7be87d422b3b08f1387554c0eea9824254ab0fc6
4
- data.tar.gz: 5b4122b752a58078fdf16ff960050d76f5944cfa
3
+ metadata.gz: 7df51bb131afb666d9ca1348d33e322f3d37d327
4
+ data.tar.gz: 685f173290c9de44e22d15afec6203f2d2bbb94f
5
5
  SHA512:
6
- metadata.gz: d28df954032d69e1d108054bfee34b0f7b3d5376d75a35be145469c9ed4dfdb734b88586e9532e040ae731cabc04ebf847dde3d236fed8b57f47ea99132c7f3c
7
- data.tar.gz: 00f0a7cf60712d31b45d51369df0a78ba390fde250ea1adbc21a795e73cf51e8db404dad16eaf69533a3ebc865304ec8a1e8d7204146f87c778cbb68dec996ee
6
+ metadata.gz: 71e13fe051887fe13b7675e26ac06441ae9318165c1ef98949ebe2e43fda8562b8a7d4d839789ba844d62e565b0e480f5e2165399d50f4e38e42f2d808acd31c
7
+ data.tar.gz: 01a359422b06ef1f4246a2b0fc20eb49699413a4cd45b907663d8e568a8243a98a2d39c0bd0fce86b93e309e918b38e0d241f0b3adbab0642b07978ea6b1eac4
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  .DS_Store
2
- .byebug_history
2
+ .byebug_history
3
+ tmp/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/Gemfile.lock CHANGED
@@ -2,11 +2,23 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  indocker (0.0.0)
5
+ colorize
6
+ docker-api
7
+ smart_ioc
8
+ thor
5
9
 
6
10
  GEM
7
11
  remote: https://rubygems.org/
8
12
  specs:
9
13
  byebug (9.1.0)
14
+ colorize (0.8.1)
15
+ docker-api (1.33.6)
16
+ excon (>= 0.38.0)
17
+ json
18
+ excon (0.59.0)
19
+ json (2.1.0)
20
+ smart_ioc (0.2.1)
21
+ thor (0.20.0)
10
22
 
11
23
  PLATFORMS
12
24
  ruby
data/bin/indocker ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'indocker'
7
+
8
+ # $thor_runner = true
9
+ Indocker::CLI::Application.start( ARGV )
data/indocker.gemspec CHANGED
@@ -2,8 +2,8 @@ require_relative 'lib/indocker/version'
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'indocker'
5
- s.version = InDocker::VERSION
6
- s.summary = "InDocker"
5
+ s.version = Indocker::VERSION
6
+ s.summary = "Indocker"
7
7
  s.description = "DSL for build, run and deploy docker containers"
8
8
  s.authors = ["Droid Labs"]
9
9
  s.email = 'hello@droidlabs.pro'
@@ -13,6 +13,11 @@ 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
+
17
+ s.add_dependency "smart_ioc"
18
+ s.add_dependency "docker-api"
19
+ s.add_dependency "thor"
20
+ s.add_dependency "colorize"
16
21
 
17
22
  s.homepage = 'https://github.com/droidlabs/indocker'
18
23
  s.license = 'MIT'
@@ -0,0 +1,30 @@
1
+ class Indocker::ApplicationInitializer
2
+ include SmartIoC::Iocify
3
+
4
+ bean :application_initializer
5
+
6
+ inject :config_locator
7
+ inject :docker_api
8
+ inject :registry_authenticator
9
+ inject :envs_manager
10
+ inject :config
11
+
12
+
13
+ def init_app(current_path, env: :development)
14
+ docker_api.check_docker_installed!
15
+
16
+ config.root(
17
+ Pathname.new(
18
+ File.expand_path(
19
+ File.join(config_locator.locate(current_path), '../..')
20
+ )
21
+ )
22
+ )
23
+
24
+ require(config_locator.locate(current_path))
25
+
26
+ registry_authenticator.authenticate!
27
+
28
+ envs_manager.load_init_application_env_variables
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ require 'thor'
2
+
3
+ module Indocker
4
+ module CLI
5
+ class Application < Thor
6
+ desc "container:run CONTAINER_NAME", "runs specified container"
7
+ option :env
8
+ define_method('container:run') do |name, env = :development|
9
+ ioc.run_container_handler.perform(
10
+ name: name,
11
+ current_path: Dir.pwd,
12
+ env: env
13
+ )
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,76 @@
1
+ module Indocker::Configs
2
+ class Config
3
+ def scope
4
+ @scope ||= Hash.new({})
5
+ end
6
+
7
+ def set(&block)
8
+ instance_exec(&block)
9
+ end
10
+
11
+ def option(name, group: :default, type: :string)
12
+ define_singleton_method(name) do |value = nil, &block|
13
+ write_value = block || value
14
+
15
+ if write_value
16
+ validate!(name, write_value, type)
17
+
18
+ write_setting(name, write_value, group)
19
+ else
20
+ read_setting(name)
21
+ end
22
+ end
23
+ end
24
+
25
+ def config(name, group: :default, &block)
26
+ subconfiguration = Indocker::Configs::Config.new
27
+ subconfiguration.instance_exec(&block)
28
+
29
+ option(name, group: group, type: :config)
30
+ send(name, subconfiguration)
31
+ end
32
+
33
+ def read_setting(key)
34
+ read_value = scope[key.to_s][:value]
35
+
36
+ read_value.is_a?(Proc) ? read_value.call : read_value
37
+ end
38
+
39
+ def write_setting(key, value, group)
40
+ scope[key.to_s] = {
41
+ value: value,
42
+ group: group
43
+ }
44
+ end
45
+
46
+ def validate!(name, value, type)
47
+ value_type = cast_class_to_type(value)
48
+
49
+ if type != value_type
50
+ raise Indocker::Errors::ConfigOptionTypeMismatch,
51
+ "Expected option #{name.inspect} => #{value.inspect} to be a #{type.inspect}, not a #{value_type.inspect}"
52
+ end
53
+
54
+ nil
55
+ end
56
+
57
+ def cast_class_to_type(value)
58
+ case value
59
+ when Proc
60
+ cast_class_to_type(value.call)
61
+ when TrueClass
62
+ :boolean
63
+ when FalseClass
64
+ :boolean
65
+ when Indocker::Configs::Config
66
+ :config
67
+ else
68
+ Indocker::StringUtils.underscore(value.class.name).to_sym
69
+ end
70
+ end
71
+
72
+ def method_missing(method, *args, &block)
73
+ raise "Undefined keyword #{method.inspect} for Indocker configuration file"
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,36 @@
1
+ class Indocker::Configs::ConfigFactory
2
+ include SmartIoC::Iocify
3
+
4
+ bean :config, factory_method: :build
5
+
6
+ CONFIG_STRUCTURE = Proc.new do
7
+ option :namespace, group: :common
8
+ option :root, group: :common, type: :pathname
9
+
10
+ option :load_env_file, group: :load, type: :array
11
+ option :load_docker_items, group: :load, type: :array
12
+
13
+ config :git, group: :git do
14
+ option :repository
15
+ option :tag
16
+ option :branch
17
+ option :workdir
18
+ end
19
+
20
+ config :docker, group: :docker do
21
+ option :registry
22
+ option :email
23
+ option :password
24
+ option :username
25
+ option :skip_push, type: :boolean
26
+ end
27
+ end
28
+
29
+ def build(&block)
30
+ return @configuration if @configuration
31
+
32
+ @configuration = Indocker::Configs::Config.new
33
+ @configuration.instance_exec(&CONFIG_STRUCTURE)
34
+ @configuration
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ class Indocker::Configs::Locator
2
+ include SmartIoC::Iocify
3
+
4
+ bean :config_locator
5
+
6
+ ROOT = '/'
7
+
8
+ def locate(path)
9
+ expand_path = potential_config_file File.expand_path(path)
10
+
11
+ return expand_path if File.exists?(expand_path)
12
+
13
+ raise Indocker::Errors::ConfigFilesDoesNotFound if path == ROOT
14
+
15
+ locate(File.dirname(path))
16
+ end
17
+
18
+ private
19
+
20
+ def potential_config_file(path)
21
+ File.join(path, '.indocker', 'config.rb')
22
+ end
23
+ end
@@ -0,0 +1,60 @@
1
+ class Indocker::ContainerDSL
2
+ attr_reader :directives
3
+
4
+ def initialize(context)
5
+ @context = context
6
+ @directives = []
7
+ end
8
+
9
+ def method_missing(method, *args)
10
+ @context.send(method)
11
+ rescue
12
+ super
13
+ end
14
+
15
+ private
16
+
17
+ def use(item)
18
+ case item
19
+ when Indocker::ImageMetadata
20
+ from_directive = @directives.detect {|d| d.instance_of?(Indocker::ContainerDirectives::From)}
21
+ raise Indocker::Errors::ContainerImageAlreadyDefined, from_directive.image if from_directive
22
+
23
+ @directives << Indocker::ContainerDirectives::From.new(item.repo, tag: item.tag)
24
+ when Indocker::Networks::NetworkMetadata
25
+ @directives << Indocker::ContainerDirectives::Network.new(
26
+ container_name: @context.container_name,
27
+ network_name: item.name
28
+ )
29
+ end
30
+ end
31
+
32
+ def env_file(path)
33
+ @directives << Indocker::ContainerDirectives::EnvFile.new(path)
34
+ end
35
+
36
+ def expose(port)
37
+ @directives << Indocker::ContainerDirectives::Expose.new(path)
38
+ end
39
+
40
+ def ports(ports)
41
+ docker_port, host_port = ports.split(':').map(&:strip)
42
+
43
+ @directives << Indocker::ContainerDirectives::Ports.new(
44
+ docker_port: docker_port,
45
+ host_port: host_port
46
+ )
47
+ end
48
+
49
+ def depends_on(container_metadata)
50
+ @directives << Indocker::ContainerDirectives::DependsOn.new(container_metadata.name)
51
+ end
52
+
53
+ def ready(sleep:, timeout:, &ready_block)
54
+ @directives << Indocker::ContainerDirectives::Ready.new(
55
+ sleep: sleep,
56
+ timeout: timeout,
57
+ ready_block: ready_block
58
+ )
59
+ end
60
+ end
@@ -0,0 +1,13 @@
1
+ class Indocker::ContainerEvaluator
2
+ include SmartIoC::Iocify
3
+
4
+ bean :container_evaluator
5
+
6
+ def evaluate(context, &block)
7
+ container_dsl = Indocker::ContainerDSL.new(context)
8
+
9
+ container_dsl.instance_exec(&block)
10
+
11
+ container_dsl.directives
12
+ end
13
+ end
@@ -0,0 +1,111 @@
1
+ class Indocker::ContainerManager
2
+ KEEP_CONTAINER_RUNNING_COMMAND = %w(tail -F -n0 /etc/hosts)
3
+
4
+ include SmartIoC::Iocify
5
+
6
+ bean :container_manager
7
+
8
+ inject :container_metadata_repository
9
+ inject :image_metadata_repository
10
+ inject :container_directives_runner
11
+ inject :docker_api
12
+ inject :logger
13
+ inject :tar_helper
14
+ inject :config
15
+ inject :envs_loader
16
+
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}
23
+
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
+ )
32
+
33
+ logger.info "Successfully created container :#{name}"
34
+
35
+ container_id
36
+ end
37
+
38
+ def start(name)
39
+ container_metadata = container_metadata_repository.get_by_name(name)
40
+
41
+ container_directives_runner.run_all(
42
+ container_metadata.before_start_directives
43
+ )
44
+
45
+ container_metadata.container_dependencies.each do |dependency|
46
+ create(dependency) unless docker_api.container_exists?(dependency)
47
+
48
+ unless docker_api.get_container_state(dependency) == Indocker::ContainerMetadata::States::RUNNING
49
+ start(dependency)
50
+ end
51
+ end
52
+
53
+ container_id = docker_api.start_container(name)
54
+
55
+ logger.info "Successfully started container :#{name}"
56
+
57
+ container_directives_runner.run_all(
58
+ container_metadata.after_start_directives
59
+ )
60
+
61
+ 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
+ end
66
+
67
+ def stop(name)
68
+ container_id = docker_api.stop_container(name)
69
+
70
+ logger.info "Successfully stopped container :#{name}"
71
+
72
+ container_id
73
+ end
74
+
75
+ def delete(name)
76
+ container_id = docker_api.delete_container(name)
77
+
78
+ logger.info "Successfully deleted container :#{name}"
79
+
80
+ container_id
81
+ end
82
+
83
+ def copy(name:, copy_from:, copy_to:)
84
+ 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
+
94
+ 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)}
96
+ end
97
+
98
+ files_list = tar_helper.untar(
99
+ io: File.open(tar_snapshot, 'r'),
100
+ destination: copy_to,
101
+ ignore_wrap_directory: File.basename(copy_from) == '.'
102
+ )
103
+
104
+ FileUtils.rm_rf(tar_snapshot)
105
+
106
+ docker_api.stop_container(container_id)
107
+ docker_api.delete_container(container_id)
108
+
109
+ files_list
110
+ end
111
+ end
@@ -0,0 +1,107 @@
1
+ class Indocker::ContainerMetadata
2
+ attr_reader :name
3
+
4
+ HOSTPORT = 'HostPort'
5
+
6
+ module States
7
+ CREATED = 'created'
8
+ RESTARTING = 'restarting'
9
+ RUNNING = 'running'
10
+ PAUSED = 'paused'
11
+ EXITED = 'exited'
12
+ DEAD = 'dead'
13
+
14
+ ALL = [CREATED, RESTARTING, RUNNING, PAUSED, EXITED, DEAD]
15
+ end
16
+
17
+ def initialize(name:, directives:)
18
+ @name = name
19
+ @directives = directives
20
+ end
21
+
22
+ def repo
23
+ from_directive.repo
24
+ end
25
+
26
+ def tag
27
+ from_directive.tag
28
+ end
29
+
30
+ def image
31
+ from_directive.image
32
+ end
33
+
34
+ def networks
35
+ network_directives.map(&:name)
36
+ end
37
+
38
+ def env_files
39
+ env_directives.map(&:path)
40
+ end
41
+
42
+ def exposed_ports
43
+ return nil if ports_directives.empty? && expose_directives.empty?
44
+
45
+ result = Hash.new
46
+
47
+ expose_directives.each do |d|
48
+ result[d.port.to_s] = {}
49
+ end
50
+
51
+ ports_directives.each do |d|
52
+ result[d.docker_port] = {}
53
+ end
54
+
55
+ result
56
+ end
57
+
58
+ def port_bindings
59
+ return nil if ports_directives.empty?
60
+
61
+ result = Hash.new
62
+
63
+ ports_directives.each do |d|
64
+ result[d.docker_port] = [{ HOSTPORT => d.host_port }]
65
+ end
66
+
67
+ result
68
+ end
69
+
70
+ def container_dependencies
71
+ depends_on_directives.map(&:container_name)
72
+ end
73
+
74
+ def before_start_directives
75
+ @directives.select(&:before_start?)
76
+ end
77
+
78
+ def after_start_directives
79
+ @directives.select(&:after_start?)
80
+ end
81
+
82
+ private
83
+
84
+ def from_directive
85
+ @directives.detect {|c| c.instance_of?(Indocker::ContainerDirectives::From)}
86
+ end
87
+
88
+ def network_directives
89
+ @directives.select {|d| d.instance_of?(Indocker::ContainerDirectives::Network)}
90
+ end
91
+
92
+ def env_directives
93
+ @directives.select {|d| d.instance_of?(Indocker::ContainerDirectives::EnvFile)}
94
+ end
95
+
96
+ def expose_directives
97
+ @directives.select {|d| d.instance_of?(Indocker::ContainerDirectives::Expose)}
98
+ end
99
+
100
+ def ports_directives
101
+ @directives.select {|d| d.instance_of?(Indocker::ContainerDirectives::Ports)}
102
+ end
103
+
104
+ def depends_on_directives
105
+ @directives.select {|d| d.instance_of?(Indocker::ContainerDirectives::DependsOn)}
106
+ end
107
+ end
@@ -0,0 +1,27 @@
1
+ class Indocker::ContainerMetadataFactory
2
+ include SmartIoC::Iocify
3
+
4
+ bean :container_metadata_factory
5
+
6
+ inject :docker_api
7
+ inject :container_evaluator
8
+ inject :image_metadata_repository
9
+ inject :network_metadata_repository
10
+ inject :container_metadata_repository
11
+
12
+ def create(name, &definition)
13
+ context = Indocker::DSLContext.new(
14
+ images: image_metadata_repository,
15
+ networks: network_metadata_repository,
16
+ containers: container_metadata_repository,
17
+ container_name: name
18
+ )
19
+
20
+ directives = container_evaluator.evaluate(context, &definition)
21
+
22
+ Indocker::ContainerMetadata.new(
23
+ name: name.to_s,
24
+ directives: directives
25
+ )
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ class Indocker::ContainerMetadataRepository
2
+ include SmartIoC::Iocify
3
+
4
+ bean :container_metadata_repository
5
+
6
+ def put(metadata)
7
+ if get_by_name(metadata.name)
8
+ raise Indocker::Errors::InvalidParams, "Container name '#{metadata.name}' already in use"
9
+ end
10
+
11
+ all.push(metadata)
12
+ end
13
+
14
+ def get_by_name(container_name)
15
+ container = all.detect {|container| container.name == container_name.to_s}
16
+
17
+ container
18
+ end
19
+
20
+ def clear
21
+ @all = []
22
+ end
23
+
24
+ def all
25
+ @all ||= []
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ module Indocker
2
+ module Directives
3
+ class Base
4
+ def partial?
5
+ self.is_a?(Indocker::Directives::Partial)
6
+ end
7
+
8
+ def prepare_directive?
9
+ self.is_a?(Indocker::PrepareDirectives::Base)
10
+ end
11
+
12
+ def build_directive?
13
+ self.is_a?(Indocker::DockerDirectives::Base)
14
+ end
15
+
16
+ def container_directive?
17
+ self.is_a?(Indocker::ContainerDirectives::Base)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Indocker::ContainerDirectives
2
+ class Base < Indocker::Directives::Base
3
+ def before_start?
4
+ false
5
+ end
6
+
7
+ def after_start?
8
+ false
9
+ end
10
+
11
+ def before_stop?
12
+ false
13
+ end
14
+
15
+ def after_stop?
16
+ false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ class Indocker::ContainerDirectives::DependsOn < Indocker::ContainerDirectives::Base
2
+ attr_accessor :container_name
3
+
4
+ def initialize(container_name)
5
+ @container_name = container_name
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class Indocker::ContainerDirectives::EnvFile < Indocker::ContainerDirectives::Base
2
+ attr_accessor :path
3
+
4
+ def initialize(path)
5
+ @path = path
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class Indocker::ContainerDirectives::Expose < Indocker::ContainerDirectives::Base
2
+ attr_accessor :port
3
+
4
+ def initialize(port)
5
+ @port = port
6
+ end
7
+ end