sidedock 0.0.1 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sidedock/base.rb +11 -0
- data/lib/sidedock/cli/docker_cli.rb +5 -0
- data/lib/sidedock/cli/machine_cli.rb +5 -0
- data/lib/sidedock/cli.rb +21 -0
- data/lib/sidedock/container.rb +54 -0
- data/lib/sidedock/image.rb +24 -0
- data/lib/sidedock/machine.rb +57 -0
- data/lib/sidedock/port_configuration.rb +13 -0
- data/lib/sidedock/ports.rb +43 -0
- data/lib/sidedock.rb +39 -0
- metadata +27 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92788013f2d5b7639cfc7019d1a31ca8ae3530cf
|
4
|
+
data.tar.gz: e8a6675dac27fb06acca0fb3cd7e8815e62d1094
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 928fd851e3813ca8548783e60ea911c85966541ddde878e3a5ef19ead5a2e4b91534f22e15877d6aaa8596142b866b3fa664c6ccaa47211ea5863fafe094b89b
|
7
|
+
data.tar.gz: 4f8ccc2cfe822ff9e7464ec1a04efa0f0b46232656d791fd8c02d8656f36dcb165d0e971d67adc9b912d49d1899d1b48e6e8207ce0b8d0b375d0b9c8382ad535
|
data/lib/sidedock/cli.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'tty/command'
|
2
|
+
|
3
|
+
module Sidedock
|
4
|
+
class CLI
|
5
|
+
class_attribute :program
|
6
|
+
|
7
|
+
def initialize(default_options = '')
|
8
|
+
@default_options = default_options
|
9
|
+
@cmd = TTY::Command.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(command)
|
13
|
+
full_command = "#{program} #{@default_options} #{command}"
|
14
|
+
stdout, stderr = @cmd.run full_command
|
15
|
+
raise "`#{command}` failed" if stderr.present?
|
16
|
+
stdout.strip
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
%w( docker machine ).each { |file| require "sidedock/cli/#{file}_cli" }
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Sidedock
|
2
|
+
class Container < Base
|
3
|
+
attr_accessor :ports, :id
|
4
|
+
|
5
|
+
def initialize(id, port_mapping: {})
|
6
|
+
@id = id
|
7
|
+
@port_mapping = port_mapping
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.create(image_name_or_id, options)
|
11
|
+
raise "No image name given" unless image_name_or_id.present?
|
12
|
+
id = machine.execute "create -P #{image_name_or_id}"
|
13
|
+
new id, **options
|
14
|
+
end
|
15
|
+
|
16
|
+
def start
|
17
|
+
raise "already started" if running?
|
18
|
+
machine.execute "start #{@id}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def stop
|
22
|
+
raise "not running" unless running?
|
23
|
+
machine.execute "stop #{@id}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove
|
27
|
+
machine.execute "rm -f #{@id}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def ports
|
31
|
+
Ports.new(@id, @port_mapping) if @port_mapping.present?
|
32
|
+
end
|
33
|
+
|
34
|
+
def running?
|
35
|
+
machine.execute('ps -q --no-trunc').include? @id
|
36
|
+
end
|
37
|
+
|
38
|
+
def bash(command)
|
39
|
+
machine.execute "exec -t #{@id} bash -c '#{command}'"
|
40
|
+
end
|
41
|
+
|
42
|
+
def ip
|
43
|
+
machine.ip
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.using_image(image)
|
47
|
+
ps_output = machine.execute "ps -a -q --filter ancestor=#{image.id}"
|
48
|
+
|
49
|
+
ps_output.each_line.map do |id|
|
50
|
+
new id
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Sidedock
|
2
|
+
class Image < Base
|
3
|
+
attr_accessor :id
|
4
|
+
|
5
|
+
def initialize(id)
|
6
|
+
@id = id
|
7
|
+
end
|
8
|
+
|
9
|
+
def remove
|
10
|
+
remove_containers_using_it
|
11
|
+
machine.execute "rmi -f #{@id}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def remove_containers_using_it
|
15
|
+
Container.using_image(self).each(&:remove)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.build(dockerfile_path)
|
19
|
+
built_id = machine.execute "build -q #{dockerfile_path}"
|
20
|
+
Rails.logger.info "Built #{dockerfile_path}, image ID: #{built_id}"
|
21
|
+
new built_id
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,57 @@
|
|
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 running?
|
19
|
+
docker_machine("ls -q --filter state=Running").include? @name
|
20
|
+
end
|
21
|
+
|
22
|
+
def start
|
23
|
+
docker_machine "start #{@name}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def create
|
27
|
+
puts "Creating docker machine `#{@name}`. This may take a while."
|
28
|
+
docker_machine "create -d virtualbox #{@name}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def exists?
|
32
|
+
docker_machine("ls -q").include? @name
|
33
|
+
end
|
34
|
+
|
35
|
+
def ip
|
36
|
+
docker_machine "ip #{@name}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def execute(command)
|
40
|
+
ensure_running
|
41
|
+
cli.execute command
|
42
|
+
end
|
43
|
+
|
44
|
+
def docker_machine(command)
|
45
|
+
@machine_cli ||= MachineCLI.new
|
46
|
+
@machine_cli.execute command
|
47
|
+
end
|
48
|
+
|
49
|
+
def cli
|
50
|
+
@cli ||= DockerCLI.new options_to_let_docker_connect_to_it
|
51
|
+
end
|
52
|
+
|
53
|
+
def options_to_let_docker_connect_to_it
|
54
|
+
docker_machine("config #{@name}").gsub("\n", ' ')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Sidedock
|
2
|
+
class PortConfiguration < Base
|
3
|
+
attr_accessor :internal, :external, :protocol
|
4
|
+
CLI_FORMAT = /(?<internal>\d*)\/(?<protocol>tcp|udp) -> .*\:(?<external>\d*)/
|
5
|
+
|
6
|
+
def initialize(raw_configuration)
|
7
|
+
match = CLI_FORMAT.match raw_configuration
|
8
|
+
@internal = match[:internal].to_i
|
9
|
+
@external = match[:external].to_i
|
10
|
+
@protocol = match[:protocol]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Sidedock
|
2
|
+
class Ports < Base
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(machine_id, port_mapping)
|
6
|
+
@port_mapping = port_mapping
|
7
|
+
@machine_id = machine_id
|
8
|
+
define_port_accessors if @port_mapping.present?
|
9
|
+
end
|
10
|
+
|
11
|
+
def define_port_accessors
|
12
|
+
@port_mapping.each do |name, port_number|
|
13
|
+
raise "#{name} cannot be used as port mapping key" if respond_to? :name
|
14
|
+
|
15
|
+
port = find do |port|
|
16
|
+
port.internal == port_number
|
17
|
+
end
|
18
|
+
|
19
|
+
raise "Port #{port_number} not exposed by Dockerfile, " \
|
20
|
+
"change or remove it in the `port_mapping` option. "\
|
21
|
+
"Available: #{each.to_h}" unless port.present?
|
22
|
+
|
23
|
+
define_singleton_method name do
|
24
|
+
port.external
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def each(&block)
|
30
|
+
ports.each &block
|
31
|
+
end
|
32
|
+
|
33
|
+
def ports
|
34
|
+
@ports ||= raw_configuration_lines.map do |raw_configuration|
|
35
|
+
PortConfiguration.new raw_configuration
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def raw_configuration_lines
|
40
|
+
@raw_configuration_lines ||= machine.execute("port #{@machine_id}").strip.split("\n")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/sidedock.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
%w( cli machine base image container ports port_configuration
|
2
|
+
).each { |file| require "sidedock/#{file}" }
|
3
|
+
|
4
|
+
module Sidedock
|
5
|
+
class << self
|
6
|
+
def with_docker_image(image, options = {}, &block)
|
7
|
+
container = Sidedock::Container.create image, options
|
8
|
+
container.start
|
9
|
+
yield container
|
10
|
+
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
|
37
|
+
end
|
38
|
+
end
|
39
|
+
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:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Raasveld
|
@@ -9,13 +9,37 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2016-06-23 00:00:00.000000000 Z
|
12
|
-
dependencies:
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: tty-command
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.0
|
13
27
|
description: Simplify working with Docker by running Dockerfiles from your Rails app
|
14
28
|
email: ttimitri@gmail.com
|
15
29
|
executables: []
|
16
30
|
extensions: []
|
17
31
|
extra_rdoc_files: []
|
18
|
-
files:
|
32
|
+
files:
|
33
|
+
- lib/sidedock.rb
|
34
|
+
- lib/sidedock/base.rb
|
35
|
+
- lib/sidedock/cli.rb
|
36
|
+
- lib/sidedock/cli/docker_cli.rb
|
37
|
+
- lib/sidedock/cli/machine_cli.rb
|
38
|
+
- lib/sidedock/container.rb
|
39
|
+
- lib/sidedock/image.rb
|
40
|
+
- lib/sidedock/machine.rb
|
41
|
+
- lib/sidedock/port_configuration.rb
|
42
|
+
- lib/sidedock/ports.rb
|
19
43
|
homepage: https://github.com/timraasveld/sidedock
|
20
44
|
licenses:
|
21
45
|
- MIT
|