dev_dock 0.2.1 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02b863a98070f42c77a16db7816f22bc1cf8a82849c0d29a9feb1f4e29193583
4
- data.tar.gz: b4814318af70abff9d9c26c3e8ff4851f209e9eec8cbd5ef1b9ad22834bf7f17
3
+ metadata.gz: 3d30cb024cdf2a1574e61edfa80aca988ab250b887bbfccccd054e677c3c8668
4
+ data.tar.gz: efb521c513bfcea2a8114ce3950fefb74485b575f2cb6374a3dcff40eb8bd23f
5
5
  SHA512:
6
- metadata.gz: 219cafb0f2cf6fb87c8f7e5020e04f4c2ca67e678c7adcd6ea494197957a9d979eff3aee059e12afae5d27fb02d41e35926f28ec05bd986631e18bfa29c096fa
7
- data.tar.gz: 240af4386462413ba3a062f9e654d1b18ed5609849d1dbf510553a9ca98b0222104018266a3dfeb4fefe6740be7f462a129037d47d70eb35cd2c740bb31c8cb7
6
+ metadata.gz: 41a0cdd302bf000090e75a0196baa85f7dea6e853c529e9c426441ca311024ee2281312c4b2221790153f408e54337729aa4a9155ce1b21c5bcfe436914212ec
7
+ data.tar.gz: 49e6451b4412a69dd51dee98ddc6d59224d0f8b2d36aba74ad50f45b0ea6f30940134b1045b90c35acc7fc6fb97bc441f1aa45f14eb435161194de5424577cf9
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
  /vendor
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
+ /typescript
14
+ /.test-dir
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dev_dock (0.2.1)
4
+ dev_dock (0.3.0)
5
5
  docker-api (~> 1.34)
6
6
 
7
7
  GEM
@@ -41,4 +41,4 @@ DEPENDENCIES
41
41
  rspec (~> 3.0)
42
42
 
43
43
  BUNDLED WITH
44
- 1.16.2
44
+ 1.16.3
@@ -0,0 +1,112 @@
1
+ require 'fileutils'
2
+
3
+ module DevDock
4
+
5
+ # binds are a type of mount which just map what is on the host into
6
+ # the container
7
+ class DevBind
8
+
9
+ attr_reader :source, :target, :permissions
10
+
11
+ def initialize(internal_volumes, source, target, permissions)
12
+ @internal_volumes = internal_volumes
13
+ @source = source
14
+ @target = target
15
+ @permissions = permissions
16
+ end
17
+
18
+ def exist?
19
+ File.exist?(@source)
20
+ end
21
+
22
+ def create
23
+ if not exist?
24
+ if not File.directory?(@source)
25
+ FileUtils.mkdir_p(File.dirname(@source))
26
+ FileUtils.touch(@source)
27
+ else
28
+ FileUtils.mkdir_p(@source)
29
+ end
30
+ end
31
+ end
32
+
33
+ def host_path
34
+ if @internal_volumes
35
+ internal, host = parent_volume
36
+ # just need to take out the part of the path which is internal, and
37
+ # replace it with the host volume.
38
+ relative = @source.slice(internal.length, @source.length)
39
+ if relative.length == 0
40
+ host
41
+ else
42
+ File.join(host, relative)
43
+ end
44
+ else
45
+ @source
46
+ end
47
+ end
48
+
49
+ def parent_volume
50
+ @internal_volumes.find { |internal, host| @source.index(internal) == 0 }
51
+ end
52
+
53
+ def to_argument
54
+ [host_path, @target, @permissions].compact.join(':')
55
+ end
56
+
57
+ end
58
+
59
+ class DevBinds
60
+
61
+ def initialize(list)
62
+ @internal_volumes = nil
63
+ @container = nil
64
+ @list = list
65
+ end
66
+
67
+ def internal_volumes
68
+ if container? and @internal_volumes.nil?
69
+ container_id = File.read('/proc/1/cgroup')
70
+ .lines
71
+ .find { |cgroup| cgroup.include?('docker') }
72
+ .split('/')
73
+ .last
74
+ .strip
75
+
76
+ container = Docker::Container.get(container_id)
77
+ @internal_volumes = container.json['Volumes']
78
+ end
79
+ @internal_volumes
80
+ end
81
+
82
+ def list
83
+ @list.map do |item|
84
+ source, target, permissions = item.split(':')
85
+ DevBind.new(internal_volumes, source, target, permissions)
86
+ end
87
+ end
88
+
89
+ def push(item)
90
+ @list.push(item)
91
+ end
92
+
93
+ # check if we're currently running inside of a container
94
+ def container?
95
+ if @container.nil?
96
+ if File.exist?('/proc/1/cgroup')
97
+ @container = File.read('/proc/1/cgroup').include?('docker')
98
+ else
99
+ @container = false
100
+ end
101
+ end
102
+ @container
103
+ end
104
+
105
+ def create
106
+ list.each do |bind|
107
+ bind.create
108
+ end
109
+ end
110
+
111
+ end
112
+ end
@@ -1,4 +1,5 @@
1
1
  require 'docker'
2
+ require 'dev_dock/binds'
2
3
  require 'dev_dock/util'
3
4
  require 'dev_dock/image'
4
5
  require 'dev_dock/volumes'
@@ -7,19 +8,35 @@ module DevDock
7
8
 
8
9
  class DevContainer
9
10
 
11
+ attr_reader :image, :volumes, :binds
12
+
10
13
  def initialize(options)
11
14
  @options = options
12
15
  @image = DevDock::DevImage.new(options.image_name)
13
16
  @volumes = DevDock::DevVolumes.new(@image)
17
+ @binds = DevDock::DevBinds.new([
18
+ '/var/run/docker.sock:/var/run/docker.sock'
19
+ ])
14
20
  @name = DevDock::Util::snake_case("dev_dock_#{options.image_name}")
15
- end
16
21
 
17
- def image
18
- @image
22
+ init_binds
19
23
  end
20
24
 
21
- def volumes
22
- @volumes
25
+ def init_binds
26
+
27
+ ['workspaces', '.gitconfig', '.ssh'].each do |directory|
28
+ source = File.join(ENV['HOME'], directory)
29
+ target = File.join("/home", @image.user, directory)
30
+ @binds.push("#{source}:#{target}")
31
+ end
32
+
33
+ if x11?
34
+ @binds.push('/tmp/.X11-unix:/tmp/.X11-unix:ro')
35
+ end
36
+
37
+ if linux?
38
+ @binds.push( '/etc/localhost:/etc/localhost:ro')
39
+ end
23
40
  end
24
41
 
25
42
  def docker_group
@@ -49,11 +66,17 @@ module DevDock
49
66
  Docker::Container.get(@name).kill
50
67
  end
51
68
 
69
+ def x11?
70
+ File.exists?('/tmp/.X11-unix')
71
+ end
72
+
73
+ def linux?
74
+ RUBY_PLATFORM.start_with?("x86_64-linux")
75
+ end
76
+
52
77
  def enable_x11(arguments)
53
- if File.exist? '/tmp/.X11-unix'
78
+ if x11?
54
79
  Log::debug('X11 socket file found')
55
- arguments.push '-v'
56
- arguments.push '/tmp/.X11-unix:/tmp/.X11-unix:ro'
57
80
  arguments.push '-e'
58
81
  arguments.push 'DISPLAY'
59
82
  else
@@ -75,16 +98,11 @@ module DevDock
75
98
  'ctrl-q,ctrl-q',
76
99
  '-e', 'GH_USER',
77
100
  '-e', 'GH_PASS',
78
- '-v', '/run/docker.sock:/var/run/docker.sock'
101
+ '-e', "DEV_DOCK_HOST_HOME=#{@options.host_home}"
79
102
  ]
80
103
 
81
- ['workspaces', '.gitconfig', '.ssh'].each do |directory|
82
- arguments.push '-v', "#{ENV['HOME']}/#{directory}:/home/#{@image.user}/#{directory}"
83
- end
84
-
85
- if RUBY_PLATFORM.start_with?("x86_64-linux")
104
+ if linux?
86
105
  enable_x11(arguments)
87
- arguments.push '-v', '/etc/localhost:/etc/localhost:ro'
88
106
  end
89
107
 
90
108
  @volumes.list.each do |volume|
@@ -95,6 +113,10 @@ module DevDock
95
113
  arguments.push '-v', volume
96
114
  end
97
115
 
116
+ @binds.list.each do |bind|
117
+ arguments.push '-v', bind.to_argument
118
+ end
119
+
98
120
  @options.environment.each do |environment|
99
121
  arguments.push '-e', environment
100
122
  end
@@ -7,12 +7,16 @@ module DevDock
7
7
 
8
8
  class Options
9
9
 
10
+ attr_reader :run_command, :subcommand, :error, :volumes, :image_name, :environment,
11
+ :host_home
12
+
10
13
  def initialize(argv)
11
14
  @volumes = []
12
15
  @environment = []
13
16
  @subcommand = nil
14
17
  @error = nil
15
18
  @image_name = nil
19
+ @host_home = nil
16
20
  @argv = argv
17
21
  @run_command = ['tmux', 'new']
18
22
  end
@@ -28,6 +32,11 @@ module DevDock
28
32
  end
29
33
  end
30
34
 
35
+ parse_env
36
+ end
37
+
38
+ def parse_env
39
+ @host_home = ENV['DEV_DOCK_HOST_HOME'] || ENV['HOME']
31
40
  end
32
41
 
33
42
  def parse_end
@@ -77,8 +86,6 @@ module DevDock
77
86
  end
78
87
  end
79
88
 
80
- attr_reader :run_command, :subcommand, :error, :volumes, :image_name, :environment
81
-
82
89
  def inspect
83
90
  "Subcommand: #{@subcommand}, Image: #{@image_name}, Volumes: #{@volumes}, Environment: #{@environment}, Run Command: #{@run_command}"
84
91
  end
@@ -1,3 +1,3 @@
1
1
  module DevDock
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -26,7 +26,7 @@ module DevDock
26
26
  def exist?
27
27
  volumes = Docker::Util.parse_json(Docker.connection.get('/volumes'))["Volumes"]
28
28
  Log::debug("Volumes in docker: #{volumes}")
29
- volumes.any? { |volume| volume['Name'] == @name }
29
+ not volumes.nil? and volumes.any? { |volume| volume['Name'] == @name }
30
30
  end
31
31
 
32
32
  # creates the volume if it does not exist
data/lib/dev_dock.rb CHANGED
@@ -10,7 +10,9 @@ module DevDock
10
10
  Log::info('image does not exist, pulling')
11
11
  container.image.pull
12
12
  end
13
+
13
14
  container.volumes.create
15
+ container.binds.create
14
16
 
15
17
  container.run
16
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dev_dock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AGhost-7
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-23 00:00:00.000000000 Z
11
+ date: 2018-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,6 +90,7 @@ files:
90
90
  - dev_dock.gemspec
91
91
  - help.txt
92
92
  - lib/dev_dock.rb
93
+ - lib/dev_dock/binds.rb
93
94
  - lib/dev_dock/container.rb
94
95
  - lib/dev_dock/image.rb
95
96
  - lib/dev_dock/log.rb