sidedock 0.0.1 → 1.0.1
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 +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
|