docker-compose-api 1.0.4 → 1.0.5
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 +7 -0
- data/README.md +5 -4
- data/docker-compose-api.gemspec +4 -4
- data/lib/docker-compose.rb +1 -0
- data/lib/docker-compose/models/compose.rb +9 -0
- data/lib/docker-compose/models/compose_container.rb +31 -2
- data/lib/version.rb +1 -1
- data/spec/docker-compose/docker_compose_spec.rb +49 -0
- data/spec/docker-compose/fixtures/compose_1.yaml +3 -0
- data/spec/docker-compose/models/compose_container_spec.rb +59 -6
- metadata +24 -34
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8cd19119cd22c6ff9c235e71f0f3b7dda2170cd9
|
4
|
+
data.tar.gz: d8a5b668de10c6fecad255cc96f0359f59c1888c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 38ccca06b4af322ed96bab86176f2ded9b61da314cd51b57cb485d4dc445a074cca17a800d20450f6731078fc7c3b36ca484f50baf218ec0db7cccba7703daf6
|
7
|
+
data.tar.gz: 169c08e927c55f7544036e2a4c4572300cfc886bd6ae035e02cb3ab1cd93bf95e9b0dbcbbbfd073a85b3f7fb5a81224d90bca6182a3ce5c56714690fa0292d6c
|
data/README.md
CHANGED
@@ -19,7 +19,7 @@ gem install docker-compose-api
|
|
19
19
|
|
20
20
|
```ruby
|
21
21
|
# Add the line below on your Gemfile...
|
22
|
-
gem 'docker-compose-api'
|
22
|
+
gem 'docker-compose-api'
|
23
23
|
|
24
24
|
# ... and run bundle install
|
25
25
|
bundle install
|
@@ -44,8 +44,9 @@ DockerCompose.version
|
|
44
44
|
compose = DockerCompose.load('[path to docker compose file]')
|
45
45
|
|
46
46
|
# Accessing containers
|
47
|
-
compose.containers
|
48
|
-
compose.containers['
|
47
|
+
compose.containers # access all containers
|
48
|
+
compose.containers['container_label'] # access a container by its label (DEPRECATED)
|
49
|
+
compose.get_containers_by(label: 'foo', name: 'bar') # Returns an array of all containers with label = 'foo' and name = bar
|
49
50
|
|
50
51
|
# Starting containers (and their dependencies)
|
51
52
|
compose.start # start all containers
|
@@ -67,7 +68,7 @@ compose.delete # delete all containers
|
|
67
68
|
compose.delete(['container1', 'container2', ...]) # delete a list of specific containers
|
68
69
|
|
69
70
|
# Checking if a container is running or not
|
70
|
-
a_container = compose.
|
71
|
+
a_container = compose.get_containers_by(name: 'a_container').first
|
71
72
|
a_container.running?
|
72
73
|
|
73
74
|
# Accessing container informations
|
data/docker-compose-api.gemspec
CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "docker-api", "
|
21
|
+
spec.add_dependency "docker-api", "1.22.2"
|
22
22
|
|
23
|
-
spec.add_development_dependency "bundler"
|
24
|
-
spec.add_development_dependency "rspec"
|
25
|
-
spec.add_development_dependency "simplecov"
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.3"
|
25
|
+
spec.add_development_dependency "simplecov", "~> 0.10"
|
26
26
|
end
|
data/lib/docker-compose.rb
CHANGED
@@ -19,6 +19,15 @@ class Compose
|
|
19
19
|
true
|
20
20
|
end
|
21
21
|
|
22
|
+
#
|
23
|
+
# Select containers based on attributes given by "params"
|
24
|
+
#
|
25
|
+
def get_containers_by(params)
|
26
|
+
@containers.values.select do |container|
|
27
|
+
(params.to_a - container.attributes.to_a).empty?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
22
31
|
#
|
23
32
|
# Create link relations among containers
|
24
33
|
#
|
@@ -9,6 +9,7 @@ class ComposeContainer
|
|
9
9
|
def initialize(hash_attributes)
|
10
10
|
@attributes = {
|
11
11
|
label: hash_attributes[:label],
|
12
|
+
name: hash_attributes[:name].nil? ? hash_attributes[:label] : hash_attributes[:name],
|
12
13
|
image: ComposeUtils.format_image(hash_attributes[:image]),
|
13
14
|
build: hash_attributes[:build],
|
14
15
|
links: ComposeUtils.format_links(hash_attributes[:links]),
|
@@ -54,6 +55,8 @@ class ComposeContainer
|
|
54
55
|
# Prepare attributes
|
55
56
|
port_bindings = prepare_port_bindings
|
56
57
|
links = prepare_links
|
58
|
+
volumes = prepare_volumes
|
59
|
+
volume_binds = @attributes[:volumes] && @attributes[:volumes].reject { |volume| volume.split(':').one? }
|
57
60
|
|
58
61
|
# Exposed ports are port bindings with an empty hash as value
|
59
62
|
exposed_ports = {}
|
@@ -63,15 +66,19 @@ class ComposeContainer
|
|
63
66
|
Image: @internal_image,
|
64
67
|
Cmd: @attributes[:command],
|
65
68
|
Env: @attributes[:environment],
|
66
|
-
Volumes:
|
69
|
+
Volumes: volumes,
|
67
70
|
ExposedPorts: exposed_ports,
|
68
71
|
HostConfig: {
|
72
|
+
Binds: volume_binds,
|
69
73
|
Links: links,
|
70
74
|
PortBindings: port_bindings
|
71
75
|
}
|
72
76
|
}
|
73
77
|
|
74
|
-
|
78
|
+
query_params = { 'name' => @attributes[:name] }
|
79
|
+
|
80
|
+
params = container_config.merge(query_params)
|
81
|
+
@container = Docker::Container.create(params)
|
75
82
|
end
|
76
83
|
|
77
84
|
#
|
@@ -108,6 +115,28 @@ class ComposeContainer
|
|
108
115
|
links
|
109
116
|
end
|
110
117
|
|
118
|
+
#
|
119
|
+
# Transforms an array of [(host:)container(:accessmode)] to a hash
|
120
|
+
# required by the Docker api.
|
121
|
+
#
|
122
|
+
def prepare_volumes
|
123
|
+
return unless @attributes[:volumes]
|
124
|
+
|
125
|
+
volumes = {}
|
126
|
+
|
127
|
+
@attributes[:volumes].each do |volume|
|
128
|
+
parts = volume.split(':')
|
129
|
+
|
130
|
+
if parts.one?
|
131
|
+
volumes[parts[0]] = {}
|
132
|
+
else
|
133
|
+
volumes[parts[1]] = { parts[0] => parts[2] || 'rw' }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
volumes
|
138
|
+
end
|
139
|
+
|
111
140
|
#
|
112
141
|
# Process each port entry in docker compose file and
|
113
142
|
# create structure recognized by docker client
|
data/lib/version.rb
CHANGED
@@ -205,6 +205,19 @@ describe DockerCompose do
|
|
205
205
|
container1.stop
|
206
206
|
end
|
207
207
|
|
208
|
+
it 'binds volumes' do
|
209
|
+
container1 = @compose.containers.values.first
|
210
|
+
|
211
|
+
# Start container
|
212
|
+
container1.start
|
213
|
+
|
214
|
+
volumes = container1.stats['HostConfig']['Binds']
|
215
|
+
expect(volumes).to match_array(['/tmp/test:/tmp:ro'])
|
216
|
+
|
217
|
+
# Stop container
|
218
|
+
container1.stop
|
219
|
+
end
|
220
|
+
|
208
221
|
it 'supports setting environment as array' do
|
209
222
|
container1 = @compose.containers.values.first
|
210
223
|
|
@@ -231,6 +244,42 @@ describe DockerCompose do
|
|
231
244
|
container1.stop
|
232
245
|
end
|
233
246
|
|
247
|
+
it 'should assing given name to container' do
|
248
|
+
container = @compose.containers.values[0]
|
249
|
+
|
250
|
+
# Start container
|
251
|
+
container.start
|
252
|
+
|
253
|
+
container_name = container.stats['Name']
|
254
|
+
expect(container_name).to eq('/busybox-container')
|
255
|
+
|
256
|
+
# Stop container
|
257
|
+
container.stop
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'should assing a random name to container when name is not given' do
|
261
|
+
container = @compose.containers.values[1]
|
262
|
+
|
263
|
+
# Start container
|
264
|
+
container.start
|
265
|
+
|
266
|
+
container_name = container.stats['Name']
|
267
|
+
expect(container_name).to_not be_nil
|
268
|
+
|
269
|
+
# Stop container
|
270
|
+
container.stop
|
271
|
+
end
|
272
|
+
|
273
|
+
it 'should filter containers by its attributes' do
|
274
|
+
expect(@compose.get_containers_by(label: 'busybox2')).to eq([@compose.containers['busybox2']])
|
275
|
+
expect(@compose.get_containers_by(name: 'busybox-container')).to eq([@compose.containers['busybox1']])
|
276
|
+
expect(@compose.get_containers_by(image: 'busybox:latest')).to eq([
|
277
|
+
@compose.containers['busybox1'],
|
278
|
+
@compose.containers['busybox2'],
|
279
|
+
@compose.containers['busybox3']
|
280
|
+
])
|
281
|
+
end
|
282
|
+
|
234
283
|
after(:all) do
|
235
284
|
@compose.delete
|
236
285
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
busybox1:
|
2
2
|
image: busybox
|
3
|
+
container_name: busybox-container
|
3
4
|
ports:
|
4
5
|
- "3000"
|
5
6
|
- "8000:8000"
|
@@ -11,6 +12,8 @@ busybox1:
|
|
11
12
|
command: ping busybox2
|
12
13
|
environment:
|
13
14
|
- MYENV1=variable1
|
15
|
+
volumes:
|
16
|
+
- "/tmp/test:/tmp:ro"
|
14
17
|
|
15
18
|
busybox2:
|
16
19
|
image: busybox
|
@@ -4,10 +4,12 @@ describe ComposeContainer do
|
|
4
4
|
context 'Object creation' do
|
5
5
|
before(:all) do
|
6
6
|
@attributes = {
|
7
|
+
label: SecureRandom.hex,
|
7
8
|
image: 'busybox:latest',
|
9
|
+
name: SecureRandom.hex,
|
8
10
|
links: ['service1:label', 'service2'],
|
9
11
|
ports: ['3000', '8000:8000', '127.0.0.1:8001:8001'],
|
10
|
-
volumes:
|
12
|
+
volumes: ['/tmp'],
|
11
13
|
command: 'ping -c 3 localhost',
|
12
14
|
environment: ['ENVIRONMENT']
|
13
15
|
}
|
@@ -17,6 +19,7 @@ describe ComposeContainer do
|
|
17
19
|
|
18
20
|
it 'should prepare attributes correctly' do
|
19
21
|
expect(@entry.attributes[:image]).to eq(@attributes[:image])
|
22
|
+
expect(@entry.attributes[:name]).to eq(@attributes[:name])
|
20
23
|
expect(@entry.attributes[:links])
|
21
24
|
.to eq({'service1' => 'label', 'service2' => 'service2'})
|
22
25
|
expect(@entry.attributes[:volumes]).to eq(@attributes[:volumes])
|
@@ -50,15 +53,18 @@ describe ComposeContainer do
|
|
50
53
|
|
51
54
|
context 'From image' do
|
52
55
|
before(:all) do
|
53
|
-
attributes = {
|
56
|
+
@attributes = {
|
57
|
+
label: SecureRandom.hex,
|
54
58
|
image: 'busybox:latest',
|
59
|
+
name: SecureRandom.hex,
|
55
60
|
links: ['links:links'],
|
56
|
-
volumes:
|
61
|
+
volumes: ['/tmp'],
|
57
62
|
command: 'ping -c 3 localhost',
|
58
63
|
environment: ['ENVIRONMENT']
|
59
64
|
}
|
60
65
|
|
61
|
-
@entry = ComposeContainer.new(attributes)
|
66
|
+
@entry = ComposeContainer.new(@attributes)
|
67
|
+
@entry_autogen_name = ComposeContainer.new(@attributes.reject{|key| key == :name})
|
62
68
|
end
|
63
69
|
|
64
70
|
it 'should start/stop a container' do
|
@@ -82,6 +88,26 @@ describe ComposeContainer do
|
|
82
88
|
@entry.stop
|
83
89
|
expect(@entry.running?).to be false
|
84
90
|
end
|
91
|
+
|
92
|
+
it 'should assign a given name to container' do
|
93
|
+
#Start container
|
94
|
+
@entry.start
|
95
|
+
|
96
|
+
expect(@entry.stats['Name']).to eq("/#{@attributes[:name]}")
|
97
|
+
|
98
|
+
# Stop container
|
99
|
+
@entry.stop
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should assign label to container name when name is not given' do
|
103
|
+
#Start container
|
104
|
+
@entry_autogen_name.start
|
105
|
+
|
106
|
+
expect(@entry_autogen_name.stats['Name']).to eq("/#{@entry_autogen_name.attributes[:label]}")
|
107
|
+
|
108
|
+
# Stop container
|
109
|
+
@entry_autogen_name.stop
|
110
|
+
end
|
85
111
|
end
|
86
112
|
|
87
113
|
context 'From Dockerfile' do
|
@@ -89,7 +115,7 @@ describe ComposeContainer do
|
|
89
115
|
attributes = {
|
90
116
|
build: File.expand_path('spec/docker-compose/fixtures/'),
|
91
117
|
links: ['links:links'],
|
92
|
-
volumes:
|
118
|
+
volumes: ['/tmp']
|
93
119
|
}
|
94
120
|
|
95
121
|
@entry = ComposeContainer.new(attributes)
|
@@ -122,7 +148,7 @@ describe ComposeContainer do
|
|
122
148
|
before(:all) do
|
123
149
|
attributes = {
|
124
150
|
links: ['links:links'],
|
125
|
-
volumes:
|
151
|
+
volumes: ['/tmp'],
|
126
152
|
command: 'ps aux',
|
127
153
|
environment: ['ENVIRONMENT']
|
128
154
|
}
|
@@ -150,4 +176,31 @@ describe ComposeContainer do
|
|
150
176
|
expect(@entry.attributes[:environment]).to eq(%w(ENVIRONMENT=VALUE))
|
151
177
|
end
|
152
178
|
end
|
179
|
+
|
180
|
+
describe '#prepare_volumes' do
|
181
|
+
let(:attributes) do
|
182
|
+
{ image: 'busybox:latest' }
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'correctly parses container-only volumes' do
|
186
|
+
attributes[:volumes] = ['/tmp']
|
187
|
+
entry = ComposeContainer.new(attributes)
|
188
|
+
volumes = entry.send(:prepare_volumes)
|
189
|
+
expect(volumes).to eq({ '/tmp' => {} })
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'correctly parses host-container mapped volumes' do
|
193
|
+
attributes[:volumes] = ['./tmp:/tmp']
|
194
|
+
entry = ComposeContainer.new(attributes)
|
195
|
+
volumes = entry.send(:prepare_volumes)
|
196
|
+
expect(volumes).to eq({ '/tmp' => { './tmp' => 'rw' } })
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'correctly parses host-container mapped volumes with access rights' do
|
200
|
+
attributes[:volumes] = ['./tmp:/tmp:ro']
|
201
|
+
entry = ComposeContainer.new(attributes)
|
202
|
+
volumes = entry.send(:prepare_volumes)
|
203
|
+
expect(volumes).to eq({ '/tmp' => { './tmp' => 'ro' } })
|
204
|
+
end
|
205
|
+
end
|
153
206
|
end
|
metadata
CHANGED
@@ -1,80 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker-compose-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Mauricio S. Klein
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-01-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: docker-api
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 1.22.2
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 1.22.2
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: bundler
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
33
|
+
version: '1.7'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: '
|
40
|
+
version: '1.7'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
47
|
+
version: '3.3'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
54
|
+
version: '3.3'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: simplecov
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - "~>"
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
61
|
+
version: '0.10'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - "~>"
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
68
|
+
version: '0.10'
|
78
69
|
description: A simple ruby client for docker-compose api
|
79
70
|
email:
|
80
71
|
- mauricio.klein.msk@gmail.com
|
@@ -82,9 +73,9 @@ executables: []
|
|
82
73
|
extensions: []
|
83
74
|
extra_rdoc_files: []
|
84
75
|
files:
|
85
|
-
- .gitignore
|
86
|
-
- .rspec
|
87
|
-
- .travis.yml
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
|
+
- ".travis.yml"
|
88
79
|
- Gemfile
|
89
80
|
- LICENSE.txt
|
90
81
|
- README.md
|
@@ -105,27 +96,26 @@ files:
|
|
105
96
|
homepage: https://github.com/mauricioklein/docker-compose-api
|
106
97
|
licenses:
|
107
98
|
- MIT
|
99
|
+
metadata: {}
|
108
100
|
post_install_message:
|
109
101
|
rdoc_options: []
|
110
102
|
require_paths:
|
111
103
|
- lib
|
112
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
105
|
requirements:
|
115
|
-
- -
|
106
|
+
- - ">="
|
116
107
|
- !ruby/object:Gem::Version
|
117
108
|
version: '0'
|
118
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
110
|
requirements:
|
121
|
-
- -
|
111
|
+
- - ">="
|
122
112
|
- !ruby/object:Gem::Version
|
123
113
|
version: '0'
|
124
114
|
requirements: []
|
125
115
|
rubyforge_project:
|
126
|
-
rubygems_version:
|
116
|
+
rubygems_version: 2.4.5
|
127
117
|
signing_key:
|
128
|
-
specification_version:
|
118
|
+
specification_version: 4
|
129
119
|
summary: A simple ruby client for docker-compose api
|
130
120
|
test_files:
|
131
121
|
- spec/docker-compose/docker_compose_spec.rb
|