docker-api 1.30.2 → 1.31.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/README.md +10 -0
- data/lib/docker/container.rb +48 -17
- data/lib/docker/image.rb +8 -2
- data/lib/docker/version.rb +1 -1
- data/spec/docker/container_spec.rb +55 -0
- data/spec/docker/image_spec.rb +32 -5
- data/spec/spec_helper.rb +5 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1d9749b7eea95cde9fd6bf9acf5f0f37417b2d0
|
4
|
+
data.tar.gz: 75453af3775a005fead451d161c2571cf2efb6d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0850b2386f8a5ab23a5a2c82b562eca9a7e0e2ffb0ced598003f59c91f57ed9c97a5f1f2f35f84f59d240e4763e168e2d9279815138bfaa2d7adb60164f2968
|
7
|
+
data.tar.gz: 77dbcc8610a471671e087c6f76c1530d664cf8afb76742cc1c86fd16240759f068e47dd21cab1e1a306d1985f39131c38e1e07a4606314aada69ed4f811c74c2
|
data/README.md
CHANGED
@@ -372,6 +372,13 @@ Docker::Container.create(
|
|
372
372
|
}
|
373
373
|
)
|
374
374
|
|
375
|
+
# Stores a file with the given content in the container
|
376
|
+
container.store_file("/test", "Hello world")
|
377
|
+
|
378
|
+
# Reads a file from the container
|
379
|
+
container.read_file("/test")
|
380
|
+
# => "Hello world"
|
381
|
+
|
375
382
|
# Export a Container. Since an export is typically at least 300M, chunks of the
|
376
383
|
# export are yielded instead of just returning the whole thing.
|
377
384
|
File.open('export.tar', 'w') do |f|
|
@@ -498,6 +505,9 @@ container.exec(command, wait: 120)
|
|
498
505
|
container.delete(:force => true)
|
499
506
|
# => nil
|
500
507
|
|
508
|
+
# Update the container.
|
509
|
+
container.update("CpuShares" => 50000")
|
510
|
+
|
501
511
|
# Request a Container by ID or name.
|
502
512
|
Docker::Container.get('500f53b25e6e')
|
503
513
|
# => Docker::Container { :id => , :connection => Docker::Connection { :url => tcp://localhost, :options => {:port=>2375} } }
|
data/lib/docker/container.rb
CHANGED
@@ -51,27 +51,29 @@ class Docker::Container
|
|
51
51
|
# @param options [Hash] The options to pass to Docker::Exec
|
52
52
|
#
|
53
53
|
# @return [Docker::Exec] The Exec instance
|
54
|
-
def exec(command,
|
54
|
+
def exec(command, options = {}, &block)
|
55
55
|
# Establish values
|
56
|
-
tty =
|
57
|
-
detach =
|
58
|
-
user =
|
59
|
-
stdin =
|
60
|
-
stdout =
|
61
|
-
stderr =
|
62
|
-
wait =
|
56
|
+
tty = options.delete(:tty) || false
|
57
|
+
detach = options.delete(:detach) || false
|
58
|
+
user = options.delete(:user)
|
59
|
+
stdin = options.delete(:stdin)
|
60
|
+
stdout = options.delete(:stdout) || !detach
|
61
|
+
stderr = options.delete(:stderr) || !detach
|
62
|
+
wait = options.delete(:wait)
|
63
|
+
|
64
|
+
opts = {
|
65
|
+
'Container' => self.id,
|
66
|
+
'User' => user,
|
67
|
+
'AttachStdin' => !!stdin,
|
68
|
+
'AttachStdout' => stdout,
|
69
|
+
'AttachStderr' => stderr,
|
70
|
+
'Tty' => tty,
|
71
|
+
'Cmd' => command
|
72
|
+
}.merge(options)
|
63
73
|
|
64
74
|
# Create Exec Instance
|
65
75
|
instance = Docker::Exec.create(
|
66
|
-
|
67
|
-
'Container' => self.id,
|
68
|
-
'User' => user,
|
69
|
-
'AttachStdin' => !!stdin,
|
70
|
-
'AttachStdout' => stdout,
|
71
|
-
'AttachStderr' => stderr,
|
72
|
-
'Tty' => tty,
|
73
|
-
'Cmd' => command
|
74
|
-
},
|
76
|
+
opts,
|
75
77
|
self.connection
|
76
78
|
)
|
77
79
|
|
@@ -169,6 +171,10 @@ class Docker::Container
|
|
169
171
|
connection.post(path_for(:rename), query)
|
170
172
|
end
|
171
173
|
|
174
|
+
def update(opts)
|
175
|
+
connection.post(path_for(:update), {}, body: opts.to_json)
|
176
|
+
end
|
177
|
+
|
172
178
|
def streaming_logs(opts = {}, &block)
|
173
179
|
stack_size = opts.delete('stack_size') || -1
|
174
180
|
tty = opts.delete('tty') || opts.delete(:tty) || false
|
@@ -276,6 +282,31 @@ class Docker::Container
|
|
276
282
|
self
|
277
283
|
end
|
278
284
|
|
285
|
+
def read_file(path)
|
286
|
+
content = StringIO.new
|
287
|
+
archive_out(path) do |chunk|
|
288
|
+
content.write chunk
|
289
|
+
end
|
290
|
+
|
291
|
+
content.rewind
|
292
|
+
|
293
|
+
Gem::Package::TarReader.new(content) do |tar|
|
294
|
+
tar.each do |tarfile|
|
295
|
+
return tarfile.read
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def store_file(path, file_content)
|
301
|
+
output_io = StringIO.new(
|
302
|
+
Docker::Util.create_tar(
|
303
|
+
path => file_content
|
304
|
+
)
|
305
|
+
)
|
306
|
+
|
307
|
+
archive_in_stream("/", overwrite: true) { output_io.read }
|
308
|
+
end
|
309
|
+
|
279
310
|
# Create a new Container.
|
280
311
|
def self.create(opts = {}, conn = Docker.connection)
|
281
312
|
name = opts.delete('name')
|
data/lib/docker/image.rb
CHANGED
@@ -6,8 +6,8 @@ class Docker::Image
|
|
6
6
|
# an Image. This will not modify the Image, but rather create a new Container
|
7
7
|
# to run the Image. If the image has an embedded config, no command is
|
8
8
|
# necessary, but it will fail with 500 if no config is saved with the image
|
9
|
-
def run(cmd=nil)
|
10
|
-
opts = {
|
9
|
+
def run(cmd = nil, options = {})
|
10
|
+
opts = {'Image' => self.id}.merge(options)
|
11
11
|
opts["Cmd"] = cmd.is_a?(String) ? cmd.split(/\s+/) : cmd
|
12
12
|
begin
|
13
13
|
Docker::Container.create(opts, connection)
|
@@ -128,6 +128,12 @@ class Docker::Image
|
|
128
128
|
new(conn, hash)
|
129
129
|
end
|
130
130
|
|
131
|
+
# Delete a specific image
|
132
|
+
def remove(id, opts = {}, conn = Docker.connection)
|
133
|
+
conn.delete("/images/#{id}", opts)
|
134
|
+
end
|
135
|
+
alias_method :delete, :remove
|
136
|
+
|
131
137
|
# Save the raw binary representation or one or more Docker images
|
132
138
|
#
|
133
139
|
# @param names [String, Array#String] The image(s) you wish to save
|
data/lib/docker/version.rb
CHANGED
@@ -153,6 +153,30 @@ describe Docker::Container do
|
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
156
|
+
describe "#update", :docker_1_10 do
|
157
|
+
subject {
|
158
|
+
described_class.create({
|
159
|
+
"name" => "foo",
|
160
|
+
"Cmd" => %w[true],
|
161
|
+
"Image" => "debian:wheezy",
|
162
|
+
"HostConfig" => {
|
163
|
+
"CpuShares" => 60000
|
164
|
+
}
|
165
|
+
})
|
166
|
+
}
|
167
|
+
|
168
|
+
before { subject.start }
|
169
|
+
after(:each) { subject.tap(&:wait).remove }
|
170
|
+
|
171
|
+
it "updates the container" do
|
172
|
+
subject.refresh!
|
173
|
+
expect(subject.info.fetch("Config").fetch("CpuShares")).to eq 60000
|
174
|
+
subject.update("CpuShares" => 50000)
|
175
|
+
subject.refresh!
|
176
|
+
expect(subject.info.fetch("Config").fetch("CpuShares")).to eq 50000
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
156
180
|
describe '#changes' do
|
157
181
|
subject {
|
158
182
|
described_class.create(
|
@@ -325,6 +349,37 @@ describe Docker::Container do
|
|
325
349
|
end
|
326
350
|
end
|
327
351
|
|
352
|
+
describe "#read_file", :docker_1_8 do
|
353
|
+
subject {
|
354
|
+
Docker::Container.create(
|
355
|
+
"Image" => "debian:wheezy",
|
356
|
+
"Cmd" => ["/bin/bash", "-c", "echo \"Hello world\" > /test"]
|
357
|
+
)
|
358
|
+
}
|
359
|
+
|
360
|
+
after { subject.remove }
|
361
|
+
|
362
|
+
before do
|
363
|
+
subject.start
|
364
|
+
subject.wait
|
365
|
+
end
|
366
|
+
|
367
|
+
it "reads contents from files" do
|
368
|
+
expect(subject.read_file("/test")).to eq "Hello world\n"
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
describe "#store_file", :docker_1_8 do
|
373
|
+
subject { Docker::Container.create('Image' => 'debian:wheezy', 'Cmd' => ["ls"]) }
|
374
|
+
|
375
|
+
after { subject.remove }
|
376
|
+
|
377
|
+
it "stores content in files" do
|
378
|
+
subject.store_file("/test", "Hello\nWorld")
|
379
|
+
expect(subject.read_file("/test")).to eq "Hello\nWorld"
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
328
383
|
describe '#export' do
|
329
384
|
subject { described_class.create('Cmd' => %w[/true],
|
330
385
|
'Image' => 'tianon/true') }
|
data/spec/docker/image_spec.rb
CHANGED
@@ -33,6 +33,17 @@ describe Docker::Image do
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
context 'when using the class' do
|
37
|
+
let(:id) { subject.id }
|
38
|
+
subject { described_class.create('fromImage' => 'busybox:latest') }
|
39
|
+
after { described_class.create('fromImage' => 'busybox:latest') }
|
40
|
+
|
41
|
+
it 'removes the Image' do
|
42
|
+
Docker::Image.remove(id, force: true)
|
43
|
+
expect(Docker::Image.all.map(&:id)).to_not include(id)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
36
47
|
context 'when a valid tag is given' do
|
37
48
|
it 'untags the Image'
|
38
49
|
end
|
@@ -216,11 +227,18 @@ describe Docker::Image do
|
|
216
227
|
end
|
217
228
|
|
218
229
|
describe '#run' do
|
219
|
-
|
220
|
-
let(:
|
230
|
+
let(:cmd) { nil }
|
231
|
+
let(:options) { {} }
|
232
|
+
|
233
|
+
subject do
|
234
|
+
described_class.create(
|
235
|
+
{'fromImage' => 'debian:wheezy'})
|
236
|
+
end
|
237
|
+
|
238
|
+
let(:container) { subject.run(cmd, options).tap(&:wait) }
|
221
239
|
let(:output) { container.streaming_logs(stdout: true) }
|
222
240
|
|
223
|
-
context 'when
|
241
|
+
context 'when cmd is a String' do
|
224
242
|
let(:cmd) { 'ls /lib64/' }
|
225
243
|
after { container.remove }
|
226
244
|
|
@@ -229,7 +247,7 @@ describe Docker::Image do
|
|
229
247
|
end
|
230
248
|
end
|
231
249
|
|
232
|
-
context 'when
|
250
|
+
context 'when cmd is an Array' do
|
233
251
|
let(:cmd) { %w[which pwd] }
|
234
252
|
after { container.remove }
|
235
253
|
|
@@ -238,7 +256,7 @@ describe Docker::Image do
|
|
238
256
|
end
|
239
257
|
end
|
240
258
|
|
241
|
-
context 'when
|
259
|
+
context 'when cmd is nil' do
|
242
260
|
let(:cmd) { nil }
|
243
261
|
context 'no command configured in image' do
|
244
262
|
subject { described_class.create('fromImage' => 'swipely/base') }
|
@@ -257,6 +275,15 @@ describe Docker::Image do
|
|
257
275
|
end
|
258
276
|
end
|
259
277
|
end
|
278
|
+
|
279
|
+
context 'when using cpu shares' do
|
280
|
+
let(:options) { { 'CpuShares' => 50 } }
|
281
|
+
after { container.remove }
|
282
|
+
|
283
|
+
it 'returns 50' do
|
284
|
+
expect(container.json["Config"]["CpuShares"]).to eq 50
|
285
|
+
end
|
286
|
+
end
|
260
287
|
end
|
261
288
|
|
262
289
|
describe '#save' do
|
data/spec/spec_helper.rb
CHANGED
@@ -27,10 +27,15 @@ RSpec.configure do |config|
|
|
27
27
|
when /1\.6/
|
28
28
|
config.filter_run_excluding :docker_1_8 => true
|
29
29
|
config.filter_run_excluding :docker_1_9 => true
|
30
|
+
config.filter_run_excluding :docker_1_10 => true
|
30
31
|
when /1\.7/
|
31
32
|
config.filter_run_excluding :docker_1_8 => true
|
32
33
|
config.filter_run_excluding :docker_1_9 => true
|
34
|
+
config.filter_run_excluding :docker_1_10 => true
|
33
35
|
when /1\.8/
|
34
36
|
config.filter_run_excluding :docker_1_9 => true
|
37
|
+
config.filter_run_excluding :docker_1_10 => true
|
38
|
+
when /1\.9/
|
39
|
+
config.filter_run_excluding :docker_1_10 => true
|
35
40
|
end
|
36
41
|
end
|