docker-spoon 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8560cffb7fd59a8f21670b4e79b29d437b983ec2
4
- data.tar.gz: afd021a9f0b9f3f636afa3300df0fd7f22c0ff20
3
+ metadata.gz: 44d1699d5dfe6932ecb60d0c9ab0da39f7d8aa9a
4
+ data.tar.gz: a8552620c5ee5b7ad52d08231f42ef7ad74d337f
5
5
  SHA512:
6
- metadata.gz: 429d54094e6d70341b226ec3a89696fc3ef6bae4860143612946b3fc27315025e465f06c9d5c4c0db1a0e0b8b7eb256e9d514d4eba088b5e3b3a11df87585355
7
- data.tar.gz: 8143c4d158264afa614b17b820cd0363e9483f43ea6a366b0ecadaa9da996063af07b5c68bdb6c4adbabc7e6940dfb164b2f90269e2c4d21aea0b1e3954a449d
6
+ metadata.gz: 2849495539fe5b88f718b2125d23251006142355bda39980d5c0eaa3d4065072ca6f50bdbc6a9653fc59b9dd9485fc2c76b287d4048fbb2b9a1de9501b0dd8c3
7
+ data.tar.gz: 00fea86de864e662b76ca61791e4a24cf7a6f62c39316fdd0f8219c7071cd0ddddba277f0091e581117d21e6ac23e7683eb12adae643fba6cf3060f1aae763e2
data/.gitignore CHANGED
@@ -3,4 +3,5 @@ results.html
3
3
  pkg
4
4
  html
5
5
  *.gem
6
- .spoonrc #used for testing
6
+ .spoonrc
7
+ spoonrc
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- docker-spoon (0.6.0)
5
- docker-api (~> 1.11)
4
+ docker-spoon (0.8.0)
5
+ docker-api (~> 1.13)
6
6
  methadone (~> 1.4.0)
7
7
  rainbow (~> 2.0)
8
8
 
@@ -15,7 +15,7 @@ GEM
15
15
  cucumber (>= 1.1.1)
16
16
  rspec-expectations (>= 2.7.0)
17
17
  builder (3.2.2)
18
- childprocess (0.5.3)
18
+ childprocess (0.5.5)
19
19
  ffi (~> 1.0, >= 1.0.11)
20
20
  cucumber (1.3.17)
21
21
  builder (>= 2.1.2)
@@ -24,12 +24,12 @@ GEM
24
24
  multi_json (>= 1.7.5, < 2.0)
25
25
  multi_test (>= 0.1.1)
26
26
  diff-lcs (1.2.5)
27
- docker-api (1.13.3)
27
+ docker-api (1.13.6)
28
28
  archive-tar-minitar
29
29
  excon (>= 0.38.0)
30
30
  json
31
- excon (0.39.6)
32
- ffi (1.9.5)
31
+ excon (0.40.0)
32
+ ffi (1.9.6)
33
33
  gherkin (2.12.2)
34
34
  multi_json (~> 1.3)
35
35
  json (1.8.1)
@@ -44,7 +44,7 @@ GEM
44
44
  rspec-expectations (3.1.2)
45
45
  diff-lcs (>= 1.2.0, < 2.0)
46
46
  rspec-support (~> 3.1.0)
47
- rspec-support (3.1.1)
47
+ rspec-support (3.1.2)
48
48
 
49
49
  PLATFORMS
50
50
  ruby
data/README.md CHANGED
@@ -95,6 +95,11 @@ in.
95
95
  - `--image`, The image name to use when starting a spoon container.
96
96
  - `--prefix`, The prefix to use for creating, listing & destroying
97
97
  containers.
98
+ - `--portforwards`, This is a space separated list of ports to forward
99
+ over ssh. The format is either `sourceport:destport` or just `sourceport`
100
+ in which case the same port will be used for source & destination.
101
+ Multiple port forwards may be separated by spaces, for exampe
102
+ `--portforwards '8080 8081:9090'`
98
103
 
99
104
  ### List
100
105
 
@@ -120,10 +125,16 @@ The `--destroy NAME` option will destroy the specified spoon container.
120
125
 
121
126
  ```shell
122
127
  $ spoon -d fortesting
128
+ Are you sure you want to destroy spoon-fortesting? (y/n) y
123
129
  Destroying spoon-fortesting
124
130
  Done!
125
131
  ```
126
132
 
133
+ To skip any confirmations:
134
+
135
+ * add `-f` or `--force` to the command-line
136
+ * add `options[:force] = true` to your `.spoonrc`.
137
+
127
138
  ### Network
128
139
 
129
140
  The `--network NAME` option will show the forwarded ports for a spoon
@@ -196,6 +207,19 @@ the .ssh directory in the example above.
196
207
  Example:
197
208
  ```
198
209
  options[:add_authorized_keys] = "id_rsa.pub"
210
+ ```
211
+
212
+ `run_on_create` - This is a list of commands to run on a spoon container
213
+ once it has been started. This allows you to quickly and automatically
214
+ modify a spoon environment upon creation to meet any needs you have
215
+ which aren't baked into the Docker image. This is a config-only
216
+ option, there is no command line for this. Commands are run one at a
217
+ time over ssh - enabling :add_authorized_keys makes this option more
218
+ tolerable.
219
+
220
+ Example:
221
+ ```
222
+ options[:run_on_create] = [ "sudo apt-get -y install emacs" ]
199
223
  ```
200
224
 
201
225
  #### Container expectations
data/docker/Dockerfile CHANGED
@@ -3,28 +3,31 @@ FROM ubuntu:14.04
3
3
  RUN locale-gen en_US.UTF-8
4
4
  RUN apt-get update
5
5
  RUN apt-get install -y python-software-properties
6
- RUN apt-get install -y software-properties-common
7
- RUN apt-get install -y python-setuptools
6
+ RUN apt-get install -y software-properties-common
7
+ RUN apt-get install -y python-setuptools
8
8
  RUN add-apt-repository ppa:webupd8team/java
9
9
  RUN apt-get update
10
- RUN apt-get install -y zip
10
+ RUN apt-get install -y zip
11
11
  RUN apt-get install -y openssl
12
- RUN apt-get install -y git
13
- RUN apt-get install -y emacs24
14
- RUN apt-get install -y tmux
15
- RUN apt-get install -y ack-grep
16
- RUN apt-get install -y python
17
- RUN apt-get install -y wget
18
- RUN apt-get install -y xsel
19
- RUN apt-get install -y python-pip
20
- RUN apt-get install -y zsh
21
- RUN apt-get install -y curl
22
- RUN apt-get install -y build-essential
23
- RUN apt-get install -y runit
24
- RUN apt-get install -y openssh-server
25
- RUN apt-get install -y ruby
12
+ RUN apt-get install -y git
13
+ RUN apt-get install -y emacs24
14
+ RUN apt-get install -y tmux
15
+ RUN apt-get install -y ack-grep
16
+ RUN apt-get install -y python
17
+ RUN apt-get install -y wget
18
+ RUN apt-get install -y xsel
19
+ RUN apt-get install -y python-pip
20
+ RUN apt-get install -y zsh
21
+ RUN apt-get install -y curl
22
+ RUN apt-get install -y build-essential
23
+ RUN apt-get install -y runit
24
+ RUN apt-get install -y openssh-server
25
+ RUN apt-get install -y ruby
26
26
  RUN apt-get install -y tree
27
27
  RUN apt-get install -y vim
28
+ RUN apt-get install -y libevent-dev
29
+ RUN apt-get install -y ncurses-dev
30
+ RUN apt-get install -y rake
28
31
 
29
32
  RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections
30
33
  RUN echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections
@@ -34,20 +37,38 @@ RUN apt-get -y install oracle-java7-installer
34
37
  RUN easy_install httpie
35
38
  RUN pip install https://github.com/Lokaltog/powerline/tarball/develop
36
39
 
37
- RUN mkdir -p /etc/service
38
- ADD resources /etc/service/ssh
39
- ADD runit /etc/runit
40
-
41
- RUN mkdir -p /var/run/sshd
40
+ # Tmux
41
+ RUN wget http://downloads.sourceforge.net/tmux/tmux-1.9a.tar.gz
42
+ RUN tar -zxf tmux-1.9a.tar.gz
43
+ RUN cd tmux-1.9a && ./configure && make install
44
+ RUN rm -r /tmux-1.9a*
45
+ RUN pip install --upgrade --user git+git://github.com/Lokaltog/powerline
42
46
 
43
47
  RUN useradd -s /bin/zsh -m -d /home/pairing -g root pairing
44
48
  RUN echo "pairing:pairing" | chpasswd
45
49
  RUN echo "pairing ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
46
50
 
47
- ADD resources/zshrc.default /home/pairing/.zshrc
51
+ USER pairing
52
+ ENV HOME /home/pairing
53
+ RUN git clone https://github.com/robbyrussell/oh-my-zsh.git /home/pairing/.oh-my-zsh
54
+ RUN chown -R pairing /home/pairing/.oh-my-zsh
48
55
 
56
+ RUN git clone https://github.com/adnichols/tmux-and-vim.git /home/pairing/.janus
57
+ RUN bash -l -c /home/pairing/.janus/setup/setup.sh
58
+ # Fixup powerline for this setup
59
+ RUN sed -i 's%/usr/local/lib/python2\.7/site-packages%/usr/local/lib/python2.7/dist-packages%' ~/.tmux.conf
60
+ ADD resources/zshrc.default /home/pairing/.zshrc
49
61
  RUN mkdir /home/pairing/projects
50
62
 
63
+ USER root
64
+
65
+ # Runit setup
66
+ RUN mkdir -p /etc/service
67
+ ADD runit-ssh /etc/service/ssh
68
+ ADD runit /etc/runit
69
+
70
+ RUN mkdir -p /var/run/sshd
71
+
51
72
  EXPOSE 22
52
73
 
53
- ENTRYPOINT "/usr/sbin/runit"
74
+ CMD /usr/sbin/sshd -D -o UsePAM=no
@@ -0,0 +1,99 @@
1
+ # Last modified: 2009-11-12T05:59:41+0800
2
+ # Change prefix key to Ctrl+a
3
+ unbind C-b
4
+ set -g prefix `
5
+ bind-key ` send-prefix
6
+ bind-key -n F11 set -g prefix C-o
7
+ bind-key -n F12 set -g prefix `
8
+
9
+ # Last active window
10
+ unbind l
11
+ bind C-a last-window
12
+ bind C-p previous-window
13
+ bind C-n next-window
14
+
15
+ set -g mode-mouse on
16
+ set -g mode-keys vi
17
+ bind-key -t vi-copy v begin-selection
18
+ bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
19
+ unbind -t vi-copy Enter
20
+ bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
21
+
22
+ set -g mouse-select-window on
23
+ set -g mouse-select-pane on
24
+ set -g mouse-resize-pane on
25
+ set -g xterm-keys on
26
+ set-window-option -g xterm-keys on
27
+ set-option -g mouse-utf8 on
28
+ set-option -g default-terminal screen-256color
29
+
30
+ # More straight forward key bindings for splitting
31
+ bind-key | split-window -h
32
+ bind-key - split-window -v
33
+
34
+ # Smart pane switching with awareness of vim splits
35
+ bind -n C-h run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim$' && tmux send-keys C-h) || tmux select-pane -L"
36
+ bind -n C-j run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim$' && tmux send-keys C-j) || tmux select-pane -D"
37
+ bind -n C-k run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim$' && tmux send-keys C-k) || tmux select-pane -U"
38
+ bind -n C-l run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim$' && tmux send-keys C-l) || tmux select-pane -R"
39
+ bind -n C-\ run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim$' && tmux send-keys 'C-\\') || tmux select-pane -l"
40
+
41
+ bind C-l send-keys 'C-l'
42
+ bind-key C-o rotate-window
43
+
44
+ set-window-option -g other-pane-height 25
45
+ set-window-option -g other-pane-width 80
46
+
47
+ bind-key C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
48
+ bind-key C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"
49
+
50
+ set-option -g display-panes-time 1500
51
+ #set-option -g default-command "reattach-to-user-namespace -l zsh"
52
+ set-option -g default-command "/bin/bash -c 'which reattach-to-user-namespace >/dev/null && exec reattach-to-user-namespace $SHELL -l || exec $SHELL -l'"
53
+
54
+ set-option -g lock-server on
55
+ set-option -g lock-command 'vlock'
56
+ set-option -g lock-after-time 1800
57
+ bind-key C-x lock-server
58
+
59
+ # History
60
+ set -g history-limit 100000
61
+
62
+ # Terminal emulator window title
63
+ set -g set-titles on
64
+ set -g set-titles-string '#S:#I.#P #W'
65
+
66
+ # Status Bar 1.8 format
67
+ # set-option -g status-bg black
68
+ # set-option -g status-fg cyan
69
+
70
+ # Status Bar 1.9 format
71
+ set-option -g status-style "bg=black"
72
+ set-option -g status-style "fg=cyan"
73
+
74
+ # Notifying if other windows has activities
75
+ set -g monitor-activity off
76
+ set -g visual-activity on
77
+
78
+ # Highlighting the active window in status bar (1.8)
79
+ # setw -g window-status-current-bg blue
80
+ # setw -g window-status-current-fg white
81
+
82
+ # Highlighting the active window in status bar (1.9
83
+ setw -g window-status-current-style "bg=blue"
84
+ setw -g window-status-current-style "fg=white"
85
+
86
+ # Highlight active window on screen
87
+ set-option -g pane-active-border-fg colour32 # light blue
88
+
89
+ # Clock
90
+ setw -g clock-mode-colour green
91
+ setw -g clock-mode-style 24
92
+ setw -g aggressive-resize on
93
+ set -g base-index 1
94
+ bind-key S command-prompt -p ssh: "new-window -n %1 'ssh %1'"
95
+ set -g update-environment -r
96
+ set-environment -gu RBENV_VERSION
97
+
98
+ # Powerline
99
+ source /usr/local/lib/python2.7/site-packages/powerline/bindings/tmux/powerline.conf
@@ -5,7 +5,7 @@ ZSH=$HOME/.oh-my-zsh
5
5
  # Look in ~/.oh-my-zsh/themes/
6
6
  # Optionally, if you set this to "random", it'll load a random theme each
7
7
  # time that oh-my-zsh is loaded.
8
- ZSH_THEME="git-taculous"
8
+ ZSH_THEME="robbyrussell"
9
9
 
10
10
  # Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
11
11
  # Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ exec svlogd -tt ./main
File without changes
data/docker-spoon.gemspec CHANGED
@@ -24,6 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency('aruba')
25
25
  spec.add_development_dependency('rake', '~> 0.9.2')
26
26
  spec.add_dependency('methadone', '~> 1.4.0')
27
- spec.add_dependency('docker-api', '~> 1.11')
27
+ spec.add_dependency('docker-api', '~> 1.13')
28
28
  spec.add_dependency('rainbow', '~> 2.0')
29
29
  end
data/lib/spoon/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Spoon
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
data/lib/spoon.rb CHANGED
@@ -12,11 +12,6 @@ module Spoon
12
12
 
13
13
  main do |instance|
14
14
 
15
- # Read config file & set options
16
- if File.exists?(options[:config])
17
- eval(File.open(options[:config]).read)
18
- end
19
-
20
15
  D options.inspect
21
16
  if options[:list]
22
17
  instance_list
@@ -45,29 +40,49 @@ module Spoon
45
40
  on("-n", "--network NAME", "Display exposed ports using name passed to NAME")
46
41
 
47
42
  # Configurables
48
- options[:builddir] = '.'
43
+ options[:config] ||= "#{ENV['HOME']}/.spoonrc"
44
+ on("-c FILE", "--config", "Config file to use for spoon options")
45
+
46
+ # Read config file & set options
47
+ if File.exists?(options[:config])
48
+ eval(File.open(options[:config]).read)
49
+ end
50
+
51
+ options[:builddir] ||= '.'
49
52
  on("--builddir DIR", "Directory containing Dockerfile")
50
53
  on("--pre-build-commands", "List of commands to run locally before building image")
51
54
  # These are config only options
52
- options[:copy_on_create] = []
53
- options[:add_authorized_keys] = false
54
- options[:url] = Docker.url
55
+ options[:copy_on_create] ||= []
56
+ options[:run_on_create] ||= []
57
+ options[:add_authorized_keys] ||= false
58
+ options[:url] ||= Docker.url
55
59
  on("-u", "--url URL", "Docker url to connect to")
56
60
  on("-L", "--list-images", "List available spoon images")
57
- options[:image] = "spoon-pairing"
61
+ options[:image] ||= "spoon-pairing"
58
62
  on("-i", "--image NAME", "Use image for spoon instance")
59
- options[:prefix] = 'spoon-'
63
+ options[:prefix] ||= 'spoon-'
60
64
  on("-p", "--prefix PREFIX", "Prefix for container names")
61
- options[:command] = ''
62
- options[:config] = "#{ENV['HOME']}/.spoonrc"
63
- on("-c FILE", "--config", "Config file to use for spoon options")
65
+ options[:command] ||= ''
66
+ on("-f", "--force", "Skip any confirmations")
64
67
  on("--debug", "Enable debug")
68
+ on("--debugssh", "Enable SSH debugging")
69
+ on("-P PORT", "--portforwards", "Forward PORT over ssh (must be > 1023)")
65
70
 
66
71
 
67
72
  arg(:instance, :optional, "Spoon instance to connect to")
68
73
 
69
74
  use_log_level_option
70
75
 
76
+ def self.confirm_delete?(name)
77
+ if options[:force]
78
+ return true
79
+ else
80
+ print "Are you sure you want to delete #{name}? (y/n) "
81
+ answer = $stdin.gets.chomp.downcase
82
+ return answer == "y"
83
+ end
84
+ end
85
+
71
86
  def self.apply_prefix(name)
72
87
  "#{options[:prefix]}#{name}"
73
88
  end
@@ -129,6 +144,7 @@ module Spoon
129
144
  instance_create(name)
130
145
  instance_copy_authorized_keys(name, options[:add_authorized_keys])
131
146
  instance_copy_files(name)
147
+ instance_run_actions(name)
132
148
  end
133
149
 
134
150
  container = get_container(name)
@@ -143,8 +159,11 @@ module Spoon
143
159
  def self.instance_list
144
160
  docker_url
145
161
  puts "List of available spoon containers:"
146
- container_list = get_all_containers.select { |c| c.info["Names"].first.to_s.start_with? "/#{options[:prefix]}" }
147
- .sort { |c1, c2| c1.info["Names"].first.to_s <=> c2.info["Names"].first.to_s }
162
+ container_list = get_spoon_containers
163
+ if container_list.empty?
164
+ puts "No spoon containers running at #{options[:url]}"
165
+ exit
166
+ end
148
167
  max_width_container_name = remove_prefix(container_list.max_by {|c| c.info["Names"].first.to_s.length }.info["Names"].first.to_s)
149
168
  max_name_width = max_width_container_name.length
150
169
  container_list.each do |container|
@@ -200,21 +219,25 @@ module Spoon
200
219
  container = get_container(name)
201
220
 
202
221
  if container
203
- puts "Destroying #{name}"
204
- begin
205
- container.kill
206
- rescue
207
- puts "Failed to kill container #{container.id}"
208
- end
222
+ if confirm_delete?(name)
223
+ puts "Destroying #{name}"
224
+ begin
225
+ container.kill
226
+ rescue
227
+ puts "Failed to kill container #{container.id}"
228
+ end
209
229
 
210
- container.wait(10)
230
+ container.wait(10)
211
231
 
212
- begin
213
- container.delete(:force => true)
214
- rescue
215
- puts "Failed to remove container #{container.id}"
232
+ begin
233
+ container.delete(:force => true)
234
+ rescue
235
+ puts "Failed to remove container #{container.id}"
236
+ end
237
+ puts "Done!"
238
+ else
239
+ puts "Delete aborted.. #{name} lives to pair another day."
216
240
  end
217
- puts "Done!"
218
241
  else
219
242
  puts "No container named: #{name}"
220
243
  end
@@ -224,37 +247,55 @@ module Spoon
224
247
  get_container(name)
225
248
  end
226
249
 
227
- def self.instance_ssh(name, command='')
250
+ def self.get_port_forwards(forwards = "")
251
+ if options[:portforwards]
252
+ options[:portforwards].split.each do |port|
253
+ (lport,rport) = port.split(':')
254
+ forwards << "-L #{lport}:127.0.0.1:#{rport || lport} "
255
+ end
256
+ end
257
+ return forwards
258
+ end
259
+
260
+ def self.instance_ssh(name, command='', exec=true)
228
261
  container = get_container(name)
262
+ forwards = get_port_forwards
263
+ D "Got forwards: #{forwards}"
229
264
  host = URI.parse(options[:url]).host
230
265
  if container
231
266
  ssh_command = "\"#{command}\"" if not command.empty?
232
267
  ssh_port = get_port('22', container)
233
268
  puts "Waiting for #{name}:#{ssh_port}..." until host_available?(host, ssh_port)
234
- exec("ssh -t -o StrictHostKeyChecking=no -p #{ssh_port} pairing@#{host} #{ssh_command}")
269
+ ssh_options = "-t -o StrictHostKeyChecking=no -p #{ssh_port} #{forwards} "
270
+ ssh_options << "-v " if options[:debugssh]
271
+ ssh_cmd = "ssh #{ssh_options} pairing@#{host} #{ssh_command}"
272
+ D "SSH CMD: #{ssh_cmd}"
273
+ if exec
274
+ exec(ssh_cmd)
275
+ else
276
+ system(ssh_cmd)
277
+ end
235
278
  else
236
279
  puts "No container named: #{container.inspect}"
237
280
  end
238
281
  end
239
282
 
240
283
  def self.instance_copy_authorized_keys(name, keyfile)
284
+ D "Setting up authorized_keys file"
285
+ # We sleep this once to cope w/ slow starting ssh daemon on create
286
+ sleep 1
241
287
  if keyfile
242
- container = get_container(name)
243
- host = URI.parse(options[:url]).host
244
- key = File.read("#{ENV['HOME']}/.ssh/#{keyfile}")
245
- if container
246
- ssh_port = get_port('22', container)
247
- puts "Waiting for #{name}:#{ssh_port}..." until host_available?(host, ssh_port)
248
- system("ssh -t -o StrictHostKeyChecking=no -p #{ssh_port} pairing@#{host} \"mkdir -p .ssh && chmod 700 .ssh && echo '#{key}' >> ~/.ssh/authorized_keys\"")
249
- else
250
- puts "No container named: #{container.inspect}"
251
- end
288
+ full_keyfile = "#{ENV['HOME']}/.ssh/#{keyfile}"
289
+ key = File.read(full_keyfile).chop
290
+ D "Read keyfile `#{full_keyfile}` with contents:\n#{key}"
291
+ cmd = "mkdir -p .ssh ; chmod 700 .ssh ; echo '#{key}' >> .ssh/authorized_keys"
292
+ instance_ssh(name, cmd, false)
252
293
  end
253
294
  end
254
295
 
255
296
  def self.instance_copy_files(name)
256
297
  options[:copy_on_create].each do |file|
257
- puts "Copying file #{file}"
298
+ D "Copying file #{file}"
258
299
  container = get_container(name)
259
300
  host = URI.parse(options[:url]).host
260
301
  if container
@@ -267,10 +308,26 @@ module Spoon
267
308
  end
268
309
  end
269
310
 
311
+ def self.instance_run_actions(name)
312
+ options[:run_on_create].each do |action|
313
+ puts "Running command: #{action}"
314
+ instance_ssh(name, action, false)
315
+ end
316
+ end
317
+
270
318
  def self.get_all_containers
271
319
  Docker::Container.all(:all => true)
272
320
  end
273
321
 
322
+ def self.get_spoon_containers
323
+ container_list = get_all_containers.select { |c| c.info["Names"].first.to_s.start_with? "/#{options[:prefix]}" }
324
+ unless container_list.empty?
325
+ return container_list.sort { |c1, c2| c1.info["Names"].first.to_s <=> c2.info["Names"].first.to_s }
326
+ else
327
+ return container_list
328
+ end
329
+ end
330
+
274
331
  def self.get_running_containers
275
332
  Docker::Container.all
276
333
  end
@@ -332,5 +389,3 @@ module Spoon
332
389
 
333
390
  go!
334
391
  end
335
-
336
- # option :debug, :type => :boolean, :default => true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-spoon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Nichols
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-30 00:00:00.000000000 Z
11
+ date: 2014-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - ~>
102
102
  - !ruby/object:Gem::Version
103
- version: '1.11'
103
+ version: '1.13'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ~>
109
109
  - !ruby/object:Gem::Version
110
- version: '1.11'
110
+ version: '1.13'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rainbow
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -140,8 +140,10 @@ files:
140
140
  - docker-spoon.gemspec
141
141
  - docker/Dockerfile
142
142
  - docker/resources/log/run
143
- - docker/resources/run
143
+ - docker/resources/tmux.conf
144
144
  - docker/resources/zshrc.default
145
+ - docker/runit-ssh/log/run
146
+ - docker/runit-ssh/run
145
147
  - docker/runit/1
146
148
  - docker/runit/2
147
149
  - docker/runit/3