docktor 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/bin/doc +5 -1
- data/lib/docktor.rb +3 -0
- data/lib/docktor/container.rb +4 -3
- data/lib/docktor/docker_client.rb +9 -7
- data/lib/docktor/manifest.rb +54 -0
- data/lib/docktor/manifest_parser.rb +24 -0
- data/lib/docktor/runner.rb +15 -4
- data/lib/docktor/version.rb +1 -1
- metadata +4 -3
- data/lib/docktor/yaml_parser.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 668089227b7edce1c61b2969309282930668aca8
|
4
|
+
data.tar.gz: 4cc904b8dddf40bd913e603fb870d0a677a2c139
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b0755e53477032149692af0a46b1d6c37f9c3638af0a72263e85c49fd85bffd075ce176b9414f7c978a7638d02ccaff40f37ec71e1c137f0ac8b03abf0d0393
|
7
|
+
data.tar.gz: c1d39ce8a1361f9e0070580ccff5c6b84f846cb2452005a3022fbe1510a45dd20dda4ec7431607827da18224cad8d1d33b825df4ec37fb564e40da6f505e40be
|
data/Gemfile
CHANGED
data/bin/doc
CHANGED
data/lib/docktor.rb
CHANGED
data/lib/docktor/container.rb
CHANGED
@@ -2,9 +2,9 @@ require "virtus"
|
|
2
2
|
|
3
3
|
module Docktor
|
4
4
|
class Container
|
5
|
-
include Virtus.
|
5
|
+
include Virtus.model
|
6
6
|
|
7
|
-
OPTION_ATTRIBUTES = %i(volumes ports links environment)
|
7
|
+
OPTION_ATTRIBUTES = %i(volumes ports links environment detach)
|
8
8
|
|
9
9
|
values do
|
10
10
|
attribute :name, String
|
@@ -14,10 +14,11 @@ module Docktor
|
|
14
14
|
attribute :ports, Array[String]
|
15
15
|
attribute :links, Array[String]
|
16
16
|
attribute :environment, Hash[String, String]
|
17
|
+
attribute :detach, Boolean, default: false
|
17
18
|
end
|
18
19
|
|
19
20
|
def options
|
20
|
-
attributes.select { |key, value| (key
|
21
|
+
attributes = self.attributes.select { |key, value| OPTION_ATTRIBUTES.include?(key) && !value.try(:empty?) }
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
@@ -3,27 +3,29 @@ module Docktor
|
|
3
3
|
CONTAINER_NAME_PREFIX = "docktor_"
|
4
4
|
|
5
5
|
def container_exists?(container)
|
6
|
-
`docker ps
|
6
|
+
`docker ps --all --quiet --filter name=#{container_name(container.name)}`.present?
|
7
7
|
end
|
8
8
|
|
9
9
|
def run(container)
|
10
|
-
|
11
|
-
`docker run -d --name #{container_name(container.name)} #{parse_options(container.options)} #{container.image} #{container.command}`
|
10
|
+
`docker run --name #{container_name(container.name)} #{parse_options(container.options)} #{container.image} #{container.command}`
|
12
11
|
end
|
13
12
|
|
14
13
|
def start(container)
|
15
14
|
`docker start #{container_name(container.name)}`
|
16
15
|
end
|
17
16
|
|
17
|
+
private
|
18
|
+
|
18
19
|
def parse_options(options)
|
19
20
|
options.map do |name, value|
|
20
21
|
case name
|
21
|
-
when :
|
22
|
-
when :
|
23
|
-
when :
|
22
|
+
when :detach then "--detach=#{value}"
|
23
|
+
when :volumes then "--volume #{value.join(" ")}"
|
24
|
+
when :ports then "--publish #{value.join(" ")}"
|
25
|
+
when :links
|
24
26
|
value.map { |v| "--link #{container_name(v)}" }.join(" ")
|
25
27
|
when :environment
|
26
|
-
"
|
28
|
+
"--env #{value.map { |k, v| %(#{k}="#{v}") }.join(" ")}"
|
27
29
|
end
|
28
30
|
end.join(" ").strip
|
29
31
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "virtus"
|
2
|
+
require "docktor/container"
|
3
|
+
|
4
|
+
module Docktor
|
5
|
+
class Manifest
|
6
|
+
include Virtus.model
|
7
|
+
|
8
|
+
class ContainerNotFound < StandardError; end
|
9
|
+
|
10
|
+
values do
|
11
|
+
attribute :containers_for_execution, Array[String]
|
12
|
+
attribute :containers, Array[Docktor::Container]
|
13
|
+
end
|
14
|
+
|
15
|
+
def select_container_for_execution(container_name)
|
16
|
+
select_containers_for_execution([container_name])
|
17
|
+
end
|
18
|
+
|
19
|
+
def select_containers_for_execution(container_names)
|
20
|
+
self.containers_for_execution = []
|
21
|
+
|
22
|
+
container_names.each do |name|
|
23
|
+
container = find_container_by_name(name)
|
24
|
+
|
25
|
+
fail ContainerNotFound, %(There is no container "#{name}") if container.nil?
|
26
|
+
|
27
|
+
containers_for_execution << container
|
28
|
+
self.containers_for_execution += find_container_links(container)
|
29
|
+
end
|
30
|
+
|
31
|
+
containers_for_execution.uniq!
|
32
|
+
sort_containers_for_execution!
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_container_by_name(name)
|
36
|
+
containers.find { |container| container.name == name }
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_container_links(container)
|
40
|
+
container.links.map { |link| find_container_by_name link }
|
41
|
+
end
|
42
|
+
|
43
|
+
def sort_containers_for_execution!
|
44
|
+
sorted_containers = []
|
45
|
+
|
46
|
+
containers_for_execution.each do |container|
|
47
|
+
links_indexes = container.links.map { |link| sorted_containers.index link }
|
48
|
+
sorted_containers.insert((links_indexes.max || -1) + 1, container)
|
49
|
+
end
|
50
|
+
|
51
|
+
self.containers_for_execution = sorted_containers
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "docktor/manifest"
|
3
|
+
require "docktor/container"
|
4
|
+
|
5
|
+
module Docktor
|
6
|
+
class ManifestParser
|
7
|
+
def parse(yaml_path)
|
8
|
+
manifest_data = YAML.load_file(yaml_path)
|
9
|
+
manifest = Docktor::Manifest.new
|
10
|
+
default_containers = manifest_data.delete("doc_defaults")
|
11
|
+
|
12
|
+
manifest.containers = manifest_data.map do |container_name, options|
|
13
|
+
Container.new(
|
14
|
+
name: container_name,
|
15
|
+
**options.symbolize_keys
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
manifest.select_containers_for_execution default_containers
|
20
|
+
|
21
|
+
manifest
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/docktor/runner.rb
CHANGED
@@ -1,20 +1,31 @@
|
|
1
|
-
require "docktor/
|
1
|
+
require "docktor/manifest_parser"
|
2
2
|
require "docktor/docker_client"
|
3
3
|
|
4
4
|
module Docktor
|
5
5
|
class Runner
|
6
|
+
class ContainerNotFound < StandardError; end
|
7
|
+
|
6
8
|
DEFAULT_YAML_PATH = "./docktor.yml"
|
7
9
|
|
8
|
-
def invoke(
|
9
|
-
|
10
|
+
def invoke(
|
11
|
+
container_name: nil,
|
12
|
+
yaml_path: DEFAULT_YAML_PATH,
|
13
|
+
parser: Docktor::ManifestParser.new,
|
14
|
+
client: Docktor::DockerClient.new
|
15
|
+
)
|
16
|
+
manifest = parser.parse(yaml_path)
|
17
|
+
|
18
|
+
manifest.select_container_for_execution(container_name) if container_name.present?
|
10
19
|
|
11
|
-
|
20
|
+
manifest.containers_for_execution.each do |container|
|
12
21
|
if client.container_exists?(container)
|
13
22
|
client.start container
|
14
23
|
else
|
15
24
|
client.run container
|
16
25
|
end
|
17
26
|
end
|
27
|
+
rescue Docktor::Manifest::ContainerNotFound => e
|
28
|
+
raise ContainerNotFound, e.message
|
18
29
|
end
|
19
30
|
end
|
20
31
|
end
|
data/lib/docktor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docktor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcelo Munhoz Pélos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -75,9 +75,10 @@ files:
|
|
75
75
|
- lib/docktor.rb
|
76
76
|
- lib/docktor/container.rb
|
77
77
|
- lib/docktor/docker_client.rb
|
78
|
+
- lib/docktor/manifest.rb
|
79
|
+
- lib/docktor/manifest_parser.rb
|
78
80
|
- lib/docktor/runner.rb
|
79
81
|
- lib/docktor/version.rb
|
80
|
-
- lib/docktor/yaml_parser.rb
|
81
82
|
homepage: https://github.com/mpelos/docktor
|
82
83
|
licenses:
|
83
84
|
- MIT
|
data/lib/docktor/yaml_parser.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require "yaml"
|
2
|
-
require "docktor/container"
|
3
|
-
|
4
|
-
module Docktor
|
5
|
-
class YAMLParser
|
6
|
-
def parse(yaml_path)
|
7
|
-
YAML.load_file(yaml_path).map do |container_name, options|
|
8
|
-
Container.new(
|
9
|
-
name: container_name,
|
10
|
-
image: options["image"],
|
11
|
-
volumes: options["volumes"],
|
12
|
-
ports: options["ports"],
|
13
|
-
links: options["links"],
|
14
|
-
command: options["command"],
|
15
|
-
environment: options["environment"]
|
16
|
-
)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|