indocker 0.0.2 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|