kitchen-docker 2.1.0 → 2.2.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: a2b8e38c60e7c372eb20e133a717c069e2371a4d
4
- data.tar.gz: 59c4cb5cb92f171b8acfe30769150fc4c284c920
3
+ metadata.gz: b939e9c2b0904be1588251727d88e41cdf7860c5
4
+ data.tar.gz: feeb4a93431ac53e63787d78b1430223e5340b30
5
5
  SHA512:
6
- metadata.gz: 7aef3953bac91da662c0ff21309b227e2b404348716b1f21b205de707b2bfb44b2f3daad594d5dbd7d143ade70861d92bb45153d445ed65468d09174da1fbf24
7
- data.tar.gz: 1096f10f52579bfe2d28b42d79b0c7e9775a29a158b3e2d58fb58b5c3b668519b655077666072edf392ec293a4cf5e4f26502d93c17959c3c526506023124eb3
6
+ metadata.gz: ce018dcd2008f84c802cb9050b05c84d239bcc903b53cdcee34791d40f4b4af3c39569df906b42a6b55a935850bd6c9e7562133ea201d6c58e2bcee0ede084b6
7
+ data.tar.gz: e6b5607abd8c8243d80aba28c04303e33d391cf3e09732d036634957cfc139cfa92248f26c158e4a39836ad4747c36fe73a9f124446d6eb205fef9f46c67dba8
@@ -1,3 +1,20 @@
1
+ ## 2.2.0
2
+
3
+ * Use a temporary file for each suite instance Docker container
4
+ Dockerfile, instead of passing their contents via STDIN. This allows for
5
+ the use of commands like ADD and COPY. **Users must now use Docker >= 1.5.0**
6
+
7
+ * Passwordless suite instance Docker container login (SSH), using a
8
+ generated key pair.
9
+
10
+ * Support for sharing a host device with suite instance Docker containers.
11
+
12
+ * README YAML highlighting.
13
+
14
+ ## 2.1.0
15
+
16
+ * Use `NUL` instead of `/dev/null` on Windows for output redirection
17
+
1
18
  ## 2.0.0
2
19
 
3
20
  * Use Docker `top` and `port` instead of `inspect`
@@ -22,9 +39,9 @@
22
39
 
23
40
  * `publish_all` option to publish all ports to the host interface
24
41
 
25
- * `instance_name` option to name the docker container
42
+ * `instance_name` option to name the Docker container
26
43
 
27
- * `links` option to link suite instance docker containers
44
+ * `links` option to link suite instance Docker containers
28
45
 
29
46
  * `socket` option will now default to ENV `DOCKER_HOST` if set
30
47
 
data/README.md CHANGED
@@ -12,7 +12,7 @@ Please read the Test Kitchen [docs][test_kitchen_docs] for more details.
12
12
 
13
13
  Example `.kitchen.local.yml`:
14
14
 
15
- ```
15
+ ```yaml
16
16
  ---
17
17
  driver:
18
18
  name: docker
@@ -36,7 +36,7 @@ platforms.
36
36
 
37
37
  Examples:
38
38
 
39
- ```
39
+ ```yaml
40
40
  ---
41
41
  platforms:
42
42
  - name: ubuntu-12.04
@@ -45,7 +45,7 @@ platforms:
45
45
 
46
46
  This will effectively generate a configuration similar to:
47
47
 
48
- ```
48
+ ```yaml
49
49
  ---
50
50
  platforms:
51
51
  - name: ubuntu-12.04
@@ -68,11 +68,11 @@ The default value is `docker`.
68
68
 
69
69
  Examples:
70
70
 
71
- ```
71
+ ```yaml
72
72
  binary: docker.io
73
73
  ```
74
74
 
75
- ```
75
+ ```yaml
76
76
  binary: /opt/docker
77
77
  ```
78
78
 
@@ -86,17 +86,17 @@ to suite containers.
86
86
 
87
87
  Examples:
88
88
 
89
- ```
89
+ ```yaml
90
90
  socket: unix:///tmp/docker.sock
91
91
  ```
92
92
 
93
- ```
93
+ ```yaml
94
94
  socket: tcp://docker.example.com:4242
95
95
  ```
96
96
 
97
97
  If you use [Boot2Docker](https://github.com/boot2docker/boot2docker), set your `DOCKER_HOST` environment variable properly (e.g. `export DOCKER_HOST=tcp://192.168.59.103:2375`) or you have to use the following:
98
98
 
99
- ```
99
+ ```yaml
100
100
  socket: tcp://192.168.59.103:2375
101
101
  ```
102
102
 
@@ -150,17 +150,17 @@ Custom command(s) to be run when provisioning the base for the suite containers.
150
150
 
151
151
  Examples:
152
152
 
153
- ```
153
+ ```yaml
154
154
  provision_command: curl -L https://www.opscode.com/chef/install.sh | bash
155
155
  ```
156
156
 
157
- ```
157
+ ```yaml
158
158
  provision_command:
159
159
  - apt-get install dnsutils
160
160
  - apt-get install telnet
161
161
  ```
162
162
 
163
- ```
163
+ ```yaml
164
164
  driver_config:
165
165
  provision_command: curl -L https://www.opscode.com/chef/install.sh | bash
166
166
  require_chef_omnibus: false
@@ -192,11 +192,11 @@ The default value is `false`.
192
192
 
193
193
  Sets the command used to run the suite container.
194
194
 
195
- The default value is `/usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes`.
195
+ The default value is `/usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes -o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid`.
196
196
 
197
197
  Examples:
198
198
 
199
- ```
199
+ ```yaml
200
200
  run_command: /sbin/init
201
201
  ```
202
202
 
@@ -216,11 +216,11 @@ Adds a data volume(s) to the suite container.
216
216
 
217
217
  Examples:
218
218
 
219
- ```
219
+ ```yaml
220
220
  volume: /ftp
221
221
  ```
222
222
 
223
- ```
223
+ ```yaml
224
224
  volume:
225
225
  - /ftp
226
226
  - /srv
@@ -232,11 +232,11 @@ Mount volumes managed by other containers.
232
232
 
233
233
  Examples:
234
234
 
235
- ```
235
+ ```yaml
236
236
  volumes_from: repos
237
237
  ```
238
238
 
239
- ```
239
+ ```yaml
240
240
  volumes_from:
241
241
  - repos
242
242
  - logging
@@ -250,11 +250,11 @@ Dockers defaults.
250
250
 
251
251
  Examples:
252
252
 
253
- ```
253
+ ```yaml
254
254
  dns: 8.8.8.8
255
255
  ```
256
256
 
257
- ```
257
+ ```yaml
258
258
  dns:
259
259
  - 8.8.8.8
260
260
  - 8.8.4.4
@@ -265,7 +265,7 @@ Sets an http proxy for the suite container using the `http_proxy` environment va
265
265
 
266
266
  Examples:
267
267
 
268
- ```
268
+ ```yaml
269
269
  http_proxy: http://proxy.host.com:8080
270
270
  ```
271
271
  ### https\_proxy
@@ -274,7 +274,7 @@ Sets an https proxy for the suite container using the `https_proxy` environment
274
274
 
275
275
  Examples:
276
276
 
277
- ```
277
+ ```yaml
278
278
  https_proxy: http://proxy.host.com:8080
279
279
  ```
280
280
  ### forward
@@ -284,11 +284,11 @@ the host (public) port in the mappings, if not, Docker chooses for you.
284
284
 
285
285
  Examples:
286
286
 
287
- ```
287
+ ```yaml
288
288
  forward: 80
289
289
  ```
290
290
 
291
- ```
291
+ ```yaml
292
292
  forward:
293
293
  - 22:2222
294
294
  - 80:8080
@@ -300,7 +300,7 @@ Set the suite container hostname. Otherwise use Dockers default.
300
300
 
301
301
  Examples:
302
302
 
303
- ```
303
+ ```yaml
304
304
  hostname: foobar.local
305
305
  ```
306
306
 
@@ -313,7 +313,7 @@ The default value is `false`.
313
313
 
314
314
  Examples:
315
315
 
316
- ```
316
+ ```yaml
317
317
  privileged: true
318
318
  ```
319
319
 
@@ -323,11 +323,11 @@ Adds a capability to the running container.
323
323
 
324
324
  Examples:
325
325
 
326
- ````
326
+ ```yaml
327
327
  cap_add:
328
328
  - SYS_PTRACE
329
329
 
330
- ````
330
+ ```
331
331
 
332
332
  ### cap\_drop
333
333
 
@@ -335,11 +335,10 @@ Drops a capability from the running container.
335
335
 
336
336
  Examples:
337
337
 
338
- ````
338
+ ```yaml
339
339
  cap_drop:
340
340
  - CHOWN
341
-
342
- ````
341
+ ```
343
342
 
344
343
  ### security\_opt
345
344
 
@@ -349,7 +348,7 @@ profiles to grant access to specific resources.
349
348
 
350
349
  Examples:
351
350
 
352
- ```
351
+ ```yaml
353
352
  security_opt:
354
353
  - apparmor:my_profile
355
354
  ```
@@ -360,7 +359,7 @@ Use a custom Dockerfile, instead of having Kitchen-Docker build one for you.
360
359
 
361
360
  Examples:
362
361
 
363
- ```
362
+ ```yaml
364
363
  dockerfile: test/Dockerfile
365
364
  ```
366
365
 
@@ -370,7 +369,7 @@ Set the name of container to link to other container(s).
370
369
 
371
370
  Examples:
372
371
 
373
- ```
372
+ ```yaml
374
373
  instance_name: web
375
374
  ```
376
375
 
@@ -380,13 +379,11 @@ Set ```instance_name```(and alias) of other container(s) that connect from the s
380
379
 
381
380
  Examples:
382
381
 
383
- ```
382
+ ```yaml
384
383
  links: db:db
385
384
  ```
386
385
 
387
- Examples:
388
-
389
- ```
386
+ ```yaml
390
387
  links:
391
388
  - db:db
392
389
  - kvs:kvs
@@ -401,10 +398,26 @@ The default value is `false`.
401
398
 
402
399
  Examples:
403
400
 
404
- ```
401
+ ```yaml
405
402
  publish_all: true
406
403
  ```
407
404
 
405
+ ### devices
406
+
407
+ Share a host device with the container. Host device must be an absolute path.
408
+
409
+ Examples:
410
+
411
+ ```
412
+ devices: /dev/vboxdrv
413
+ ```
414
+
415
+ ```
416
+ devices:
417
+ - /dev/vboxdrv
418
+ - /dev/vboxnetctl
419
+ ```
420
+
408
421
  ## Development
409
422
 
410
423
  * Source hosted at [GitHub][repo]
@@ -16,7 +16,9 @@
16
16
 
17
17
  require 'kitchen'
18
18
  require 'json'
19
+ require 'securerandom'
19
20
  require 'uri'
21
+ require 'net/ssh'
20
22
  require File.join(File.dirname(__FILE__), 'docker', 'erb')
21
23
 
22
24
  module Kitchen
@@ -47,6 +49,8 @@ module Kitchen
47
49
  default_config :tls_key, nil
48
50
  default_config :publish_all, false
49
51
  default_config :wait_for_sshd, true
52
+ default_config :private_key, File.join(Dir.pwd, '.kitchen', 'docker_id_rsa')
53
+ default_config :public_key, File.join(Dir.pwd, '.kitchen', 'docker_id_rsa.pub')
50
54
 
51
55
  default_config :use_sudo do |driver|
52
56
  !driver.remote_socket?
@@ -91,6 +95,8 @@ module Kitchen
91
95
  end
92
96
 
93
97
  def create(state)
98
+ generate_keys
99
+ state[:ssh_key] = config[:private_key]
94
100
  state[:image_id] = build_image(state) unless state[:image_id]
95
101
  state[:container_id] = run_container(state) unless state[:container_id]
96
102
  state[:hostname] = remote_socket? ? socket_uri.host : 'localhost'
@@ -126,6 +132,22 @@ module Kitchen
126
132
  run_command("#{docker} #{cmd}", options.merge(:quiet => !logger.debug?))
127
133
  end
128
134
 
135
+ def generate_keys
136
+ if !File.exist?(config[:public_key]) || !File.exist?(config[:private_key])
137
+ private_key = OpenSSL::PKey::RSA.new(2048)
138
+ blobbed_key = Base64.encode64(private_key.to_blob).gsub("\n", '')
139
+ public_key = "ssh-rsa #{blobbed_key} kitchen_docker_key"
140
+ File.open(config[:private_key], 'w') do |file|
141
+ file.write(private_key)
142
+ file.chmod(0600)
143
+ end
144
+ File.open(config[:public_key], 'w') do |file|
145
+ file.write(public_key)
146
+ file.chmod(0600)
147
+ end
148
+ end
149
+ end
150
+
129
151
  def build_dockerfile
130
152
  from = "FROM #{config[:image]}"
131
153
  platform = case config[:platform]
@@ -172,8 +194,11 @@ module Kitchen
172
194
  raise ActionFailed,
173
195
  "Unknown platform '#{config[:platform]}'"
174
196
  end
197
+
175
198
  username = config[:username]
176
199
  password = config[:password]
200
+ public_key = IO.read(config[:public_key])
201
+
177
202
  base = <<-eos
178
203
  RUN if ! getent passwd #{username}; then useradd -d /home/#{username} -m -s /bin/bash #{username}; fi
179
204
  RUN echo #{username}:#{password} | chpasswd
@@ -181,6 +206,12 @@ module Kitchen
181
206
  RUN mkdir -p /etc/sudoers.d
182
207
  RUN echo '#{username} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/#{username}
183
208
  RUN chmod 0440 /etc/sudoers.d/#{username}
209
+ RUN [ ! -d /home/#{username}/.ssh ] && mkdir /home/#{username}/.ssh
210
+ RUN chown -R #{username} /home/#{username}/.ssh
211
+ RUN chmod 0700 /home/#{username}/.ssh
212
+ RUN echo '#{public_key}' >> /home/#{username}/.ssh/authorized_keys
213
+ RUN chown #{username} /home/#{username}/.ssh/authorized_keys
214
+ RUN chmod 0600 /home/#{username}/.ssh/authorized_keys
184
215
  eos
185
216
  custom = ''
186
217
  Array(config[:provision_command]).each do |cmd|
@@ -212,7 +243,11 @@ module Kitchen
212
243
  def build_image(state)
213
244
  cmd = "build"
214
245
  cmd << " --no-cache" unless config[:use_cache]
215
- output = docker_command("#{cmd} -", :input => dockerfile)
246
+ output = Tempfile.create('Dockerfile-kitchen-', Dir.pwd) do |file|
247
+ file.write(dockerfile)
248
+ file.close
249
+ docker_command("#{cmd} -f #{file.path} .")
250
+ end
216
251
  parse_image_id(output)
217
252
  end
218
253
 
@@ -233,6 +268,7 @@ module Kitchen
233
268
  Array(config[:volume]).each {|volume| cmd << " -v #{volume}"}
234
269
  Array(config[:volumes_from]).each {|container| cmd << " --volumes-from #{container}"}
235
270
  Array(config[:links]).each {|link| cmd << " --link #{link}"}
271
+ Array(config[:devices]).each {|device| cmd << " --device #{device}"}
236
272
  cmd << " --name #{config[:instance_name]}" if config[:instance_name]
237
273
  cmd << " -P" if config[:publish_all]
238
274
  cmd << " -h #{config[:hostname]}" if config[:hostname]
@@ -19,6 +19,6 @@ module Kitchen
19
19
  module Driver
20
20
 
21
21
  # Version string for Docker Kitchen driver
22
- DOCKER_VERSION = "2.1.0"
22
+ DOCKER_VERSION = "2.2.0"
23
23
  end
24
24
  end
@@ -1,6 +1,4 @@
1
- require 'serverspec'
2
-
3
- set :backend, :exec
1
+ require_relative 'spec_helper'
4
2
 
5
3
  describe command('sudo /sbin/ifconfig eth0 multicast') do
6
4
  its(:exit_status) { should_not eq 0 }
@@ -0,0 +1,3 @@
1
+ require 'serverspec'
2
+
3
+ set :backend, :exec
@@ -1,7 +1,4 @@
1
- require 'serverspec'
2
-
3
- include Serverspec::Helper::Exec
4
- include Serverspec::Helper::DetectOS
1
+ require_relative 'spec_helper'
5
2
 
6
3
  describe file('/etc/passwd') do
7
4
  it { should be_file }
@@ -0,0 +1,4 @@
1
+ require 'serverspec'
2
+
3
+ # Required by serverspec
4
+ set :backend, :exec
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Porter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-25 00:00:00.000000000 Z
11
+ date: 2015-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
@@ -117,7 +117,9 @@ files:
117
117
  - lib/kitchen/driver/docker_version.rb
118
118
  - test/Dockerfile
119
119
  - test/integration/capabilities/serverspec/capabilities_drop_spec.rb
120
+ - test/integration/capabilities/serverspec/spec_helper.rb
120
121
  - test/integration/default/serverspec/default_spec.rb
122
+ - test/integration/default/serverspec/spec_helper.rb
121
123
  homepage: https://github.com/portertech/kitchen-docker
122
124
  licenses:
123
125
  - Apache 2.0
@@ -145,4 +147,6 @@ summary: A Docker Driver for Test Kitchen
145
147
  test_files:
146
148
  - test/Dockerfile
147
149
  - test/integration/capabilities/serverspec/capabilities_drop_spec.rb
150
+ - test/integration/capabilities/serverspec/spec_helper.rb
148
151
  - test/integration/default/serverspec/default_spec.rb
152
+ - test/integration/default/serverspec/spec_helper.rb