docker-api 1.26.2 → 1.27.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +17 -10
- data/README.md +36 -0
- data/lib/docker.rb +6 -1
- data/lib/docker/image.rb +42 -15
- data/lib/docker/version.rb +1 -1
- data/lib/docker/volume.rb +2 -4
- data/script/docker +149 -0
- data/script/docker.conf +61 -0
- data/script/install_docker.sh +35 -0
- data/spec/docker/exec_spec.rb +6 -2
- data/spec/docker/image_spec.rb +47 -1
- data/spec/docker/volume_spec.rb +5 -2
- data/spec/docker_spec.rb +10 -0
- data/spec/fixtures/load.tar +0 -0
- metadata +7 -3
- data/script/install_dependencies.sh +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a402451b60cf3ee27d968b6c406b763ba02fd064
|
4
|
+
data.tar.gz: 239c7b7261f471873819ade511325c785e632d0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68228f7e53d244b754ce9c26c3a2e412c4162595ae4fc069afea00aa5b89a499f205bcd2be5e055a274ce6e1f5ef2a9188dec364c2086505817176c4bb66a737
|
7
|
+
data.tar.gz: 128d69692f073e103aeef72af0743d5ab3db5020b770242f8df4964da3b0ec6c88c70e587e25822e0a66c80cd3c6bebfdf05f7fa90d501850960b71272c29df9
|
data/.travis.yml
CHANGED
@@ -1,18 +1,25 @@
|
|
1
1
|
sudo: required
|
2
2
|
dist: trusty
|
3
|
-
cache: bundler
|
4
3
|
language: ruby
|
4
|
+
cache: bundler
|
5
5
|
rvm:
|
6
|
-
- 1.9.3
|
7
|
-
- 2.0
|
8
|
-
- 2.1
|
9
6
|
- 2.2
|
7
|
+
- 2.1
|
8
|
+
- 2.0
|
9
|
+
- 1.9.3
|
10
10
|
env:
|
11
|
-
- DOCKER_VERSION=1.
|
12
|
-
- DOCKER_VERSION=1.7.1
|
13
|
-
- DOCKER_VERSION=1.8.3
|
11
|
+
- DOCKER_VERSION=1.10.3
|
14
12
|
- DOCKER_VERSION=1.9.1
|
15
|
-
|
13
|
+
- DOCKER_VERSION=1.8.2
|
14
|
+
- DOCKER_VERSION=1.7.1
|
15
|
+
- DOCKER_VERSION=1.6.2
|
16
|
+
matrix:
|
17
|
+
fast_finish: true
|
18
|
+
before_install:
|
19
|
+
- docker --version
|
20
|
+
- gem install bundler
|
16
21
|
before_script:
|
17
|
-
-
|
18
|
-
-
|
22
|
+
- sudo ./script/install_docker.sh ${DOCKER_VERSION}
|
23
|
+
- uname -a
|
24
|
+
- docker --version
|
25
|
+
- docker info
|
data/README.md
CHANGED
@@ -186,6 +186,10 @@ image.save('my_export.tar')
|
|
186
186
|
image.save
|
187
187
|
# => "abiglongbinarystring"
|
188
188
|
|
189
|
+
# Stream the contents of the image to a block:
|
190
|
+
image.save_stream { |chunk| puts chunk }
|
191
|
+
# => nil
|
192
|
+
|
189
193
|
# Given a Container's export, creates a new Image.
|
190
194
|
# docker command for reference: docker import some-export.tar
|
191
195
|
Docker::Image.import('some-export.tar')
|
@@ -210,6 +214,11 @@ Docker::Image.build("from base\nrun touch /test")
|
|
210
214
|
Docker::Image.build_from_dir('.')
|
211
215
|
# => Docker::Image { :id => 1266dc19e, :connection => Docker::Connection { :url => tcp://localhost, :options => {:port=>2375} } }
|
212
216
|
|
217
|
+
# Create an Image from a file other than Dockerfile.
|
218
|
+
# docker command for reference: docker build -f Dockerfile.Centos .
|
219
|
+
Docker::Image.build_from_dir('.', { 'dockerfile' => 'Dockerfile.Centos' })
|
220
|
+
# => Docker::Image { :id => 1266dc19e, :connection => Docker::Connection { :url => tcp://localhost, :options => {:port=>2375} } }
|
221
|
+
|
213
222
|
# Create an Image from a Dockerfile and stream the logs
|
214
223
|
Docker::Image.build_from_dir('.') do |v|
|
215
224
|
if (log = JSON.parse(v)) && log.has_key?("stream")
|
@@ -247,6 +256,11 @@ names = %w( my_image1 my_image2:not_latest )
|
|
247
256
|
Docker::Image.save(names)
|
248
257
|
# => "abiglongbinarystring"
|
249
258
|
|
259
|
+
# Stream the raw binary data
|
260
|
+
names = %w( my_image1 my_image2:not_latest )
|
261
|
+
Docker::Image.save_stream(names) { |chunk| puts chunk }
|
262
|
+
# => nil
|
263
|
+
|
250
264
|
# Search the Docker registry.
|
251
265
|
# docker command for reference: docker search sshd
|
252
266
|
Docker::Image.search('term' => 'sshd')
|
@@ -429,12 +443,30 @@ Docker::Container.get('500f53b25e6e')
|
|
429
443
|
# Request all of the Containers. By default, will only return the running Containers.
|
430
444
|
Docker::Container.all(:all => true)
|
431
445
|
# => [Docker::Container { :id => , :connection => Docker::Connection { :url => tcp://localhost, :options => {:port=>2375} } }]
|
446
|
+
```
|
447
|
+
|
448
|
+
## JSON encoded values
|
449
|
+
|
450
|
+
For JSON encoded values, nothing is done implicitly, meaning you need to explicitly call `to_json` on your parameter before the call. For example, to request all of the Containers using a filter:
|
451
|
+
|
452
|
+
```ruby
|
453
|
+
require 'docker'
|
432
454
|
|
433
455
|
# Request all of the Containers, filtering by status exited.
|
434
456
|
Docker::Container.all(all: true, filters: { status: ["exited"] }.to_json)
|
435
457
|
# => [Docker::Container { :id => , :connection => Docker::Connection { :url => tcp://localhost, :options => {:port=>2375} } }]
|
458
|
+
|
459
|
+
# Request all of the Container, filtering by label_name.
|
460
|
+
Docker::Container.all(all: true, filters: { label: [ "label_name" ] }.to_json)
|
461
|
+
# => [Docker::Container { :id => , :connection => Docker::Connection { :url => tcp://localhost, :options => {:port=>2375} } }]
|
462
|
+
|
463
|
+
# Request all of the Container, filtering by label label_name that have the value label_value_.
|
464
|
+
Docker::Container.all(all: true, filters: { label: [ "label_name=label_value" ] }.to_json)
|
465
|
+
# => [Docker::Container { :id => , :connection => Docker::Connection { :url => tcp://localhost, :options => {:port=>2375} } }]
|
436
466
|
```
|
437
467
|
|
468
|
+
This applies for all parameters that are requested to be JSON encoded by the docker api.
|
469
|
+
|
438
470
|
## Events
|
439
471
|
|
440
472
|
```ruby
|
@@ -486,6 +518,10 @@ image 'repo:new_tag' => 'repo:tag' do
|
|
486
518
|
end
|
487
519
|
```
|
488
520
|
|
521
|
+
## Known issues
|
522
|
+
|
523
|
+
* If the docker daemon is always responding to your requests with a 400 Bad Request when using UNIX sockets, verify you're running Excon version 0.46.0 or greater. [Link](https://github.com/swipely/docker-api/issues/381)
|
524
|
+
|
489
525
|
## Not supported (yet)
|
490
526
|
|
491
527
|
* Generating a tarball of images and metadata for a repository specified by a name: https://docs.docker.com/engine/reference/api/docker_remote_api_v1.14/#get-a-tarball-containing-all-images-and-tags-in-a-repository
|
data/lib/docker.rb
CHANGED
@@ -112,6 +112,11 @@ module Docker
|
|
112
112
|
Util.parse_json(connection.get('/info'))
|
113
113
|
end
|
114
114
|
|
115
|
+
# Ping the Docker server.
|
116
|
+
def ping(connection = self.connection)
|
117
|
+
connection.get('/_ping')
|
118
|
+
end
|
119
|
+
|
115
120
|
# Login to the Docker registry.
|
116
121
|
def authenticate!(options = {}, connection = self.connection)
|
117
122
|
creds = options.to_json
|
@@ -134,5 +139,5 @@ module Docker
|
|
134
139
|
module_function :default_socket_url, :env_url, :url, :url=, :env_options,
|
135
140
|
:options, :options=, :creds, :creds=, :logger, :logger=,
|
136
141
|
:connection, :reset!, :reset_connection!, :version, :info,
|
137
|
-
:authenticate!, :validate_version!, :ssl_options
|
142
|
+
:ping, :authenticate!, :validate_version!, :ssl_options
|
138
143
|
end
|
data/lib/docker/image.rb
CHANGED
@@ -89,6 +89,11 @@ class Docker::Image
|
|
89
89
|
self.class.save(self.id, filename, connection)
|
90
90
|
end
|
91
91
|
|
92
|
+
# Save the image as a tarball to an IO object.
|
93
|
+
def save_stream(opts = {}, &block)
|
94
|
+
self.class.save_stream(self.id, opts, connection, &block)
|
95
|
+
end
|
96
|
+
|
92
97
|
# Update the @info hash, which is the only mutable state in this object.
|
93
98
|
def refresh!
|
94
99
|
img = Docker::Image.all({:all => true}, connection).find { |image|
|
@@ -133,27 +138,49 @@ class Docker::Image
|
|
133
138
|
# representation of the binary data. If the filename is not nil, then
|
134
139
|
# return nil.
|
135
140
|
def save(names, filename = nil, conn = Docker.connection)
|
136
|
-
# By using compare_by_identity we can create a Hash that has
|
137
|
-
# the same key multiple times.
|
138
|
-
query = {}
|
139
|
-
query.compare_by_identity
|
140
|
-
Array(names).each do |name|
|
141
|
-
query['names'.dup] = URI.encode(name)
|
142
|
-
end
|
143
|
-
|
144
141
|
if filename
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
:response_block => response_block_for_save(file)
|
149
|
-
)
|
150
|
-
file.close
|
142
|
+
File.open(filename, 'wb') do |file|
|
143
|
+
save_stream(names, {}, conn, &response_block_for_save(file))
|
144
|
+
end
|
151
145
|
nil
|
152
146
|
else
|
153
|
-
|
147
|
+
string = ''
|
148
|
+
save_stream(names, {}, conn, &response_block_for_save(string))
|
149
|
+
string
|
154
150
|
end
|
155
151
|
end
|
156
152
|
|
153
|
+
# Stream the contents of Docker image(s) to a block.
|
154
|
+
#
|
155
|
+
# @param names [String, Array#String] The image(s) you wish to save
|
156
|
+
# @param conn [Docker::Connection] The Docker connection to use
|
157
|
+
# @yield chunk [String] a chunk of the Docker image(s).
|
158
|
+
def save_stream(names, opts = {}, conn = Docker.connection, &block)
|
159
|
+
# By using compare_by_identity we can create a Hash that has
|
160
|
+
# the same key multiple times.
|
161
|
+
query = {}.tap(&:compare_by_identity)
|
162
|
+
Array(names).each { |name| query['names'.dup] = URI.encode(name) }
|
163
|
+
conn.get(
|
164
|
+
'/images/get',
|
165
|
+
query,
|
166
|
+
opts.merge(:response_block => block)
|
167
|
+
)
|
168
|
+
nil
|
169
|
+
end
|
170
|
+
|
171
|
+
# Load a tar Image
|
172
|
+
def load(tar, opts = {}, conn = Docker.connection, creds = nil, &block)
|
173
|
+
headers = build_headers(creds)
|
174
|
+
body = ""
|
175
|
+
f = File.open(tar,'rb')
|
176
|
+
conn.post(
|
177
|
+
'/images/load',
|
178
|
+
opts,
|
179
|
+
:headers => headers,
|
180
|
+
:response_block => response_block(body, &block)
|
181
|
+
) { f.read(Excon.defaults[:chunk_size]).to_s }
|
182
|
+
end
|
183
|
+
|
157
184
|
# Check if an image exists.
|
158
185
|
def exist?(id, opts = {}, conn = Docker.connection)
|
159
186
|
get(id, opts, conn)
|
data/lib/docker/version.rb
CHANGED
data/lib/docker/volume.rb
CHANGED
@@ -23,10 +23,8 @@ class Docker::Volume
|
|
23
23
|
# /volumes endpoint returns an array of hashes incapsulated in an Volumes tag
|
24
24
|
def all(opts = {}, conn = Docker.connection)
|
25
25
|
resp = conn.get('/volumes')
|
26
|
-
|
27
|
-
|
28
|
-
hashes = hashes['Volumes']
|
29
|
-
end
|
26
|
+
json = Docker::Util.parse_json(resp) || {}
|
27
|
+
hashes = json['Volumes'] || []
|
30
28
|
hashes.map { |hash| new(conn, hash) }
|
31
29
|
end
|
32
30
|
|
data/script/docker
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
set -e
|
3
|
+
|
4
|
+
### BEGIN INIT INFO
|
5
|
+
# Provides: docker
|
6
|
+
# Required-Start: $syslog $remote_fs
|
7
|
+
# Required-Stop: $syslog $remote_fs
|
8
|
+
# Should-Start: cgroupfs-mount cgroup-lite
|
9
|
+
# Should-Stop: cgroupfs-mount cgroup-lite
|
10
|
+
# Default-Start: 2 3 4 5
|
11
|
+
# Default-Stop: 0 1 6
|
12
|
+
# Short-Description: Create lightweight, portable, self-sufficient containers.
|
13
|
+
# Description:
|
14
|
+
# Docker is an open-source project to easily create lightweight, portable,
|
15
|
+
# self-sufficient containers from any application. The same container that a
|
16
|
+
# developer builds and tests on a laptop can run at scale, in production, on
|
17
|
+
# VMs, bare metal, OpenStack clusters, public clouds and more.
|
18
|
+
### END INIT INFO
|
19
|
+
|
20
|
+
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
|
21
|
+
|
22
|
+
BASE=$(basename $0)
|
23
|
+
|
24
|
+
# modify these in /etc/default/$BASE (/etc/default/docker)
|
25
|
+
DOCKER=/usr/bin/$BASE
|
26
|
+
# This is the pid file managed by docker itself
|
27
|
+
DOCKER_PIDFILE=/var/run/$BASE.pid
|
28
|
+
# This is the pid file created/managed by start-stop-daemon
|
29
|
+
DOCKER_SSD_PIDFILE=/var/run/$BASE-ssd.pid
|
30
|
+
DOCKER_LOGFILE=/var/log/$BASE.log
|
31
|
+
DOCKER_OPTS=
|
32
|
+
DOCKER_DESC="Docker"
|
33
|
+
|
34
|
+
# Get lsb functions
|
35
|
+
. /lib/lsb/init-functions
|
36
|
+
|
37
|
+
if [ -f /etc/default/$BASE ]; then
|
38
|
+
. /etc/default/$BASE
|
39
|
+
fi
|
40
|
+
|
41
|
+
# Check docker is present
|
42
|
+
if [ ! -x $DOCKER ]; then
|
43
|
+
log_failure_msg "$DOCKER not present or not executable"
|
44
|
+
exit 1
|
45
|
+
fi
|
46
|
+
|
47
|
+
check_init() {
|
48
|
+
# see also init_is_upstart in /lib/lsb/init-functions (which isn't available in Ubuntu 12.04, or we'd use it directly)
|
49
|
+
if [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | grep -q upstart; then
|
50
|
+
log_failure_msg "$DOCKER_DESC is managed via upstart, try using service $BASE $1"
|
51
|
+
exit 1
|
52
|
+
fi
|
53
|
+
}
|
54
|
+
|
55
|
+
fail_unless_root() {
|
56
|
+
if [ "$(id -u)" != '0' ]; then
|
57
|
+
log_failure_msg "$DOCKER_DESC must be run as root"
|
58
|
+
exit 1
|
59
|
+
fi
|
60
|
+
}
|
61
|
+
|
62
|
+
cgroupfs_mount() {
|
63
|
+
# see also https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount
|
64
|
+
if grep -v '^#' /etc/fstab | grep -q cgroup \
|
65
|
+
|| [ ! -e /proc/cgroups ] \
|
66
|
+
|| [ ! -d /sys/fs/cgroup ]; then
|
67
|
+
return
|
68
|
+
fi
|
69
|
+
if ! mountpoint -q /sys/fs/cgroup; then
|
70
|
+
mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
|
71
|
+
fi
|
72
|
+
(
|
73
|
+
cd /sys/fs/cgroup
|
74
|
+
for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
|
75
|
+
mkdir -p $sys
|
76
|
+
if ! mountpoint -q $sys; then
|
77
|
+
if ! mount -n -t cgroup -o $sys cgroup $sys; then
|
78
|
+
rmdir $sys || true
|
79
|
+
fi
|
80
|
+
fi
|
81
|
+
done
|
82
|
+
)
|
83
|
+
}
|
84
|
+
|
85
|
+
case "$1" in
|
86
|
+
start)
|
87
|
+
check_init
|
88
|
+
|
89
|
+
fail_unless_root
|
90
|
+
|
91
|
+
cgroupfs_mount
|
92
|
+
|
93
|
+
touch "$DOCKER_LOGFILE"
|
94
|
+
chgrp docker "$DOCKER_LOGFILE"
|
95
|
+
|
96
|
+
ulimit -n 1048576
|
97
|
+
if [ "$BASH" ]; then
|
98
|
+
ulimit -u 1048576
|
99
|
+
else
|
100
|
+
ulimit -p 1048576
|
101
|
+
fi
|
102
|
+
|
103
|
+
log_begin_msg "Starting $DOCKER_DESC: $BASE"
|
104
|
+
start-stop-daemon --start --background \
|
105
|
+
--no-close \
|
106
|
+
--exec "$DOCKER" \
|
107
|
+
--pidfile "$DOCKER_SSD_PIDFILE" \
|
108
|
+
--make-pidfile \
|
109
|
+
-- \
|
110
|
+
-d -p "$DOCKER_PIDFILE" \
|
111
|
+
$DOCKER_OPTS \
|
112
|
+
>> "$DOCKER_LOGFILE" 2>&1
|
113
|
+
log_end_msg $?
|
114
|
+
;;
|
115
|
+
|
116
|
+
stop)
|
117
|
+
check_init
|
118
|
+
fail_unless_root
|
119
|
+
log_begin_msg "Stopping $DOCKER_DESC: $BASE"
|
120
|
+
start-stop-daemon --stop --pidfile "$DOCKER_SSD_PIDFILE"
|
121
|
+
log_end_msg $?
|
122
|
+
;;
|
123
|
+
|
124
|
+
restart)
|
125
|
+
check_init
|
126
|
+
fail_unless_root
|
127
|
+
docker_pid=`cat "$DOCKER_SSD_PIDFILE" 2>/dev/null`
|
128
|
+
[ -n "$docker_pid" ] \
|
129
|
+
&& ps -p $docker_pid > /dev/null 2>&1 \
|
130
|
+
&& $0 stop
|
131
|
+
$0 start
|
132
|
+
;;
|
133
|
+
|
134
|
+
force-reload)
|
135
|
+
check_init
|
136
|
+
fail_unless_root
|
137
|
+
$0 restart
|
138
|
+
;;
|
139
|
+
|
140
|
+
status)
|
141
|
+
check_init
|
142
|
+
status_of_proc -p "$DOCKER_SSD_PIDFILE" "$DOCKER" "$DOCKER_DESC"
|
143
|
+
;;
|
144
|
+
|
145
|
+
*)
|
146
|
+
echo "Usage: service docker {start|stop|restart|status}"
|
147
|
+
exit 1
|
148
|
+
;;
|
149
|
+
esac
|
data/script/docker.conf
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
description "Docker daemon"
|
2
|
+
|
3
|
+
start on (local-filesystems and net-device-up IFACE!=lo)
|
4
|
+
stop on runlevel [!2345]
|
5
|
+
limit nofile 524288 1048576
|
6
|
+
limit nproc 524288 1048576
|
7
|
+
|
8
|
+
respawn
|
9
|
+
|
10
|
+
kill timeout 20
|
11
|
+
|
12
|
+
pre-start script
|
13
|
+
# see also https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount
|
14
|
+
if grep -v '^#' /etc/fstab | grep -q cgroup \
|
15
|
+
|| [ ! -e /proc/cgroups ] \
|
16
|
+
|| [ ! -d /sys/fs/cgroup ]; then
|
17
|
+
exit 0
|
18
|
+
fi
|
19
|
+
if ! mountpoint -q /sys/fs/cgroup; then
|
20
|
+
mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
|
21
|
+
fi
|
22
|
+
(
|
23
|
+
cd /sys/fs/cgroup
|
24
|
+
for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
|
25
|
+
mkdir -p $sys
|
26
|
+
if ! mountpoint -q $sys; then
|
27
|
+
if ! mount -n -t cgroup -o $sys cgroup $sys; then
|
28
|
+
rmdir $sys || true
|
29
|
+
fi
|
30
|
+
fi
|
31
|
+
done
|
32
|
+
)
|
33
|
+
end script
|
34
|
+
|
35
|
+
script
|
36
|
+
# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
|
37
|
+
DOCKER=/usr/bin/$UPSTART_JOB
|
38
|
+
DOCKER_OPTS=
|
39
|
+
if [ -f /etc/default/$UPSTART_JOB ]; then
|
40
|
+
. /etc/default/$UPSTART_JOB
|
41
|
+
fi
|
42
|
+
exec "$DOCKER" -d $DOCKER_OPTS
|
43
|
+
end script
|
44
|
+
|
45
|
+
# Don't emit "started" event until docker.sock is ready.
|
46
|
+
# See https://github.com/docker/docker/issues/6647
|
47
|
+
post-start script
|
48
|
+
DOCKER_OPTS=
|
49
|
+
if [ -f /etc/default/$UPSTART_JOB ]; then
|
50
|
+
. /etc/default/$UPSTART_JOB
|
51
|
+
fi
|
52
|
+
if ! printf "%s" "$DOCKER_OPTS" | grep -qE -e '-H|--host'; then
|
53
|
+
while ! [ -e /var/run/docker.sock ]; do
|
54
|
+
initctl status $UPSTART_JOB | grep -qE "(stop|respawn)/" && exit 1
|
55
|
+
echo "Waiting for /var/run/docker.sock"
|
56
|
+
sleep 0.1
|
57
|
+
done
|
58
|
+
echo "/var/run/docker.sock is up"
|
59
|
+
fi
|
60
|
+
end script
|
61
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -x
|
3
|
+
set -e
|
4
|
+
|
5
|
+
# argv[0]
|
6
|
+
DOCKER_VERSION=$1
|
7
|
+
|
8
|
+
# disable travis default installation
|
9
|
+
service docker stop
|
10
|
+
apt-get -y --purge remove docker-engine
|
11
|
+
|
12
|
+
# install gpg key for docker rpo
|
13
|
+
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv 58118E89F3A912897C070ADBF76221572C52609D
|
14
|
+
|
15
|
+
# enable docker repo
|
16
|
+
echo 'deb "https://apt.dockerproject.org/repo" ubuntu-trusty main' >> /etc/apt/sources.list.d/docker-main.list
|
17
|
+
apt-get update -o Dir::Etc::sourcelist='sources.list.d/docker-main.list' -o Dir::Etc::sourceparts='-' -o APT::Get::List-Cleanup='0'
|
18
|
+
apt-cache gencaches
|
19
|
+
|
20
|
+
# install package
|
21
|
+
apt-get -y --force-yes install docker-engine=${DOCKER_VERSION}-0~trusty
|
22
|
+
echo 'DOCKER_OPTS="-H unix:///var/run/docker.sock --pidfile=/var/run/docker.pid"' > /etc/default/docker
|
23
|
+
cat /etc/default/docker
|
24
|
+
|
25
|
+
# docker 1.6 packages did not come with init files
|
26
|
+
if [[ $DOCKER_VERSION == 1.6.* ]]
|
27
|
+
then
|
28
|
+
cp script/docker.conf /etc/init/docker.conf
|
29
|
+
cp script/docker /etc/init.d/docker
|
30
|
+
chmod +x /etc/init.d/docker
|
31
|
+
else
|
32
|
+
service docker stop
|
33
|
+
fi
|
34
|
+
|
35
|
+
service docker start
|
data/spec/docker/exec_spec.rb
CHANGED
@@ -133,13 +133,17 @@ describe Docker::Exec do
|
|
133
133
|
after { container.kill!.remove }
|
134
134
|
|
135
135
|
it 'returns empty stdout/stderr messages with exitcode' do
|
136
|
-
expect(subject.start!(:detach => true)).to eq(
|
136
|
+
expect(subject.start!(:detach => true).length).to eq(3)
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
140
|
context 'when :wait set long time value' do
|
141
141
|
subject {
|
142
|
-
described_class.create(
|
142
|
+
described_class.create(
|
143
|
+
'Container' => container.id,
|
144
|
+
'AttachStdout' => true,
|
145
|
+
'Cmd' => %w[true]
|
146
|
+
)
|
143
147
|
}
|
144
148
|
after { container.kill!.remove }
|
145
149
|
|
data/spec/docker/image_spec.rb
CHANGED
@@ -269,6 +269,28 @@ describe Docker::Image do
|
|
269
269
|
end
|
270
270
|
end
|
271
271
|
|
272
|
+
describe '#save_stream' do
|
273
|
+
let(:image) { Docker::Image.get('busybox') }
|
274
|
+
let(:block) { proc { |chunk| puts chunk } }
|
275
|
+
|
276
|
+
it 'calls the class method' do
|
277
|
+
expect(Docker::Image).to receive(:save_stream)
|
278
|
+
.with(image.id, instance_of(Hash), instance_of(Docker::Connection))
|
279
|
+
image.save_stream(:chunk_size => 1024 * 1024, &block)
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
describe '#load' do
|
284
|
+
include_context "local paths"
|
285
|
+
let(:file) { File.join(project_dir, 'spec', 'fixtures', 'load.tar') }
|
286
|
+
context 'test image upload' do
|
287
|
+
it 'load tianon/true image' do
|
288
|
+
result = Docker::Image.load(file)
|
289
|
+
expect(result).to eq("")
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
272
294
|
describe '#refresh!' do
|
273
295
|
let(:image) { Docker::Image.create('fromImage' => 'debian:wheezy') }
|
274
296
|
|
@@ -311,7 +333,7 @@ describe Docker::Image do
|
|
311
333
|
it 'sets the id and sends Docker.creds' do
|
312
334
|
allow(Docker).to receive(:creds).and_return(creds)
|
313
335
|
expect(image).to be_a Docker::Image
|
314
|
-
expect(image.id).to match(/\A[a-fA-F0-9]+\Z/)
|
336
|
+
expect(image.id).to match(/\A(sha256:)?[a-fA-F0-9]+\Z/)
|
315
337
|
expect(image.id).to_not include('base')
|
316
338
|
expect(image.id).to_not be_nil
|
317
339
|
expect(image.id).to_not be_empty
|
@@ -387,6 +409,30 @@ describe Docker::Image do
|
|
387
409
|
end
|
388
410
|
end
|
389
411
|
|
412
|
+
describe '.save_stream' do
|
413
|
+
let(:image) { 'busybox:latest' }
|
414
|
+
let(:non_streamed) do
|
415
|
+
Docker.connection.get(
|
416
|
+
'/images/get',
|
417
|
+
'names' => URI.encode(image)
|
418
|
+
)
|
419
|
+
end
|
420
|
+
let(:streamed) { '' }
|
421
|
+
let(:tar_files) do
|
422
|
+
proc do |string|
|
423
|
+
Gem::Package::TarReader
|
424
|
+
.new(StringIO.new(string, 'rb'))
|
425
|
+
.map(&:full_name)
|
426
|
+
.sort
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
it 'yields each chunk of the image' do
|
431
|
+
Docker::Image.save_stream(image) { |chunk| streamed << chunk }
|
432
|
+
expect(tar_files.call(streamed)).to eq(tar_files.call(non_streamed))
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
390
436
|
describe '.exist?' do
|
391
437
|
subject { described_class }
|
392
438
|
let(:exists) { subject.exist?(image_name) }
|
data/spec/docker/volume_spec.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
# Volume requests are actually slow enough to occasionally not work
|
4
|
+
# Use sleep statements to manage that
|
3
5
|
describe Docker::Volume, :docker_1_9 do
|
4
6
|
let(:name) { "ArbitraryNameForTheRakeTestVolume" }
|
5
7
|
|
@@ -16,7 +18,7 @@ describe Docker::Volume, :docker_1_9 do
|
|
16
18
|
describe '.get' do
|
17
19
|
let(:volume) { Docker::Volume.get(name) }
|
18
20
|
|
19
|
-
before { Docker::Volume.create(name) }
|
21
|
+
before { Docker::Volume.create(name); sleep 1 }
|
20
22
|
after { volume.remove }
|
21
23
|
|
22
24
|
it 'gets volume details' do
|
@@ -29,13 +31,14 @@ describe Docker::Volume, :docker_1_9 do
|
|
29
31
|
after { Docker::Volume.get(name).remove }
|
30
32
|
|
31
33
|
it 'gets a list of volumes' do
|
32
|
-
expect { Docker::Volume.create(name) }.to change { Docker::Volume.all.length }.by(1)
|
34
|
+
expect { Docker::Volume.create(name); sleep 1 }.to change { Docker::Volume.all.length }.by(1)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
38
|
describe '#remove' do
|
37
39
|
it 'removes a volume' do
|
38
40
|
volume = Docker::Volume.create(name)
|
41
|
+
sleep 1
|
39
42
|
expect { volume.remove }.to change { Docker::Volume.all.length }.by(-1)
|
40
43
|
end
|
41
44
|
end
|
data/spec/docker_spec.rb
CHANGED
@@ -183,6 +183,16 @@ describe Docker do
|
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
+
describe '#ping' do
|
187
|
+
before { Docker.reset! }
|
188
|
+
|
189
|
+
let(:ping) { subject.ping}
|
190
|
+
|
191
|
+
it 'returns the status as a String' do
|
192
|
+
expect(ping).to eq('OK')
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
186
196
|
describe '#authenticate!' do
|
187
197
|
subject { described_class }
|
188
198
|
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.27.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Swipely, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -188,7 +188,9 @@ files:
|
|
188
188
|
- lib/docker/version.rb
|
189
189
|
- lib/docker/volume.rb
|
190
190
|
- lib/excon/middlewares/hijack.rb
|
191
|
-
- script/
|
191
|
+
- script/docker
|
192
|
+
- script/docker.conf
|
193
|
+
- script/install_docker.sh
|
192
194
|
- spec/docker/connection_spec.rb
|
193
195
|
- spec/docker/container_spec.rb
|
194
196
|
- spec/docker/event_spec.rb
|
@@ -202,6 +204,7 @@ files:
|
|
202
204
|
- spec/docker_spec.rb
|
203
205
|
- spec/fixtures/build_from_dir/Dockerfile
|
204
206
|
- spec/fixtures/export.tar
|
207
|
+
- spec/fixtures/load.tar
|
205
208
|
- spec/fixtures/top/Dockerfile
|
206
209
|
- spec/spec_helper.rb
|
207
210
|
homepage: https://github.com/swipely/docker-api
|
@@ -242,6 +245,7 @@ test_files:
|
|
242
245
|
- spec/docker_spec.rb
|
243
246
|
- spec/fixtures/build_from_dir/Dockerfile
|
244
247
|
- spec/fixtures/export.tar
|
248
|
+
- spec/fixtures/load.tar
|
245
249
|
- spec/fixtures/top/Dockerfile
|
246
250
|
- spec/spec_helper.rb
|
247
251
|
has_rdoc:
|
@@ -1,23 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
set -e
|
3
|
-
|
4
|
-
# Update bundler
|
5
|
-
gem install bundler
|
6
|
-
|
7
|
-
# Install docker
|
8
|
-
sudo mkdir -p /opt/docker
|
9
|
-
sudo curl -fo /opt/docker/docker "https://get.docker.com/builds/Linux/x86_64/docker-${DOCKER_VERSION}"
|
10
|
-
sudo chmod +x /opt/docker/docker
|
11
|
-
|
12
|
-
running=0
|
13
|
-
for x in {1..3}
|
14
|
-
do
|
15
|
-
[[ $running != 1 ]] || break
|
16
|
-
sudo rm -rf /var/run/docker.pid
|
17
|
-
sudo /opt/docker/docker -d -D &
|
18
|
-
DOCKER_PID=$!
|
19
|
-
sleep 5
|
20
|
-
echo "Checking if docker is running"
|
21
|
-
ps -p $DOCKER_PID && running=1 || echo "Couldn't start docker, retrying"
|
22
|
-
done
|
23
|
-
echo "Docker running, continuing"
|