docker 0.3.0 → 0.3.1
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 +2 -2
- data/docker.gemspec +1 -1
- data/lib/docker.rb +2 -0
- data/lib/docker/asset.rb +27 -0
- data/lib/docker/container.rb +54 -0
- data/lib/docker/session.rb +62 -2
- data/lib/docker/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41a18cd99670f903bc99f7277cb27afdf00025c0
|
4
|
+
data.tar.gz: 6d4313cd3012dd54a76eff1b5e6cd67f93ccc829
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3bfbdb9b4f2846910d5e3315b71fef671ead204a15e28871a01a1617c7bdabf3811e0444bb32466f2947b9948ad4de4d82f7bba8deea390ad95cdbb460011f9
|
7
|
+
data.tar.gz: caa31e851fa10c4d2b6b913087d1350861266fe0aacbb5b705ba2826ebc2f5e3f3c487bae8e0a9701186657888494ba554231c842d9d88225aebc23386b25a2a
|
data/README.md
CHANGED
@@ -29,7 +29,7 @@ Or install it yourself as:
|
|
29
29
|
|
30
30
|
## Usage
|
31
31
|
|
32
|
-
|
32
|
+
Instantiate a `Docker::Session` and call its methods to invoke Docker commands.
|
33
33
|
|
34
34
|
```ruby
|
35
35
|
require 'docker'
|
@@ -40,7 +40,7 @@ docker = Docker.new
|
|
40
40
|
|
41
41
|
docker.version
|
42
42
|
|
43
|
-
docker.run(
|
43
|
+
docker.run('busybox', '/bin/sh', interactive:true, tty:true)
|
44
44
|
```
|
45
45
|
|
46
46
|
## Development
|
data/docker.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["xeger@xeger.net"]
|
11
11
|
|
12
12
|
spec.summary = %q{Docker CLI wrapper.}
|
13
|
-
spec.description = %q{Provides an OOP interface to docker without relying on its HTTP API.}
|
13
|
+
spec.description = %q{Provides an OOP interface to docker's command-line interface without relying on its HTTP API.}
|
14
14
|
spec.homepage = "https://github.com/xeger/docker"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
data/lib/docker.rb
CHANGED
data/lib/docker/asset.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Docker
|
2
|
+
# Base class for containers, images and other Docker assets.
|
3
|
+
class Asset
|
4
|
+
def initialize(json, session:nil)
|
5
|
+
json = JSON.load(json) if json.is_a?(String)
|
6
|
+
@json = json
|
7
|
+
@session = session
|
8
|
+
end
|
9
|
+
|
10
|
+
def inspect
|
11
|
+
%Q{#<#{self.class.name}:#{self.name}>}
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [String] human-readable name of container, image or volume
|
15
|
+
def name
|
16
|
+
@json['Name']
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_h
|
20
|
+
@json
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
self.inspect
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Docker
|
2
|
+
# Object that represents a Docker container, its information and operations.
|
3
|
+
class Container < Asset
|
4
|
+
# @return [String] unique SHA256 container hash
|
5
|
+
def id
|
6
|
+
@json['Id']
|
7
|
+
end
|
8
|
+
|
9
|
+
# @return [String] human-readable name of container ()minus initial /)
|
10
|
+
def name
|
11
|
+
super.sub(/^\//, '')
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [String] SHA256 hash of image the container is derived from
|
15
|
+
def image
|
16
|
+
@json['Image']
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [String] running, exited, etc
|
20
|
+
def status
|
21
|
+
@json['State']['Status']
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Integer] master process PID
|
25
|
+
def pid
|
26
|
+
@json['State']['Pid']
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Integer] master process exit code
|
30
|
+
def exit_code
|
31
|
+
@json['State']['ExitCode']
|
32
|
+
end
|
33
|
+
|
34
|
+
def kill
|
35
|
+
raise Error, "Disconnected from session" unless @session
|
36
|
+
@session.kill(id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def rm
|
40
|
+
raise Error, "Disconnected from session" unless @session
|
41
|
+
@session.rm(id)
|
42
|
+
end
|
43
|
+
|
44
|
+
def start
|
45
|
+
raise Error, "Disconnected from session" unless @session
|
46
|
+
@session.start(id)
|
47
|
+
end
|
48
|
+
|
49
|
+
def stop
|
50
|
+
raise Error, "Disconnected from session" unless @session
|
51
|
+
@session.stop(id)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/docker/session.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'backticks'
|
2
|
+
require 'json'
|
2
3
|
|
3
4
|
module Docker
|
4
5
|
# A Ruby OOP interface to a docker session. A session is bound to
|
@@ -19,19 +20,51 @@ module Docker
|
|
19
20
|
# @return [#command]
|
20
21
|
attr_reader :shell
|
21
22
|
|
22
|
-
|
23
|
+
# Hint that we are able to parse ps output
|
24
|
+
PS_HEADER = /ID\s+IMAGE\s+COMMAND\s+CREATED\s+STATUS\s+PORTS\s+NAMES$/
|
25
|
+
|
26
|
+
def initialize(shell=Backticks::Runner.new, host:ENV['DOCKER_HOST'])
|
23
27
|
@host = host
|
24
28
|
@shell = shell
|
25
29
|
end
|
26
30
|
|
31
|
+
# Get detailed information about a container(s).
|
32
|
+
#
|
33
|
+
# @return [Container,Array] one container if one was asked about; a list of containers otherwise
|
34
|
+
# @param [Array,String] container ID/name or list of IDs/names
|
35
|
+
def inspect(container_s)
|
36
|
+
containers = container_s
|
37
|
+
containers = [containers] unless container_s.is_a?(Array)
|
38
|
+
out = run!('inspect', containers)
|
39
|
+
result = JSON.parse(out).map { |c| Container.new(c, session:self)}
|
40
|
+
if container_s.is_a?(Array)
|
41
|
+
result
|
42
|
+
else
|
43
|
+
result.first
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
27
47
|
# Kill a running container.
|
28
48
|
#
|
29
|
-
# @param [String] container id or name of container
|
49
|
+
# @param [String] container id or name of container
|
30
50
|
# @param [String] signal Unix signal to send: KILL, TERM, QUIT, HUP, etc
|
31
51
|
def kill(container, signal:nil)
|
32
52
|
run!('kill', {signal:signal}, container)
|
33
53
|
end
|
34
54
|
|
55
|
+
# List containers. This actually does a `ps` followed by a very large
|
56
|
+
# `inspect`, so it's expensive but super detailed.
|
57
|
+
#
|
58
|
+
# @param
|
59
|
+
# @return [Array] list of Docker::Container objects
|
60
|
+
def ps(all:false, before:nil, latest:false, since:nil)
|
61
|
+
out = run!('ps', all:all,before:before,latest:latest,since:since)
|
62
|
+
lines = out.split(/[\n\r]+/)
|
63
|
+
header = lines.shift
|
64
|
+
ids = lines.map { |line| line.split(/\s+/).first }
|
65
|
+
inspect(ids)
|
66
|
+
end
|
67
|
+
|
35
68
|
# Run a command in a new container.
|
36
69
|
#
|
37
70
|
# @example open a busybox shell
|
@@ -104,6 +137,32 @@ module Docker
|
|
104
137
|
run!('run', *cmd).strip
|
105
138
|
end
|
106
139
|
|
140
|
+
# Remove a container.
|
141
|
+
#
|
142
|
+
# @param [String] container id or name of container
|
143
|
+
# @param [Boolean] force remove the container even if it's in use
|
144
|
+
# @param [Boolean] volumes remove associated data volumes
|
145
|
+
def rm(container, force:false, volumes:false)
|
146
|
+
run!('rm', {force:force,volumes:volumes},container).strip
|
147
|
+
end
|
148
|
+
|
149
|
+
# Stop a running container.
|
150
|
+
#
|
151
|
+
# @param [String] container id or name of container
|
152
|
+
# @param [Integer] time seconds to wait for stop before killing it
|
153
|
+
def stop(container, time:nil)
|
154
|
+
run!('stop', {time:time}, container).strip
|
155
|
+
end
|
156
|
+
|
157
|
+
# Start a stopped container.
|
158
|
+
#
|
159
|
+
# @param [String] container id or name of container
|
160
|
+
# @param [Boolean] attach attach STDOUT/STDERR and forward signals
|
161
|
+
# @param [Boolean] interactive attach container's STDIN
|
162
|
+
def start(container, attach:false, interactive:false)
|
163
|
+
run!('start', {attach:attach,interactive:interactive}, container).strip
|
164
|
+
end
|
165
|
+
|
107
166
|
# Provide version information about the Docker client and server.
|
108
167
|
#
|
109
168
|
# @return [Hash] dictionary of strings describing version/build info
|
@@ -138,6 +197,7 @@ module Docker
|
|
138
197
|
# @return [String] output of the command
|
139
198
|
# @raise [RuntimeError] if command fails
|
140
199
|
def run!(*args)
|
200
|
+
# STDERR.puts "+ " + (['docker'] + args).inspect
|
141
201
|
cmd = @shell.run('docker', *args).join
|
142
202
|
status, out, err = cmd.status, cmd.captured_output, cmd.captured_error
|
143
203
|
status.success? || raise(Error.new(args.first, status, err))
|
data/lib/docker/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Spataro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backticks
|
@@ -66,7 +66,8 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description: Provides an OOP interface to docker
|
69
|
+
description: Provides an OOP interface to docker's command-line interface without
|
70
|
+
relying on its HTTP API.
|
70
71
|
email:
|
71
72
|
- xeger@xeger.net
|
72
73
|
executables: []
|
@@ -86,6 +87,8 @@ files:
|
|
86
87
|
- bin/setup
|
87
88
|
- docker.gemspec
|
88
89
|
- lib/docker.rb
|
90
|
+
- lib/docker/asset.rb
|
91
|
+
- lib/docker/container.rb
|
89
92
|
- lib/docker/error.rb
|
90
93
|
- lib/docker/session.rb
|
91
94
|
- lib/docker/version.rb
|