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.
- checksums.yaml +4 -4
- data/Gemfile.lock +42 -6
- data/bin/indocker +1 -1
- data/indocker.gemspec +4 -0
- data/lib/indocker/application_initializer.rb +1 -12
- data/lib/indocker/cli.rb +10 -0
- data/lib/indocker/configs/config.rb +93 -22
- data/lib/indocker/configs/config_factory.rb +17 -16
- data/lib/indocker/configs/config_initializer.rb +9 -0
- data/lib/indocker/container/container_builder.rb +29 -0
- data/lib/indocker/{directives → container}/container_directives_runner.rb +8 -0
- data/lib/indocker/container/container_dsl.rb +26 -3
- data/lib/indocker/container/container_inspector.rb +26 -0
- data/lib/indocker/container/container_manager.rb +43 -32
- data/lib/indocker/container/container_metadata.rb +31 -26
- data/lib/indocker/container/container_metadata_factory.rb +5 -2
- data/lib/indocker/directives/base.rb +6 -10
- data/lib/indocker/directives/container_directives/base.rb +4 -0
- data/lib/indocker/directives/container_directives/cmd.rb +7 -0
- data/lib/indocker/directives/container_directives/env.rb +7 -0
- data/lib/indocker/directives/container_directives/env_file.rb +3 -3
- data/lib/indocker/directives/container_directives/from.rb +4 -2
- data/lib/indocker/directives/container_directives/ports.rb +11 -4
- data/lib/indocker/directives/container_directives/volume.rb +23 -0
- data/lib/indocker/directives/{docker_directives → image_directives}/base.rb +13 -1
- data/lib/indocker/directives/{docker_directives → image_directives}/cmd.rb +5 -1
- data/lib/indocker/directives/image_directives/copy.rb +32 -0
- data/lib/indocker/directives/{prepare_directives → image_directives}/docker_cp.rb +5 -1
- data/lib/indocker/directives/{docker_directives → image_directives}/entrypoint.rb +5 -1
- data/lib/indocker/directives/image_directives/env.rb +9 -0
- data/lib/indocker/directives/image_directives/env_file.rb +19 -0
- data/lib/indocker/directives/image_directives/expose.rb +9 -0
- data/lib/indocker/directives/image_directives/from.rb +36 -0
- data/lib/indocker/directives/image_directives/registry.rb +30 -0
- data/lib/indocker/directives/image_directives/run.rb +17 -0
- data/lib/indocker/directives/image_directives/workdir.rb +9 -0
- data/lib/indocker/directives/partial.rb +9 -1
- data/lib/indocker/docker_api/container_config.rb +121 -0
- data/lib/indocker/{docker_api.rb → docker_api/docker_api.rb} +79 -52
- data/lib/indocker/dsl_context.rb +4 -0
- data/lib/indocker/envs/env_metadata.rb +4 -0
- data/lib/indocker/errors.rb +5 -1
- data/lib/indocker/git/git_api.rb +32 -0
- data/lib/indocker/git/git_helper.rb +34 -0
- data/lib/indocker/git/git_service.rb +21 -0
- data/lib/indocker/handlers/{run_container.rb → container_run.rb} +4 -13
- data/lib/indocker/handlers/container_stop.rb +17 -0
- data/lib/indocker/handlers/performable.rb +22 -0
- data/lib/indocker/image/image_builder.rb +22 -7
- data/lib/indocker/image/image_dependencies_manager.rb +13 -9
- data/lib/indocker/image/image_directives_runner.rb +99 -0
- data/lib/indocker/image/image_dockerfile_builder.rb +24 -0
- data/lib/indocker/image/image_dsl.rb +38 -18
- data/lib/indocker/image/image_evaluator.rb +1 -1
- data/lib/indocker/image/image_helper.rb +9 -0
- data/lib/indocker/image/image_metadata.rb +9 -9
- data/lib/indocker/image/image_metadata_factory.rb +11 -10
- data/lib/indocker/image/image_metadata_repository.rb +8 -9
- data/lib/indocker/registry/registry_api.rb +46 -0
- data/lib/indocker/registry/registry_helper.rb +20 -0
- data/lib/indocker/registry/registry_service.rb +28 -0
- data/lib/indocker/utils/logger_factory.rb +1 -0
- data/lib/indocker/utils/registry_authenticator.rb +5 -5
- data/lib/indocker/utils/tar_helper.rb +5 -5
- data/lib/indocker/version.rb +1 -1
- data/lib/indocker/volumes/volume_metadata.rb +9 -0
- data/lib/indocker/volumes/volume_metadata_factory.rb +9 -0
- data/lib/indocker/volumes/volume_metadata_repository.rb +34 -0
- data/lib/indocker.rb +56 -27
- data/spec/example/.indocker/config.rb +14 -7
- data/spec/fixtures/spec.env +2 -0
- data/spec/indocker/configs/config_spec.rb +52 -1
- data/spec/indocker/container/container_builder_spec.rb +67 -0
- data/spec/indocker/container/container_manager_spec.rb +177 -129
- data/spec/indocker/docker_api/container_config_spec.rb +64 -0
- data/spec/indocker/{utils → docker_api}/docker_api_spec.rb +38 -13
- data/spec/indocker/handlers/container_run_spec.rb +60 -0
- data/spec/indocker/image/image_builder_spec.rb +64 -26
- data/spec/indocker/image/image_directives_runner_spec.rb +141 -0
- data/spec/indocker/image/image_dockerfile_builder_spec.rb +25 -0
- data/spec/indocker/image/image_evaluator_spec.rb +29 -9
- data/spec/spec_helper.rb +38 -16
- metadata +108 -32
- data/lib/indocker/directives/docker_directives/copy.rb +0 -27
- data/lib/indocker/directives/docker_directives/env.rb +0 -5
- data/lib/indocker/directives/docker_directives/from.rb +0 -30
- data/lib/indocker/directives/docker_directives/run.rb +0 -5
- data/lib/indocker/directives/docker_directives/workdir.rb +0 -5
- data/lib/indocker/directives/image_directives_runner.rb +0 -120
- data/lib/indocker/directives/prepare_directives/base.rb +0 -6
- data/lib/indocker/envs/manager.rb +0 -30
- data/lib/indocker/handlers/base.rb +0 -13
- data/spec/indocker/directives/image_directives_runner_spec.rb +0 -121
- data/spec/indocker/handlers/run_container_spec.rb +0 -107
- data/spec/tmp/indocker_list_container_files/deeper/example3.txt +0 -1
- data/spec/tmp/indocker_list_container_files/deeper/example4.txt +0 -1
- data/spec/tmp/indocker_list_container_files/example1.txt +0 -1
- data/spec/tmp/indocker_list_container_files/example2.txt +0 -1
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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)
|
|
188
|
+
def copy_from_container(name:, path:, &block)
|
|
189
|
+
Docker::Container.get(name.to_s).copy(path, &block)
|
|
133
190
|
end
|
|
134
191
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
data/lib/indocker/dsl_context.rb
CHANGED
data/lib/indocker/errors.rb
CHANGED
|
@@ -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::
|
|
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
|
-
|
|
10
|
-
|
|
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.
|
|
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::
|
|
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
|
|
26
|
-
|
|
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(
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|