kapten 0.1.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 +7 -0
- data/bin/kapten +5 -0
- data/lib/kapten/config.rb +39 -0
- data/lib/kapten/docker.rb +145 -0
- data/lib/kapten/helpers.rb +67 -0
- data/lib/kapten.rb +135 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a12301a0450644f79a5e7cccff56fb4bf25d7903
|
4
|
+
data.tar.gz: 80eb062eabdf84778f079912b10c245ef0ea497a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 00b93967c2d698f1dd6b17db04c6764399ccb9279aa536d5007738deb939edfba37e47c29a460448ad2f198e5651d3e20e7578cb31dee095394717bb8c5b8d8a
|
7
|
+
data.tar.gz: e4e720f309b7c75d385a1f9d30ee1bda8cfec240b0d4d9cf5f6c23e447eca12be05b537284ff2bbb670abdf480e0488b3fc0153fe8ddab5d21affe2c5e086f16
|
data/bin/kapten
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Kapten::Config
|
4
|
+
|
5
|
+
CONFIG_FILE = ".kapten.json"
|
6
|
+
|
7
|
+
|
8
|
+
# Get config from current directory (.kapten.json file)
|
9
|
+
def self.get
|
10
|
+
|
11
|
+
return false unless File.file?( Kapten::Config::CONFIG_FILE )
|
12
|
+
|
13
|
+
config_contents = File.read( Kapten::Config::CONFIG_FILE )
|
14
|
+
|
15
|
+
config = JSON.parse(config_contents)
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
# Generate a basic config file
|
21
|
+
def self.generate(type, name)
|
22
|
+
|
23
|
+
config = {
|
24
|
+
type: type,
|
25
|
+
name: name,
|
26
|
+
}
|
27
|
+
|
28
|
+
return config
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# Update config file with new data
|
34
|
+
def self.save(config)
|
35
|
+
File.write( Kapten::Config::CONFIG_FILE, config.to_json )
|
36
|
+
return true
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'docker'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
module Kapten::DockerApi
|
5
|
+
|
6
|
+
# Check if Docker is installed
|
7
|
+
def self.has_docker?
|
8
|
+
|
9
|
+
begin
|
10
|
+
|
11
|
+
version = Docker.version
|
12
|
+
return true if version
|
13
|
+
|
14
|
+
rescue
|
15
|
+
|
16
|
+
return false
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
return false
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# Get Docker container by Kapten name
|
26
|
+
def self.get_container(name)
|
27
|
+
|
28
|
+
begin
|
29
|
+
|
30
|
+
container = Docker::Container.get('kapten_' + name)
|
31
|
+
return container
|
32
|
+
|
33
|
+
rescue
|
34
|
+
|
35
|
+
return false
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# Get Docker image by name
|
43
|
+
def self.get_image(image)
|
44
|
+
|
45
|
+
begin
|
46
|
+
|
47
|
+
image = Docker::Image.get( image )
|
48
|
+
return image
|
49
|
+
|
50
|
+
rescue
|
51
|
+
|
52
|
+
return false
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# Start Docker container, attaches STDIN and STDOUT
|
60
|
+
def self.start(name, image)
|
61
|
+
|
62
|
+
container = Kapten::DockerApi::get_container(name)
|
63
|
+
|
64
|
+
if not container
|
65
|
+
|
66
|
+
# Pull image if not installed
|
67
|
+
docker_image = Kapten::DockerApi::get_image( image )
|
68
|
+
|
69
|
+
unless docker_image
|
70
|
+
|
71
|
+
puts "First time running, installing environment (this might take a few minutes)...".green
|
72
|
+
docker_image = Docker::Image.create( 'fromImage' => image )
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
puts "Creating environment...".green
|
78
|
+
|
79
|
+
container = Docker::Container.create(
|
80
|
+
'Image' => image,
|
81
|
+
'name' => 'kapten_' + name,
|
82
|
+
'Hostname' => name,
|
83
|
+
'Cmd' => ['/bin/bash'],
|
84
|
+
"OpenStdin" => true,
|
85
|
+
"StdinOnce" => true,
|
86
|
+
"Tty" => true,
|
87
|
+
"WorkingDir" => "/usr/src/" + name,
|
88
|
+
"Hostconfig" => {
|
89
|
+
"Binds" => [Dir.pwd + ":/usr/src/" + name]
|
90
|
+
}
|
91
|
+
)
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
container.start
|
96
|
+
puts "---------------------------------".green
|
97
|
+
puts 'Kapten: You\'re now inside the development environment, go wild! (use "exit" to get out of here)'.green
|
98
|
+
|
99
|
+
|
100
|
+
# Connect to container shell with both STDIN and STDOUT
|
101
|
+
require "io/console"
|
102
|
+
STDIN.raw do |stdin|
|
103
|
+
container.exec(["bash"], stdin: stdin, tty: true) do |chunk|
|
104
|
+
print chunk
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
# Stop running container
|
112
|
+
def self.stop(name)
|
113
|
+
|
114
|
+
container = Kapten::DockerApi::get_container(name)
|
115
|
+
|
116
|
+
if container
|
117
|
+
|
118
|
+
container.stop
|
119
|
+
return true
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
return false
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
# Fully remove container
|
129
|
+
def self.destroy(name)
|
130
|
+
|
131
|
+
container = Kapten::DockerApi::get_container(name)
|
132
|
+
|
133
|
+
if container
|
134
|
+
|
135
|
+
container.stop
|
136
|
+
container.delete(:force => true)
|
137
|
+
return true
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
return false
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
|
3
|
+
module Kapten::Helpers
|
4
|
+
|
5
|
+
TYPES = {
|
6
|
+
'ruby' => 'ruby:latest',
|
7
|
+
'python' => 'python:latest',
|
8
|
+
'node' => 'node:latest',
|
9
|
+
'elixir' => 'elixir:latest',
|
10
|
+
'php' => 'php:latest',
|
11
|
+
'go' => 'golang:latest',
|
12
|
+
'haskell' => 'haskell:latest',
|
13
|
+
'java' => 'openjdk:latest',
|
14
|
+
'perl' => 'perl:latest',
|
15
|
+
}
|
16
|
+
|
17
|
+
|
18
|
+
# Validate that Kapten is initalized and Docker is installed
|
19
|
+
def self.validate_install
|
20
|
+
|
21
|
+
config = Kapten::Config::get
|
22
|
+
|
23
|
+
# Make sure a config exists (Kapten has been initialized)
|
24
|
+
unless config
|
25
|
+
puts 'Kapten not initalized'.red
|
26
|
+
puts 'Run "kapten init" to get started'.red
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
# Make sure Docker is instsalled
|
31
|
+
unless Kapten::DockerApi::has_docker?
|
32
|
+
puts 'Kapten requires Docker'.red
|
33
|
+
puts 'Install and then try running command again: https://www.docker.com'.red
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
|
37
|
+
return config
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# Get Docker image by environment type
|
43
|
+
def self.get_image(type)
|
44
|
+
|
45
|
+
return Kapten::Helpers::TYPES[ type ]
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
# Get all available environment types
|
51
|
+
def self.get_types
|
52
|
+
|
53
|
+
return Kapten::Helpers::TYPES.keys
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
# Remove all traces of Kapten (stop and destory container, delete config file)
|
59
|
+
def self.remove(name)
|
60
|
+
|
61
|
+
Kapten::DockerApi::destroy( name )
|
62
|
+
|
63
|
+
File.delete( Kapten::Config::CONFIG_FILE )
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
data/lib/kapten.rb
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
module Kapten;end
|
5
|
+
|
6
|
+
require 'kapten/helpers'
|
7
|
+
require 'kapten/docker'
|
8
|
+
require 'kapten/config'
|
9
|
+
|
10
|
+
class Kapten::CLI < Thor
|
11
|
+
|
12
|
+
desc 'init [TYPE]', 'Initalize Kapten in the current directory'
|
13
|
+
method_option :name, :aliases => "-n", :desc => "Specify a name. Defaults to the current directory name."
|
14
|
+
long_desc <<-LONGDESC
|
15
|
+
Initalize Kapten in the current directory with a specified environment type
|
16
|
+
|
17
|
+
Available types are: #{Kapten::Helpers::get_types.join(', ')}
|
18
|
+
LONGDESC
|
19
|
+
def init(type)
|
20
|
+
|
21
|
+
if Kapten::Config.get
|
22
|
+
puts 'Environment already initialized'
|
23
|
+
puts 'Use "kapten start" to get developing'
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
types = Kapten::Helpers::get_types
|
28
|
+
|
29
|
+
if not types.include?(type)
|
30
|
+
puts 'No such environment type'.red
|
31
|
+
puts 'Available environment types are: ' + types.join(', ')
|
32
|
+
return
|
33
|
+
end
|
34
|
+
|
35
|
+
name = options[:name] || File.basename(Dir.getwd)
|
36
|
+
|
37
|
+
config = Kapten::Config::generate(type, name)
|
38
|
+
|
39
|
+
Kapten::Config::save(config)
|
40
|
+
|
41
|
+
puts 'Kapten initialized!'.green
|
42
|
+
puts 'Use "kapten start" to load your environment'
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
desc 'start', 'Run and attach environemnt'
|
48
|
+
def start
|
49
|
+
|
50
|
+
config = Kapten::Helpers::validate_install
|
51
|
+
return unless config
|
52
|
+
|
53
|
+
image = Kapten::Helpers::get_image( config['type'] )
|
54
|
+
|
55
|
+
Kapten::DockerApi::start( config['name'], image )
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
desc 'stop', 'Stop environment'
|
61
|
+
def stop
|
62
|
+
|
63
|
+
config = Kapten::Helpers::validate_install
|
64
|
+
return unless config
|
65
|
+
|
66
|
+
puts 'Stopping Kapten environment...'
|
67
|
+
|
68
|
+
results = Kapten::DockerApi::stop( config['name'] )
|
69
|
+
|
70
|
+
puts 'Environment no longer active!'.green
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
desc 'destroy', 'Destroy environment (use "kapten start" to recreate)'
|
76
|
+
def destroy
|
77
|
+
|
78
|
+
config = Kapten::Helpers::validate_install
|
79
|
+
return unless config
|
80
|
+
|
81
|
+
unless Kapten::DockerApi::get_container( config['name'] )
|
82
|
+
|
83
|
+
puts 'No environment to destroy!'
|
84
|
+
puts 'Run "kapten start" to set it up'
|
85
|
+
return
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
puts 'Destroying environment...'
|
91
|
+
|
92
|
+
results = Kapten::DockerApi::destroy( config['name'] )
|
93
|
+
|
94
|
+
puts 'Environment destroyed! Rebuild it by running "kapten start".'.green
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
desc 'info', 'Info about current environment'
|
100
|
+
def info
|
101
|
+
|
102
|
+
config = Kapten::Helpers::validate_install
|
103
|
+
return unless config
|
104
|
+
|
105
|
+
container = Kapten::DockerApi::get_container( config["name"] )
|
106
|
+
|
107
|
+
if not container
|
108
|
+
status = 'Not created'
|
109
|
+
else
|
110
|
+
status = "Not running".yellow
|
111
|
+
status = "Running".green if container.json["State"]["Running"]
|
112
|
+
end
|
113
|
+
|
114
|
+
puts ''
|
115
|
+
puts 'Name: ' + config['name']
|
116
|
+
puts 'Type: ' + config['type']
|
117
|
+
puts 'Status: ' + status
|
118
|
+
puts ''
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
desc 'remove', 'Fully remove Kapten from the current project'
|
124
|
+
def remove
|
125
|
+
|
126
|
+
config = Kapten::Helpers::validate_install
|
127
|
+
return unless config
|
128
|
+
|
129
|
+
Kapten::Helpers::remove( config['name'] )
|
130
|
+
|
131
|
+
puts 'All traces of Kapten have been removed'.green
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kapten
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabian Lindfors
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-04-15 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: ''
|
14
|
+
email: fabian@flapplabs.se
|
15
|
+
executables:
|
16
|
+
- kapten
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/kapten
|
21
|
+
- lib/kapten.rb
|
22
|
+
- lib/kapten/config.rb
|
23
|
+
- lib/kapten/docker.rb
|
24
|
+
- lib/kapten/helpers.rb
|
25
|
+
homepage: https://github.com/fabianlindfors/kapten
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.5.1
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: Simple containerized development environments directly from the command line
|
49
|
+
test_files: []
|