docker-spoon 0.6.0 → 0.7.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 +4 -4
- data/.gitignore +2 -1
- data/Gemfile.lock +10 -10
- data/README.md +39 -11
- data/lib/spoon.rb +43 -10
- data/lib/spoon/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8560cffb7fd59a8f21670b4e79b29d437b983ec2
|
4
|
+
data.tar.gz: afd021a9f0b9f3f636afa3300df0fd7f22c0ff20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 429d54094e6d70341b226ec3a89696fc3ef6bae4860143612946b3fc27315025e465f06c9d5c4c0db1a0e0b8b7eb256e9d514d4eba088b5e3b3a11df87585355
|
7
|
+
data.tar.gz: 8143c4d158264afa614b17b820cd0363e9483f43ea6a366b0ecadaa9da996063af07b5c68bdb6c4adbabc7e6940dfb164b2f90269e2c4d21aea0b1e3954a449d
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
docker-spoon (0.
|
4
|
+
docker-spoon (0.6.0)
|
5
5
|
docker-api (~> 1.11)
|
6
6
|
methadone (~> 1.4.0)
|
7
7
|
rainbow (~> 2.0)
|
@@ -10,26 +10,26 @@ GEM
|
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
12
|
archive-tar-minitar (0.5.2)
|
13
|
-
aruba (0.6.
|
13
|
+
aruba (0.6.1)
|
14
14
|
childprocess (>= 0.3.6)
|
15
15
|
cucumber (>= 1.1.1)
|
16
16
|
rspec-expectations (>= 2.7.0)
|
17
17
|
builder (3.2.2)
|
18
18
|
childprocess (0.5.3)
|
19
19
|
ffi (~> 1.0, >= 1.0.11)
|
20
|
-
cucumber (1.3.
|
20
|
+
cucumber (1.3.17)
|
21
21
|
builder (>= 2.1.2)
|
22
22
|
diff-lcs (>= 1.1.3)
|
23
23
|
gherkin (~> 2.12)
|
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.
|
27
|
+
docker-api (1.13.3)
|
28
28
|
archive-tar-minitar
|
29
29
|
excon (>= 0.38.0)
|
30
30
|
json
|
31
|
-
excon (0.
|
32
|
-
ffi (1.9.
|
31
|
+
excon (0.39.6)
|
32
|
+
ffi (1.9.5)
|
33
33
|
gherkin (2.12.2)
|
34
34
|
multi_json (~> 1.3)
|
35
35
|
json (1.8.1)
|
@@ -39,12 +39,12 @@ GEM
|
|
39
39
|
multi_test (0.1.1)
|
40
40
|
rainbow (2.0.0)
|
41
41
|
rake (0.9.6)
|
42
|
-
rdoc (4.1.
|
42
|
+
rdoc (4.1.2)
|
43
43
|
json (~> 1.4)
|
44
|
-
rspec-expectations (3.
|
44
|
+
rspec-expectations (3.1.2)
|
45
45
|
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
-
rspec-support (~> 3.
|
47
|
-
rspec-support (3.
|
46
|
+
rspec-support (~> 3.1.0)
|
47
|
+
rspec-support (3.1.1)
|
48
48
|
|
49
49
|
PLATFORMS
|
50
50
|
ruby
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# docker-spoon
|
2
2
|
|
3
3
|
## Overview
|
4
|
-
Spoon creates on demand pairing environments using Docker.
|
4
|
+
Spoon creates on demand pairing environments using Docker.
|
5
5
|
|
6
6
|
We pair a lot using tmux & emacs / vim and wanted a way to create
|
7
7
|
pairing environments which met a few criteria:
|
@@ -11,7 +11,7 @@ pairing environments which met a few criteria:
|
|
11
11
|
environments and asking who's using what
|
12
12
|
- Are console based to enable low latency remote pairing
|
13
13
|
|
14
|
-
Spoon is intended to make this process as easy as possible.
|
14
|
+
Spoon is intended to make this process as easy as possible.
|
15
15
|
|
16
16
|
#### Why Spoon?
|
17
17
|
[Learn more about spooning](https://www.youtube.com/watch?v=dYBjVTMUQY0)
|
@@ -42,10 +42,10 @@ All of the `options[]` parameters should map directly to the long form
|
|
42
42
|
of options on the command line. They may be defined as either the
|
43
43
|
`:symbol` form or as a string. The limitation is that ruby doesn't
|
44
44
|
permit a dash in symbols, so when an option has a dash in it, it must be
|
45
|
-
specified as a string.
|
45
|
+
specified as a string.
|
46
46
|
|
47
47
|
You may also specify a different config file with the `--config`
|
48
|
-
argument.
|
48
|
+
argument.
|
49
49
|
|
50
50
|
## Usage
|
51
51
|
|
@@ -65,7 +65,7 @@ the spoon container that you specify. If that container doesn't exist,
|
|
65
65
|
spoon will create it for you. Once spoon either creates a container or
|
66
66
|
determines that one already exists it will start an ssh connection to
|
67
67
|
the host. This will shell out to ssh and should honor your ssh
|
68
|
-
configuration locally.
|
68
|
+
configuration locally.
|
69
69
|
|
70
70
|
Example (container doesn't exist):
|
71
71
|
```shell
|
@@ -91,7 +91,7 @@ in.
|
|
91
91
|
- `--url`, The url of the Docker API endpoint. This is in the format
|
92
92
|
supported by the docker -H option. This will also read from the
|
93
93
|
environment variable `DOCKER_HOST` if this argument is not specified
|
94
|
-
and that env var exists.
|
94
|
+
and that env var exists.
|
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.
|
@@ -101,7 +101,7 @@ in.
|
|
101
101
|
The `--list` argument will list any containers on the destination Docker
|
102
102
|
host which have the same prefix as specified by `--prefix` (default
|
103
103
|
'spoon-'). Images are listed without the prefix specified so that you
|
104
|
-
can see only the containers you are interested in.
|
104
|
+
can see only the containers you are interested in.
|
105
105
|
|
106
106
|
```shell
|
107
107
|
$ spoon -l
|
@@ -116,7 +116,7 @@ containers, spoon will re-start them as necessary.
|
|
116
116
|
|
117
117
|
### Destroy
|
118
118
|
|
119
|
-
The `--destroy NAME` option will destroy the specified spoon container.
|
119
|
+
The `--destroy NAME` option will destroy the specified spoon container.
|
120
120
|
|
121
121
|
```shell
|
122
122
|
$ spoon -d fortesting
|
@@ -143,12 +143,12 @@ The `--build` option will build a docker image from the build directory
|
|
143
143
|
specified by `--builddir` (default '.'). This has the same expectations
|
144
144
|
as the [docker
|
145
145
|
build](https://docs.docker.com/reference/commandline/cli/#build)
|
146
|
-
command.
|
146
|
+
command.
|
147
147
|
|
148
148
|
#### Options
|
149
149
|
|
150
150
|
- `--builddir`, This is the directory where the build process will look
|
151
|
-
for a Dockerfile and any content added to the container using `ADD`.
|
151
|
+
for a Dockerfile and any content added to the container using `ADD`.
|
152
152
|
|
153
153
|
- `--pre-build-commands`, This is a list of commands to run before
|
154
154
|
actually kicking off the build process (see below).
|
@@ -161,7 +161,7 @@ copying stuff into the container which you don't want to have committed
|
|
161
161
|
to the repository. An example of this is that in our environment we need
|
162
162
|
chef credentials inside of our container & we use this mechanism to copy
|
163
163
|
those credentials into the builddir at build time without adding them to
|
164
|
-
our repository containing the Dockerfile.
|
164
|
+
our repository containing the Dockerfile.
|
165
165
|
|
166
166
|
Here's an example of how we copy our chef configuration into place:
|
167
167
|
```ruby
|
@@ -170,6 +170,34 @@ options["pre-build-commands"] = [
|
|
170
170
|
]
|
171
171
|
```
|
172
172
|
|
173
|
+
- `copy_on_create`, - This is a config-only value, there is no command
|
174
|
+
line argument for it. The idea is that you can specify a list of files
|
175
|
+
to copy into place on the destination container upon creation. This is
|
176
|
+
useful if you want to copy in place configs that you keep on your
|
177
|
+
workstation but don't want them as part of the image.
|
178
|
+
|
179
|
+
Example:
|
180
|
+
```
|
181
|
+
options[:copy_on_create] = [
|
182
|
+
".gitconfig",
|
183
|
+
".ssh",
|
184
|
+
".ssh/config"
|
185
|
+
]
|
186
|
+
```
|
187
|
+
NOTE: this does not create any required parent directories on the
|
188
|
+
destination system unless they are copied into place, for example like
|
189
|
+
the .ssh directory in the example above.
|
190
|
+
|
191
|
+
- `add_authorized_keys` - This is a config-only value. This allows you
|
192
|
+
to specify an ssh public key that should reside in your own `~/.ssh`
|
193
|
+
directory to be placed in authorized_keys on the destination system
|
194
|
+
upon container creation.
|
195
|
+
|
196
|
+
Example:
|
197
|
+
```
|
198
|
+
options[:add_authorized_keys] = "id_rsa.pub"
|
199
|
+
```
|
200
|
+
|
173
201
|
#### Container expectations
|
174
202
|
|
175
203
|
When building an image for use with docker-spoon you must build an
|
data/lib/spoon.rb
CHANGED
@@ -12,6 +12,11 @@ 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
|
+
|
15
20
|
D options.inspect
|
16
21
|
if options[:list]
|
17
22
|
instance_list
|
@@ -43,6 +48,9 @@ module Spoon
|
|
43
48
|
options[:builddir] = '.'
|
44
49
|
on("--builddir DIR", "Directory containing Dockerfile")
|
45
50
|
on("--pre-build-commands", "List of commands to run locally before building image")
|
51
|
+
# These are config only options
|
52
|
+
options[:copy_on_create] = []
|
53
|
+
options[:add_authorized_keys] = false
|
46
54
|
options[:url] = Docker.url
|
47
55
|
on("-u", "--url URL", "Docker url to connect to")
|
48
56
|
on("-L", "--list-images", "List available spoon images")
|
@@ -52,13 +60,9 @@ module Spoon
|
|
52
60
|
on("-p", "--prefix PREFIX", "Prefix for container names")
|
53
61
|
options[:command] = ''
|
54
62
|
options[:config] = "#{ENV['HOME']}/.spoonrc"
|
55
|
-
on("-c", "--config
|
63
|
+
on("-c FILE", "--config", "Config file to use for spoon options")
|
56
64
|
on("--debug", "Enable debug")
|
57
65
|
|
58
|
-
# Read config file & set options
|
59
|
-
if File.exists?(options[:config])
|
60
|
-
eval(File.open(options[:config]).read)
|
61
|
-
end
|
62
66
|
|
63
67
|
arg(:instance, :optional, "Spoon instance to connect to")
|
64
68
|
|
@@ -123,6 +127,8 @@ module Spoon
|
|
123
127
|
if not instance_exists? name
|
124
128
|
puts "The `#{name}` container doesn't exist, creating..."
|
125
129
|
instance_create(name)
|
130
|
+
instance_copy_authorized_keys(name, options[:add_authorized_keys])
|
131
|
+
instance_copy_files(name)
|
126
132
|
end
|
127
133
|
|
128
134
|
container = get_container(name)
|
@@ -138,7 +144,7 @@ module Spoon
|
|
138
144
|
docker_url
|
139
145
|
puts "List of available spoon containers:"
|
140
146
|
container_list = get_all_containers.select { |c| c.info["Names"].first.to_s.start_with? "/#{options[:prefix]}" }
|
141
|
-
|
147
|
+
.sort { |c1, c2| c1.info["Names"].first.to_s <=> c2.info["Names"].first.to_s }
|
142
148
|
max_width_container_name = remove_prefix(container_list.max_by {|c| c.info["Names"].first.to_s.length }.info["Names"].first.to_s)
|
143
149
|
max_name_width = max_width_container_name.length
|
144
150
|
container_list.each do |container|
|
@@ -231,6 +237,36 @@ module Spoon
|
|
231
237
|
end
|
232
238
|
end
|
233
239
|
|
240
|
+
def self.instance_copy_authorized_keys(name, keyfile)
|
241
|
+
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
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def self.instance_copy_files(name)
|
256
|
+
options[:copy_on_create].each do |file|
|
257
|
+
puts "Copying file #{file}"
|
258
|
+
container = get_container(name)
|
259
|
+
host = URI.parse(options[:url]).host
|
260
|
+
if container
|
261
|
+
ssh_port = get_port('22', container)
|
262
|
+
puts "Waiting for #{name}:#{ssh_port}..." until host_available?(host, ssh_port)
|
263
|
+
system("scp -o StrictHostKeyChecking=no -P #{ssh_port} #{ENV['HOME']}/#{file} pairing@#{host}:#{file}")
|
264
|
+
else
|
265
|
+
puts "No container named: #{container.inspect}"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
234
270
|
def self.get_all_containers
|
235
271
|
Docker::Container.all(:all => true)
|
236
272
|
end
|
@@ -297,7 +333,4 @@ module Spoon
|
|
297
333
|
go!
|
298
334
|
end
|
299
335
|
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
# private
|
336
|
+
# option :debug, :type => :boolean, :default => true
|
data/lib/spoon/version.rb
CHANGED
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.
|
4
|
+
version: 0.7.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-
|
11
|
+
date: 2014-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|