sidedock 2.0.0.pre.beta1 → 2.0.0.pre.beta2
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/lib/sidedock/base.rb +6 -4
- data/lib/sidedock/cli/docker_cli.rb +2 -0
- data/lib/sidedock/cli.rb +24 -3
- data/lib/sidedock/configuration.rb +0 -1
- data/lib/sidedock/container.rb +15 -9
- data/lib/sidedock/errors.rb +32 -0
- data/lib/sidedock/image.rb +3 -3
- data/lib/sidedock/port_configuration.rb +4 -0
- data/lib/sidedock/ports.rb +4 -4
- data/lib/sidedock/service.rb +68 -0
- data/lib/sidedock.rb +3 -27
- metadata +33 -5
- data/lib/sidedock/cli/machine_cli.rb +0 -5
- data/lib/sidedock/machine.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 773d21903cb8ef30df471830bc42a5ecd7e37ee2
|
4
|
+
data.tar.gz: 4f716d782a3ca186190faccc4d36ea2aa41cb1b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95735346161c7b6af544be9aac823467a8df1483e3b959f6d22d8a4b23539ceda62fb69376b226579f0c0d50337e31891cd5ac9c6983cb37323253d83a9e1008
|
7
|
+
data.tar.gz: 8a766c71866130d1ed196964782ba3fdc2e85dc0718a3c4e612ff70bdf2a3104b6e6a8c3a6e4f008c9bfd2d2c05b6f7b2d93fc7e025ff6a94768d8a4ddac584b
|
data/lib/sidedock/base.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module Sidedock
|
2
2
|
class Base
|
3
|
-
def
|
4
|
-
self.class.
|
3
|
+
def cli
|
4
|
+
self.class.cli
|
5
5
|
end
|
6
6
|
|
7
|
-
def self.
|
8
|
-
|
7
|
+
def self.cli
|
8
|
+
args = '--debug' if Sidedock.configuration.debug
|
9
|
+
args ||= ''
|
10
|
+
@@cli ||= DockerCLI.new args
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
data/lib/sidedock/cli.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'tty/command'
|
2
|
+
require 'uber/inheritable_attr'
|
2
3
|
|
3
4
|
module Sidedock
|
5
|
+
# Base class for command line utilities used by sidedock.
|
4
6
|
class CLI
|
5
|
-
|
7
|
+
extend Uber::InheritableAttr
|
8
|
+
inheritable_attr :program # System command name
|
6
9
|
|
7
10
|
def initialize(default_options = '')
|
8
11
|
@default_options = default_options
|
9
12
|
end
|
10
13
|
|
11
|
-
|
12
14
|
def execute(command)
|
13
15
|
full_command = "#{program} #{@default_options} #{command}"
|
14
16
|
stdout, stderr = command_runner.run full_command
|
@@ -16,6 +18,25 @@ module Sidedock
|
|
16
18
|
stdout.strip
|
17
19
|
end
|
18
20
|
|
21
|
+
protected
|
22
|
+
# Create wrapper for a CLI command of the program.
|
23
|
+
# Mainly useful for testing purposes because you want to mock output of a given command
|
24
|
+
def self.command_wrapper(*commands)
|
25
|
+
commands.each do |command|
|
26
|
+
raise "#{command} cannot be used as command wrapper because method already exists for #{self}" if respond_to? command
|
27
|
+
|
28
|
+
define_method command do |args|
|
29
|
+
execute "#{command} #{args}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def program
|
37
|
+
self.class.program
|
38
|
+
end
|
39
|
+
|
19
40
|
def command_runner
|
20
41
|
if Sidedock.configuration.debug
|
21
42
|
debug_command_runner
|
@@ -34,4 +55,4 @@ module Sidedock
|
|
34
55
|
end
|
35
56
|
end
|
36
57
|
|
37
|
-
%w( docker
|
58
|
+
%w( docker ).each { |file| require "sidedock/cli/#{file}_cli" }
|
data/lib/sidedock/container.rb
CHANGED
@@ -9,22 +9,22 @@ module Sidedock
|
|
9
9
|
|
10
10
|
def self.create(image_name_or_id, options)
|
11
11
|
raise "No image name given" unless image_name_or_id.present?
|
12
|
-
id =
|
12
|
+
id = cli.create "-P #{image_name_or_id}"
|
13
13
|
new id, **options
|
14
14
|
end
|
15
15
|
|
16
16
|
def start
|
17
17
|
raise "already started" if running?
|
18
|
-
|
18
|
+
cli.execute "start #{@id}"
|
19
19
|
end
|
20
20
|
|
21
21
|
def stop
|
22
22
|
raise "not running" unless running?
|
23
|
-
|
23
|
+
cli.execute "stop #{@id}"
|
24
24
|
end
|
25
25
|
|
26
26
|
def remove
|
27
|
-
|
27
|
+
cli.execute "rm -f #{@id}"
|
28
28
|
end
|
29
29
|
|
30
30
|
def ports
|
@@ -32,19 +32,25 @@ module Sidedock
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def running?
|
35
|
-
|
35
|
+
cli.execute('ps -q --no-trunc').include? @id
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
39
|
-
|
38
|
+
def sh(command)
|
39
|
+
cli.execute "exec -t #{@id} bash -c '#{command}'"
|
40
40
|
end
|
41
41
|
|
42
42
|
def ip
|
43
|
-
|
43
|
+
cli.ip
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.all
|
47
|
+
cli.execute('ps -q --no-trunc').split.map do |id|
|
48
|
+
new id
|
49
|
+
end
|
44
50
|
end
|
45
51
|
|
46
52
|
def self.using_image(image)
|
47
|
-
ps_output =
|
53
|
+
ps_output = cli.execute "ps -a -q --filter ancestor=#{image.id}"
|
48
54
|
|
49
55
|
ps_output.each_line.map do |id|
|
50
56
|
new id
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Sidedock
|
2
|
+
class Error < StandardError; end
|
3
|
+
class DockerfileNotFound < Error
|
4
|
+
def initialize(dockerfile)
|
5
|
+
@dockerfile = dockerfile
|
6
|
+
end
|
7
|
+
|
8
|
+
def message
|
9
|
+
"Expected Dockerfile to be defined in #{@dockerfile}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class DirectoryNotFound < Error
|
14
|
+
def initialize(search_paths)
|
15
|
+
@search_paths = search_paths
|
16
|
+
end
|
17
|
+
|
18
|
+
def message
|
19
|
+
"Expected one of directories #{@search_paths} to exists"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class MethodInUse < Error
|
24
|
+
def initialize(klass, method)
|
25
|
+
@klass, @method = klass, method
|
26
|
+
end
|
27
|
+
|
28
|
+
def message
|
29
|
+
"Cannot define #{@klass}##{@method} because it is already implemented"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/sidedock/image.rb
CHANGED
@@ -8,15 +8,15 @@ module Sidedock
|
|
8
8
|
|
9
9
|
def remove
|
10
10
|
remove_containers_using_it
|
11
|
-
|
11
|
+
cli.execute "rmi -f #{@id}"
|
12
12
|
end
|
13
13
|
|
14
14
|
def remove_containers_using_it
|
15
15
|
Container.using_image(self).each(&:remove)
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.build(dockerfile_path)
|
19
|
-
built_id =
|
18
|
+
def self.build(dockerfile_path, dockerfile = 'Dockerfile')
|
19
|
+
built_id = cli.execute "build -q #{dockerfile_path} --file #{dockerfile}"
|
20
20
|
new built_id
|
21
21
|
end
|
22
22
|
end
|
data/lib/sidedock/ports.rb
CHANGED
@@ -2,15 +2,15 @@ module Sidedock
|
|
2
2
|
class Ports < Base
|
3
3
|
include Enumerable
|
4
4
|
|
5
|
-
def initialize(
|
5
|
+
def initialize(container_id, port_mapping)
|
6
6
|
@port_mapping = port_mapping
|
7
|
-
@
|
7
|
+
@container_id = container_id
|
8
8
|
define_port_accessors if @port_mapping.present?
|
9
9
|
end
|
10
10
|
|
11
11
|
def define_port_accessors
|
12
12
|
@port_mapping.each do |name, port_number|
|
13
|
-
raise
|
13
|
+
raise MethodInUse.new(self.class) if respond_to? name
|
14
14
|
|
15
15
|
port = find do |port|
|
16
16
|
port.internal == port_number
|
@@ -37,7 +37,7 @@ module Sidedock
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def raw_configuration_lines
|
40
|
-
@raw_configuration_lines ||=
|
40
|
+
@raw_configuration_lines ||= cli.execute("port #{@container_id}").strip.split("\n")
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
|
3
|
+
module Sidedock
|
4
|
+
class Service
|
5
|
+
attr_reader :container
|
6
|
+
|
7
|
+
delegate :sh, :ports, to: :container
|
8
|
+
|
9
|
+
def self.use(options = {})
|
10
|
+
options[:port_mapping] ||= {}
|
11
|
+
options[:port_mapping].merge! port_mapping
|
12
|
+
|
13
|
+
Sidedock.with_docker_image image.id, options do |container|
|
14
|
+
yield new(container)
|
15
|
+
end
|
16
|
+
|
17
|
+
remove_image unless options[:keep_image]
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def self.cli_method(*commands)
|
23
|
+
commands.each do |command|
|
24
|
+
raise MethodInUse.new self, command if method_defined? command
|
25
|
+
|
26
|
+
define_method command do |args|
|
27
|
+
container.sh "#{command} #{args}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
cattr_accessor :port_mapping
|
33
|
+
self.port_mapping = {}
|
34
|
+
|
35
|
+
def self.port(name, internal_port)
|
36
|
+
port_mapping[name] = internal_port
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.dockerfile_path
|
40
|
+
"#{directory}/#{dockerfile}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.dockerfile
|
44
|
+
'Dockerfile'
|
45
|
+
end
|
46
|
+
|
47
|
+
cattr_accessor :directory
|
48
|
+
def self.inherited(k)
|
49
|
+
k.directory = caller.first.match(/^([^:]+)\/.+\.rb/)[1]
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.image
|
53
|
+
raise DockerfileNotFound.new(dockerfile_path) unless File.exist? dockerfile_path
|
54
|
+
@@image ||= Image.build directory, dockerfile_path
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def initialize(container)
|
60
|
+
@container = container
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.remove_image
|
64
|
+
image.remove
|
65
|
+
@@image = nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/sidedock.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
require 'active_support/core_ext/object/blank'
|
2
|
+
%w( service configuration cli base image container ports port_configuration errors
|
2
3
|
).each { |file| require "sidedock/#{file}" }
|
3
4
|
|
4
5
|
module Sidedock
|
@@ -8,32 +9,7 @@ module Sidedock
|
|
8
9
|
container.start
|
9
10
|
yield container
|
10
11
|
container.stop
|
11
|
-
container.remove
|
12
|
-
end
|
13
|
-
|
14
|
-
def with_dockerfile(name, options = {}, &block)
|
15
|
-
image = Sidedock::Image.build path_to_dockerfile(name)
|
16
|
-
|
17
|
-
with_docker_image image.id, options do |container|
|
18
|
-
yield container
|
19
|
-
end
|
20
|
-
|
21
|
-
image.remove
|
22
|
-
end
|
23
|
-
|
24
|
-
def path_to_dockerfile(name)
|
25
|
-
path = Rails.root.join base_directory, 'docker', name
|
26
|
-
raise "Dockerfile path `#{path}` not found" unless File.exist? path
|
27
|
-
path
|
28
|
-
end
|
29
|
-
|
30
|
-
def base_directory
|
31
|
-
case ENV['RAILS_ENV']
|
32
|
-
when 'test'
|
33
|
-
'spec'
|
34
|
-
else
|
35
|
-
'app'
|
36
|
-
end
|
12
|
+
container.remove
|
37
13
|
end
|
38
14
|
end
|
39
15
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidedock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.pre.
|
4
|
+
version: 2.0.0.pre.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Raasveld
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.1.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: uber
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.0.15
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.0.15
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rake
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -48,21 +76,21 @@ files:
|
|
48
76
|
- lib/sidedock/base.rb
|
49
77
|
- lib/sidedock/cli.rb
|
50
78
|
- lib/sidedock/cli/docker_cli.rb
|
51
|
-
- lib/sidedock/cli/machine_cli.rb
|
52
79
|
- lib/sidedock/configuration.rb
|
53
80
|
- lib/sidedock/container.rb
|
81
|
+
- lib/sidedock/errors.rb
|
54
82
|
- lib/sidedock/image.rb
|
55
|
-
- lib/sidedock/machine.rb
|
56
83
|
- lib/sidedock/port_configuration.rb
|
57
84
|
- lib/sidedock/ports.rb
|
85
|
+
- lib/sidedock/service.rb
|
58
86
|
homepage: https://github.com/timraasveld/sidedock
|
59
87
|
licenses:
|
60
88
|
- MIT
|
61
89
|
metadata: {}
|
62
90
|
post_install_message: |-
|
63
|
-
Make sure Docker is installed before
|
91
|
+
Make sure Docker is installed before using sidedock.
|
64
92
|
For example, try: brew cask install docker && open -a 'docker' (Mac)
|
65
|
-
|
93
|
+
apt-get install -y docker (Debian / Ubuntu)
|
66
94
|
rdoc_options: []
|
67
95
|
require_paths:
|
68
96
|
- lib
|
data/lib/sidedock/machine.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
module Sidedock
|
2
|
-
class Machine
|
3
|
-
def initialize(name)
|
4
|
-
@name = name
|
5
|
-
end
|
6
|
-
|
7
|
-
def ensure_exists
|
8
|
-
create unless exists?
|
9
|
-
raise "Could not create docker machine #{@name}" unless exists?
|
10
|
-
end
|
11
|
-
|
12
|
-
def ensure_running
|
13
|
-
ensure_exists
|
14
|
-
start unless running?
|
15
|
-
raise "Could not start docker machine #{@name}" unless running?
|
16
|
-
end
|
17
|
-
|
18
|
-
def start
|
19
|
-
docker_machine "start #{@name}"
|
20
|
-
end
|
21
|
-
|
22
|
-
def create
|
23
|
-
puts "Creating docker machine `#{@name}`. This may take a while."
|
24
|
-
docker_machine "create -d virtualbox #{@name}"
|
25
|
-
end
|
26
|
-
|
27
|
-
def running?
|
28
|
-
return true if @running
|
29
|
-
if docker_machine("ls -q --filter state=Running").include? @name
|
30
|
-
@running = true
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def exists?
|
35
|
-
return true if @exists
|
36
|
-
if docker_machine("ls -q").include? @name
|
37
|
-
@exists = true
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def ip
|
42
|
-
docker_machine "ip #{@name}"
|
43
|
-
end
|
44
|
-
|
45
|
-
def execute(command)
|
46
|
-
ensure_running
|
47
|
-
cli.execute command
|
48
|
-
end
|
49
|
-
|
50
|
-
def docker_machine(command)
|
51
|
-
@machine_cli ||= MachineCLI.new
|
52
|
-
@machine_cli.execute command
|
53
|
-
end
|
54
|
-
|
55
|
-
def cli
|
56
|
-
@cli ||= DockerCLI.new options_to_let_docker_connect_to_it
|
57
|
-
end
|
58
|
-
|
59
|
-
def options_to_let_docker_connect_to_it
|
60
|
-
docker_machine("config #{@name}").gsub("\n", ' ')
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|