dry-dock 0.1.3 → 0.1.4

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: 488e56c2a6889532224d9d3badd1e03c696422e5
4
- data.tar.gz: eb96040c6163b845684154856770d03afbaabce4
3
+ metadata.gz: 5de350e13158e99318eabbb68b7d507804cb0c9c
4
+ data.tar.gz: df476fedf7609cf0734aa92aaae0ab71235aa2df
5
5
  SHA512:
6
- metadata.gz: 7ae957bf3ee4af5f6992d5810de25575e21d4a3f7b7bfbb0fbfdc568f72989e284f0d86a387968456bc9df84a2a8e4ee2f3ef65438408623c3bfb36f0ccb3790
7
- data.tar.gz: a6531965d422e56a82a5c27feb550edc2d8aadd556547dcd9b97e8e649ac0b6a534f3c64de4bd73e279448a2049a715c3e77608697b7311c8587c99491385170
6
+ metadata.gz: 562e59af24727a8d9a23a2e8a677386b70a5bcadd48969af33a0c595c3c5592d68bd90cf72cc913a111bf4c27127ac03e051ce01aa114aa4d7db1e5189522183
7
+ data.tar.gz: f5807ebf5764c81c1fdef2e9c7650fc0e57f97608e305c586a18dcfe04fb46ef9a450d4c00085c1be94f181c1353df0da1719a4bf7f141d1f1e2bd23a4e64ba6
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.4
data/dry-dock.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: dry-dock 0.1.3 ruby lib
5
+ # stub: dry-dock 0.1.4 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "dry-dock"
9
- s.version = "0.1.3"
9
+ s.version = "0.1.4"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Ripta Pasay"]
14
- s.date = "2015-10-01"
14
+ s.date = "2015-10-02"
15
15
  s.description = "A Dockerfile-replacement DSL for building complex images"
16
16
  s.email = "github@r8y.org"
17
17
  s.executables = ["drydock", "json-test-consumer.rb", "json-test-producer.rb", "test-tar-writer-digest.rb"]
@@ -3,4 +3,7 @@ module Drydock
3
3
  class OperationError < StandardError; end
4
4
 
5
5
  class InvalidInstructionError < OperationError; end
6
+
7
+ class ExecutionError < OperationError; end
8
+ class InvalidCommandExecutionError < ExecutionError; end
6
9
  end
@@ -55,11 +55,15 @@ module Drydock
55
55
  end
56
56
  end
57
57
 
58
+ # TODO(rpasay): Break this large method apart.
58
59
  def self.create_container(cfg, &blk)
59
60
  meta_options = cfg[:MetaOptions] || {}
60
61
  timeout = meta_options.fetch(:read_timeout, Excon.defaults[:read_timeout]) || 60
61
62
 
62
63
  Docker::Container.create(cfg).tap do |c|
64
+ # The call to Container.create merely creates a container, to be
65
+ # scheduled to run. Start a separate thread that attaches to the
66
+ # container's streams and mirror them to the logger.
63
67
  t = Thread.new do
64
68
  begin
65
69
  c.attach(stream: true, stdout: true, stderr: true) do |stream, chunk|
@@ -78,12 +82,44 @@ module Drydock
78
82
  end
79
83
  end
80
84
 
81
- c.start
85
+ # TODO(rpasay): RACE CONDITION POSSIBLE - the thread above may be
86
+ # scheduled but not run before this block gets executed, which can
87
+ # cause a loss of log output. However, forcing `t` to be run once
88
+ # before this point seems to cause an endless wait (ruby 2.1.5).
89
+ # Need to dig deeper in the future.
90
+ #
91
+ # TODO(rpasay): More useful `blk` handling here. This method only
92
+ # returns after the container terminates, which isn't useful when
93
+ # you want to do stuff to it, e.g., spawn a new exec container.
94
+ #
95
+ # The following block starts the container, and waits for it to finish.
96
+ # An error is raised if no exit code is returned or if the exit code
97
+ # is non-zero.
98
+ begin
99
+ c.start
100
+ blk.call(c) if blk
101
+
102
+ results = c.wait(timeout)
103
+
104
+ unless results
105
+ raise InvalidCommandExecutionError, {container: c.id, message: "Container did not return anything (API BUG?)"}
106
+ end
82
107
 
83
- blk.call(c) if blk
108
+ unless results.key?('StatusCode')
109
+ raise InvalidCommandExecutionError, {container: c.id, message: "Container did not return a status code (API BUG?)"}
110
+ end
84
111
 
85
- c.wait(timeout)
86
- t.join
112
+ unless results['StatusCode'] == 0
113
+ raise InvalidCommandExecutionError, {container: c.id, message: "Container exited with code #{results['StatusCode']}"}
114
+ end
115
+ rescue
116
+ # on error, kill the streaming logs and reraise the exception
117
+ t.kill
118
+ raise
119
+ ensure
120
+ # always rejoin the thread
121
+ t.join
122
+ end
87
123
  end
88
124
  end
89
125
 
@@ -210,8 +246,6 @@ module Drydock
210
246
  end
211
247
 
212
248
  commit_config = self.class.build_commit_opts(opts)
213
- Drydock.logger.info(opts.inspect)
214
- Drydock.logger.info(commit_config.inspect)
215
249
 
216
250
  result = container.commit(commit_config)
217
251
  Drydock.logger.info(message: "Committed image ID #{result.id.slice(0, 12)}")
@@ -36,4 +36,14 @@ RSpec.describe Drydock::Project do
36
36
  expect(v2_output).to include("'/tmp/VERSION': No such file or directory")
37
37
  end
38
38
 
39
+ it 'succeeds running a real command' do
40
+ project.from('alpine')
41
+ expect { project.run('ls /') }.not_to raise_error
42
+ end
43
+
44
+ it 'fails running a non-existant command' do
45
+ project.from('alpine')
46
+ expect { project.run('whatever-gonna-error /') }.to raise_error(Drydock::InvalidCommandExecutionError)
47
+ end
48
+
39
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-dock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ripta Pasay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-01 00:00:00.000000000 Z
11
+ date: 2015-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api