indocker 0.0.2 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,5 +1,11 @@
1
- class Indocker::DockerApi
1
+ require 'docker-api'
2
+ require 'io/console'
3
+
4
+ Docker.options = { read_timeout: 600, write_timeout: 600, chunk_size: 1 }
5
+
6
+ class Indocker::DockerAPI
2
7
  include SmartIoC::Iocify
8
+ include Indocker::ImageHelper
3
9
 
4
10
  bean :docker_api
5
11
 
@@ -35,7 +41,7 @@ class Indocker::DockerApi
35
41
  Docker::Network.get(network_name.to_s).connect(container_id.to_s)
36
42
  end
37
43
 
38
- def remove_network(name)
44
+ def delete_network(name)
39
45
  Docker::Network.get(name.to_s).remove
40
46
  end
41
47
 
@@ -59,20 +65,20 @@ class Indocker::DockerApi
59
65
 
60
66
  # Images
61
67
 
62
- def get_image_id(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
63
- Docker::Image.get(full_name(repo, tag)).id
68
+ def get_image_id(repo, tag: nil)
69
+ Docker::Image.get(full_name(repo, tag)).id rescue nil
64
70
  end
65
71
 
66
- def image_exists?(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
72
+ def image_exists?(repo, tag: nil)
67
73
  Docker::Image.exist?(full_name(repo, tag))
68
74
  end
69
75
 
70
- def delete_image(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
76
+ def delete_image(repo, tag: nil)
71
77
  Docker::Image.get(full_name(repo, tag)).remove(force: true)
72
78
  end
73
79
 
74
80
  def build_from_dir(repo:, tag:, build_dir:)
75
- image = Docker::Image.build_from_dir(build_dir) do |x|
81
+ image = Docker::Image.build_from_dir(build_dir, { 't' => "#{repo}:#{tag}" }) do |x|
76
82
  x.split("\r\n").each do |y|
77
83
  if (log = JSON.parse(y)) && log.has_key?("stream")
78
84
  yield log["stream"].strip
@@ -80,15 +86,21 @@ class Indocker::DockerApi
80
86
  end
81
87
  end
82
88
 
83
- image.tag(
84
- repo: repo,
85
- tag: tag,
86
- force: true
87
- )
88
-
89
89
  image.id
90
90
  end
91
91
 
92
+ def tag(repo:, tag: nil, new_repo:, new_tag:)
93
+ Docker::Image.get(full_name(repo, tag)).tag('repo' => new_repo, 'tag' => new_tag)
94
+
95
+ nil
96
+ end
97
+
98
+ def push(repo:, tag:, push_to_repo:, push_to_tag:)
99
+ Docker::Image.get(full_name(repo, tag)).push(nil, repo_tag: full_name(push_to_repo, push_to_tag))
100
+
101
+ nil
102
+ end
103
+
92
104
  def pull(opts)
93
105
  image = Docker::Image.create(opts)
94
106
 
@@ -101,6 +113,37 @@ class Indocker::DockerApi
101
113
  end
102
114
  end
103
115
 
116
+ #Volumes
117
+
118
+ def create_volume(name)
119
+ Docker::Volume.create(name.to_s).id
120
+ end
121
+
122
+ def get_volume_id(name)
123
+ Docker::Volume.get(name.to_s).id
124
+ end
125
+
126
+ def all_volumes(name)
127
+ Docker::Volume.all
128
+ end
129
+
130
+ def delete_volume(name)
131
+ Docker::Volume.get(name.to_s).remove
132
+ end
133
+
134
+ def volume_exists?(name)
135
+ !Docker::Volume.get(name.to_s).nil? rescue false
136
+ end
137
+
138
+ def inspect_volume(name)
139
+ Docker::Volume.get(name.to_s).info
140
+ end
141
+
142
+ def delete_volumes_where(&condition)
143
+ Docker::Volume.all.select(&condition).map do |volume|
144
+ volume.remove
145
+ end
146
+ end
104
147
 
105
148
  # Containers
106
149
 
@@ -109,7 +152,11 @@ class Indocker::DockerApi
109
152
  end
110
153
 
111
154
  def get_container_id(name)
112
- Docker::Container.get(name.to_s).id
155
+ Docker::Container.get(name.to_s).id rescue nil
156
+ end
157
+
158
+ def get_container_image_id(name)
159
+ Docker::Container.get(name.to_s).info['Image'] rescue nil
113
160
  end
114
161
 
115
162
  def get_container_state(name)
@@ -120,38 +167,31 @@ class Indocker::DockerApi
120
167
  !Docker::Container.get(name.to_s).nil? rescue false
121
168
  end
122
169
 
123
- def start_container(name)
124
- Docker::Container.get(name.to_s).start!.id
170
+ def start_container(name, attach: false)
171
+ container = Docker::Container.get(name.to_s).start!
172
+
173
+ if attach
174
+ STDIN.raw do |stdin|
175
+ container.attach(stdin: stdin, tty: true) do |chunk|
176
+ logger << chunk
177
+ end
178
+ end
179
+ end
180
+
181
+ container.id
125
182
  end
126
183
 
127
184
  def stop_container(name)
128
- Docker::Container.get(name.to_s).stop
185
+ Docker::Container.get(name.to_s).stop rescue nil
129
186
  end
130
187
 
131
- def copy_from_container(name:, path:)
132
- Docker::Container.get(name.to_s).copy(path) { |chunk| yield chunk }
188
+ def copy_from_container(name:, path:, &block)
189
+ Docker::Container.get(name.to_s).copy(path, &block)
133
190
  end
134
191
 
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
192
+ # TODO: Add contract
193
+ def create_container(container_config)
194
+ Docker::Container.create(container_config.to_hash).id
155
195
  end
156
196
 
157
197
  def delete_container(name)
@@ -164,17 +204,4 @@ class Indocker::DockerApi
164
204
  container.delete(force: true)
165
205
  end
166
206
  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
207
  end
@@ -14,4 +14,8 @@ class Indocker::DSLContext
14
14
  def set_value(key, value)
15
15
  @storage[key] = value
16
16
  end
17
+
18
+ def +(other)
19
+ Indocker::DSLContext.new(@storage.merge(other.storage))
20
+ end
17
21
  end
@@ -18,6 +18,10 @@ module Indocker::Envs
18
18
  end
19
19
  end
20
20
 
21
+ def to_s
22
+ to_array.join(' ')
23
+ end
24
+
21
25
  def set(key:, value:)
22
26
  overwritten = @variables.has_key?(key) and @variables[key] != value
23
27
 
@@ -1,5 +1,6 @@
1
1
  module Indocker::Errors
2
2
  class ImageIsNotDefined < StandardError; end
3
+ class ImageIsNotBuilded < StandardError; end
3
4
  class PartialIsNotDefined < StandardError; end
4
5
  class ContainerIsNotDefined < StandardError; end
5
6
  class CircularImageDependency < StandardError; end
@@ -8,10 +9,13 @@ module Indocker::Errors
8
9
  class ConfigFilesDoesNotFound < StandardError; end
9
10
  class ConfigOptionTypeMismatch < StandardError; end
10
11
  class DockerRegistryAuthenticationError < StandardError; end
11
- class FileDoesNotExists < StandardError; end
12
12
  class EnvFileDoesNotExist < StandardError; end
13
13
  class ContainerTimeoutError < StandardError; end
14
+ class ReservedKeywordUsed < StandardError; end
15
+ class VolumeIsNotDefined < StandardError; end
14
16
 
15
17
  class ContainerImageAlreadyDefined < StandardError; end
16
18
  class NetworkAlreadyDefined < StandardError; end
19
+
20
+ class InvalidParams < StandardError; end
17
21
  end
@@ -0,0 +1,32 @@
1
+ require 'git'
2
+
3
+ class Indocker::Git::GitAPI
4
+ include SmartIoC::Iocify
5
+
6
+ bean :git_api
7
+
8
+ DEFAULT_REMOTE = 'origin'
9
+
10
+ def get_remote_from_directory(dir)
11
+ Git.open(dir).remote(DEFAULT_REMOTE).url
12
+ rescue ArgumentError
13
+ nil
14
+ end
15
+
16
+ def fetch(dir)
17
+ Git.open(dir).pull
18
+ end
19
+
20
+ def clone(repository:, dir:)
21
+ dir = File.expand_path(dir)
22
+
23
+ git_path = File.dirname(dir)
24
+ app_name = File.basename(dir)
25
+
26
+ Git.clone(repository, app_name, path: git_path)
27
+ end
28
+
29
+ def checkout(revision:, dir:)
30
+ Git.open(dir).checkout(revision)
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ module Indocker::Git
2
+ class GitHelper
3
+ include SmartIoC::Iocify
4
+
5
+ bean :git_helper
6
+
7
+ inject :config
8
+ inject :git_service
9
+
10
+ def method_missing(method, *args)
11
+ git_config = config.git.send(method)
12
+ git_cache_dir = config.git.cache_dir.join(method.to_s)
13
+
14
+ return git_cache_dir if updated?(git_config.repository)
15
+
16
+ git_service.update(
17
+ repository: git_config.repository,
18
+ revision: git_config.branch || git_config.tag,
19
+ workdir: git_cache_dir
20
+ )
21
+ git_cache.push(git_config.repository)
22
+
23
+ Pathname.new(git_cache_dir)
24
+ end
25
+
26
+ def git_cache
27
+ @git_cache ||= []
28
+ end
29
+
30
+ def updated?(url)
31
+ git_cache.include?(url)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ class Indocker::Git::GitService
2
+ include SmartIoC::Iocify
3
+
4
+ bean :git_service
5
+
6
+ inject :git_api
7
+
8
+ def update(repository:, revision:, workdir:)
9
+ workdir_repository = git_api.get_remote_from_directory(workdir)
10
+
11
+ if workdir_repository == repository
12
+ git_api.fetch(workdir)
13
+ git_api.checkout(revision: revision, dir: workdir)
14
+ else
15
+ FileUtils.rm_rf(workdir)
16
+
17
+ git_api.clone(repository: repository, dir: workdir)
18
+ git_api.checkout(revision: revision, dir: workdir)
19
+ end
20
+ end
21
+ end
@@ -1,4 +1,4 @@
1
- class Indocker::Handlers::RunContainer < Indocker::Handlers::Base
1
+ class Indocker::Handlers::ContainerRun
2
2
  include SmartIoC::Iocify
3
3
 
4
4
  bean :run_container_handler
@@ -6,24 +6,15 @@ class Indocker::Handlers::RunContainer < Indocker::Handlers::Base
6
6
  inject :container_manager
7
7
  inject :container_metadata_repository
8
8
  inject :image_builder
9
- inject :application_initializer
10
- inject :docker_api
11
- inject :logger
9
+
10
+ include Indocker::Handlers::Performable
12
11
 
13
12
  def handle(name:, current_path:)
14
13
  name = name.to_s
15
14
 
16
15
  container_metadata = container_metadata_repository.get_by_name(name)
17
-
18
- if docker_api.container_exists?(name)
19
- container_manager.stop(name)
20
- container_manager.delete(name)
21
- end
22
-
23
16
  image_builder.build(container_metadata.repo, tag: container_metadata.tag)
24
17
 
25
- container_manager.create(name)
26
-
27
- container_manager.start(name)
18
+ container_manager.run(name)
28
19
  end
29
20
  end
@@ -0,0 +1,17 @@
1
+ class Indocker::Handlers::ContainerStop
2
+ include SmartIoC::Iocify
3
+
4
+ bean :stop_container_handler
5
+
6
+ inject :container_manager
7
+ inject :container_metadata_repository
8
+ inject :image_builder
9
+
10
+ include Indocker::Handlers::Performable
11
+
12
+ def handle(name:, current_path:)
13
+ name = name.to_s
14
+
15
+ container_manager.stop(name)
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ module Indocker
2
+ module Handlers
3
+ module Performable
4
+ def self.included(klass)
5
+ klass.inject(:logger)
6
+ klass.inject(:application_initializer)
7
+ end
8
+
9
+ def perform(options)
10
+ env = options.delete(:env)
11
+
12
+ application_initializer.init_app(options[:current_path], env: env)
13
+
14
+ self.method(:handle).call(options)
15
+ rescue Docker::Error::ClientError => e
16
+ logger.error e.message
17
+ rescue Docker::Error::NotFoundError => e
18
+ logger.error(e.message)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -6,31 +6,46 @@ class Indocker::ImageBuilder
6
6
  inject :image_metadata_repository
7
7
  inject :image_dependencies_manager
8
8
  inject :image_directives_runner
9
- inject :image_evaluator
10
9
  inject :docker_api
11
10
  inject :logger
11
+ inject :image_dockerfile_builder
12
12
 
13
- def build(repo, tag: Indocker::ImageMetadata::DEFAULT_TAG)
13
+ def build(repo, tag: Indocker::ImageHelper::DEFAULT_TAG)
14
14
  image_metadata = image_metadata_repository.find_by_repo(repo, tag: tag)
15
-
15
+
16
16
  FileUtils.mkdir_p(image_metadata.build_dir)
17
17
 
18
18
  image_dependencies_manager.get_dependencies!(image_metadata).each do |dependency_metadata|
19
19
  build(dependency_metadata.repo, tag: dependency_metadata.tag)
20
20
  end
21
-
21
+
22
22
  image_directives_runner.run_all(image_metadata.prepare_directives)
23
23
 
24
24
  File.open(File.join(image_metadata.build_dir, Indocker::DOCKERFILE_NAME), 'w') do |f|
25
- f.puts image_metadata.build_directives.map(&:to_s)
26
- image_metadata.build_directives.map(&:to_s).each {|d| logger.debug d}
25
+ f.puts image_dockerfile_builder.build(*image_metadata.build_directives)
26
+
27
+ logger.debug image_dockerfile_builder.build(*image_metadata.build_directives)
27
28
  end
28
-
29
+
30
+ File.open(File.join(image_metadata.build_dir, '.dockerignore'), 'w') do |f|
31
+ f.puts '.git'
32
+ f.puts '.gitignore'
33
+ f.puts 'LICENSE'
34
+ f.puts 'VERSION'
35
+ f.puts 'README.md'
36
+ f.puts 'Changelog.md'
37
+ f.puts 'Makefile'
38
+ f.puts 'docker-compose.yml'
39
+ f.puts 'docs'
40
+ end
41
+
29
42
  docker_api.build_from_dir(
30
43
  repo: image_metadata.repo,
31
44
  tag: image_metadata.tag,
32
45
  build_dir: image_metadata.build_dir.to_s
33
46
  ) { |log| logger.info(log) }
47
+
48
+ image_directives_runner.run_all(image_metadata.after_build_directives)
34
49
  ensure
35
50
  image_metadata = image_metadata_repository.find_by_repo(repo, tag: tag)
36
51
 
@@ -3,7 +3,7 @@ class Indocker::ImageDependenciesManager
3
3
 
4
4
  bean :image_dependencies_manager
5
5
 
6
- inject :image_metadata_repository
6
+ inject :repository, ref: :image_metadata_repository
7
7
  inject :container_metadata_repository
8
8
  inject :image_evaluator
9
9
 
@@ -27,17 +27,21 @@ class Indocker::ImageDependenciesManager
27
27
  nil
28
28
  end
29
29
 
30
- def get_dependencies(image_metadata)
31
- container_dependencies = image_metadata.docker_cp_directives.map do |c|
30
+ def get_dependencies(meta)
31
+ dependencies = []
32
+
33
+ docker_cp_dependencies = meta.docker_cp_directives.map do |c|
32
34
  container = container_metadata_repository.get_by_name(c.container_name)
33
35
 
34
- image_metadata_repository.find_by_repo(container.repo, tag: container.tag)
36
+ repository.find_by_repo(container.repo, tag: container.tag)
37
+ end
38
+
39
+ dependencies.concat(docker_cp_dependencies)
40
+
41
+ if !meta.dockerhub_image?
42
+ dependencies << repository.find_by_repo(meta.from_repo, tag: meta.from_tag)
35
43
  end
36
-
37
- return container_dependencies if image_metadata.dockerhub_image?
38
-
39
- from_image_dependency = image_metadata_repository.find_by_repo(image_metadata.from_repo, tag: image_metadata.from_tag)
40
44
 
41
- container_dependencies.push from_image_dependency
45
+ dependencies.uniq
42
46
  end
43
47
  end
@@ -0,0 +1,99 @@
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
+ inject :docker_api
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::ImageDirectives::DockerCp
18
+ run_docker_cp(directive)
19
+ when Indocker::ImageDirectives::Copy
20
+ run_copy(directive)
21
+ when Indocker::ImageDirectives::Registry
22
+ run_registry(directive)
23
+ end
24
+ end
25
+
26
+ def run_docker_cp(directive)
27
+ directive.copy_actions.each do |from, to|
28
+ container_manager.copy(
29
+ name: directive.container_name,
30
+ copy_from: from,
31
+ copy_to: File.join(directive.build_dir, to)
32
+ )
33
+ end
34
+ end
35
+
36
+ def run_copy(directive)
37
+ directive.copy_actions.each do |from, _|
38
+ source = File.exists?(from) ? from : File.join(directive.build_dir, from)
39
+ destination = File.join(directive.build_dir.to_s, from.to_s)
40
+
41
+ copy_compile_file(
42
+ from: source,
43
+ to: destination,
44
+ locals: directive.locals,
45
+ compile: directive.compile
46
+ )
47
+ end
48
+ end
49
+
50
+ def run_registry(directive)
51
+ docker_api.tag(
52
+ repo: directive.repo,
53
+ tag: directive.tag,
54
+ new_repo: directive.new_repo,
55
+ new_tag: directive.new_tag
56
+ )
57
+
58
+ docker_api.push(
59
+ repo: directive.repo,
60
+ tag: directive.tag,
61
+ push_to_repo: directive.new_repo,
62
+ push_to_tag: directive.new_tag
63
+ ) if directive.push
64
+ end
65
+
66
+ private
67
+
68
+ def copy_compile_file(from:, to:, locals: {}, compile: false)
69
+ raise ArgumentError, "Copy destination #{from} not exists" if !File.exists?(from)
70
+
71
+ if File.directory?(from)
72
+ Dir.glob(File.join(from, '**', '*'), File::FNM_DOTMATCH).each do |file_source_path|
73
+ next if File.directory?(file_source_path)
74
+
75
+ file_relative_path = Pathname.new(file_source_path).relative_path_from( Pathname.new(from) ).to_s
76
+ file_destination_path = File.join(to, file_relative_path)
77
+
78
+ copy_compile_file(
79
+ from: file_source_path,
80
+ to: file_destination_path,
81
+ locals: locals,
82
+ compile: compile
83
+ )
84
+ end
85
+
86
+ return
87
+ end
88
+
89
+ if !Dir.exist?(File.dirname(to))
90
+ FileUtils.mkdir_p(File.dirname(to))
91
+ end
92
+
93
+ write_content = compile ? render_util.render( File.read(from), locals ) :
94
+ File.read(from)
95
+ File.write(to, write_content)
96
+
97
+ File.chmod(File.stat(from).mode, to)
98
+ end
99
+ end
@@ -0,0 +1,24 @@
1
+ class Indocker::ImageDockerfileBuilder
2
+ include SmartIoC::Iocify
3
+
4
+ bean :image_dockerfile_builder
5
+
6
+ inject :envs_loader
7
+
8
+ def build(*directives)
9
+ dockerfile_content = ""
10
+
11
+ dockerfile_content = directives.map do |directive|
12
+ case directive
13
+ when Indocker::ImageDirectives::EnvFile
14
+ env_metadata = envs_loader.parse(directive.path)
15
+
16
+ directive.to_s(env_metadata.to_s)
17
+ else
18
+ directive.to_s
19
+ end
20
+ end
21
+
22
+ dockerfile_content.join("\n")
23
+ end
24
+ end