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
@@ -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