docker 0.3.2 → 0.4.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/.gitignore +55 -0
- data/dev.Dockerfile +30 -0
- data/docker-compose.yml +26 -0
- data/docker.gemspec +2 -2
- data/lib/docker.rb +1 -0
- data/lib/docker/cli.rb +62 -0
- data/lib/docker/session.rb +25 -5
- data/lib/docker/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eab088e132fb6bb2bec9c3ab6d381a6ff2cd488e
|
4
|
+
data.tar.gz: 9e450fce4107d32904575463018de7276be29a14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31799d1342835cbaf275cd92ff4cb43b986e79f41038b2f4ce2ec85871ecded5c4246aa262005abdb079a14efdec721d54af252195cdc8e745577f96da2978e0
|
7
|
+
data.tar.gz: feb853dbbef941bd06d46e6f71b1e00ee63886994c5e68a6b3175c30479404ce1c74ff1036e51a177314688be47b3ca9b56c201fd6a8499757dc6d306f5f05c0
|
data/.gitignore
CHANGED
@@ -9,3 +9,58 @@
|
|
9
9
|
/tmp/
|
10
10
|
/.idea
|
11
11
|
|
12
|
+
*.gem
|
13
|
+
*.rbc
|
14
|
+
/.config
|
15
|
+
/InstalledFiles
|
16
|
+
/pkg/
|
17
|
+
/spec/reports/
|
18
|
+
/spec/examples.txt
|
19
|
+
/test/tmp/
|
20
|
+
/test/version_tmp/
|
21
|
+
/tmp/
|
22
|
+
|
23
|
+
# Used by dotenv library to load environment variables.
|
24
|
+
# .env
|
25
|
+
|
26
|
+
## Specific to RubyMotion:
|
27
|
+
.dat*
|
28
|
+
.repl_history
|
29
|
+
build/
|
30
|
+
*.bridgesupport
|
31
|
+
build-iPhoneOS/
|
32
|
+
build-iPhoneSimulator/
|
33
|
+
|
34
|
+
# Ignore Byebug/Bash/etc command history file.
|
35
|
+
/.*_hist*
|
36
|
+
|
37
|
+
# Ignore mac .DS_Store files
|
38
|
+
.DS_Store
|
39
|
+
|
40
|
+
## Specific to RubyMotion (use of CocoaPods):
|
41
|
+
#
|
42
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
43
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
44
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
45
|
+
#
|
46
|
+
# vendor/Pods/
|
47
|
+
|
48
|
+
## Documentation cache and generated files:
|
49
|
+
/.yardoc/
|
50
|
+
/_yardoc/
|
51
|
+
/doc/
|
52
|
+
/rdoc/
|
53
|
+
|
54
|
+
## Environment normalization:
|
55
|
+
/.bundle/
|
56
|
+
/vendor/bundle
|
57
|
+
/lib/bundler/man/
|
58
|
+
|
59
|
+
# for a library or gem, you might want to ignore these files since the code is
|
60
|
+
# intended to run in multiple environments; otherwise, check them in:
|
61
|
+
Gemfile.lock
|
62
|
+
.ruby-version
|
63
|
+
.ruby-gemset
|
64
|
+
|
65
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
66
|
+
.rvmrc
|
data/dev.Dockerfile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# 1: Use ruby 2.3.3 as base:
|
2
|
+
FROM ruby:2.3.3
|
3
|
+
|
4
|
+
# 2: We'll set this gem path as the working directory
|
5
|
+
WORKDIR /usr/src/lib
|
6
|
+
|
7
|
+
# 3: We'll set the working dir as HOME and add the app's binaries path to $PATH:
|
8
|
+
ENV HOME=/usr/src/lib PATH=/usr/src/lib/bin:$PATH
|
9
|
+
|
10
|
+
# 4: Install docker - we'll need the client to run docker commands on the host engine, by mounting
|
11
|
+
# the host docker service's socket.
|
12
|
+
# Ripped off from https://hub.docker.com/_/docker Dockerfiles:
|
13
|
+
RUN set -ex && \
|
14
|
+
export DOCKER_BUCKET=get.docker.com && \
|
15
|
+
export DOCKER_VERSION=17.03.1-ce && \
|
16
|
+
export DOCKER_SHA256=820d13b5699b5df63f7032c8517a5f118a44e2be548dd03271a86656a544af55 && \
|
17
|
+
curl -fSL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz && \
|
18
|
+
echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - && \
|
19
|
+
tar -xzvf docker.tgz && \
|
20
|
+
mv docker/* /usr/local/bin/ && \
|
21
|
+
rmdir docker && \
|
22
|
+
rm docker.tgz
|
23
|
+
|
24
|
+
# 5: Install required gems:
|
25
|
+
ADD Gemfile docker.gemspec /usr/src/lib/
|
26
|
+
ADD lib/docker/version.rb /usr/src/lib/lib/docker/
|
27
|
+
RUN gem install guard && bundle install
|
28
|
+
|
29
|
+
# 6: Set the default command:
|
30
|
+
CMD ["guard"]
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
version: '2.1'
|
2
|
+
|
3
|
+
services:
|
4
|
+
|
5
|
+
lib:
|
6
|
+
image: xeger/docker-gem:development
|
7
|
+
build:
|
8
|
+
context: .
|
9
|
+
dockerfile: dev.Dockerfile
|
10
|
+
|
11
|
+
volumes:
|
12
|
+
# Mount our app code directory (".") into our app containers at the `/usr/src/lib` folder:
|
13
|
+
- .:/usr/src/lib
|
14
|
+
|
15
|
+
# Add the docker socket to enable docker in docker:
|
16
|
+
- /var/run/docker.sock:/var/run/docker.sock
|
17
|
+
|
18
|
+
# Keep the stdin open, so we can attach to our app container's process
|
19
|
+
# and do things such as byebug, etc:
|
20
|
+
stdin_open: true
|
21
|
+
|
22
|
+
# Enable sending signals (CTRL+C, CTRL+P + CTRL+Q) into the container:
|
23
|
+
tty: true
|
24
|
+
|
25
|
+
# The command:
|
26
|
+
command: guard
|
data/docker.gemspec
CHANGED
@@ -14,12 +14,12 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.homepage = "https://github.com/xeger/docker"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|dev\.Dockerfile|docker-compose.yml)/}) }
|
18
18
|
spec.bindir = "exe"
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "backticks", "~> 0.
|
22
|
+
spec.add_dependency "backticks", "~> 1.0.0"
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.10"
|
25
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
data/lib/docker.rb
CHANGED
data/lib/docker/cli.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Docker
|
2
|
+
# Docker command-line parameter generator.
|
3
|
+
# This is a modified version of Backticks::CLI::Getopt, made specially for converting ruby objects
|
4
|
+
# into Docker CLI opts.
|
5
|
+
module CLI
|
6
|
+
# Translate a series Ruby positional and keyword arguments into Docker command-
|
7
|
+
# parameters consisting of words and options.
|
8
|
+
#
|
9
|
+
# Each positional argument can be a Hash, an Array, or another object.
|
10
|
+
# They are handled as follows:
|
11
|
+
# - Hash is translated to a sequence of options; see #options
|
12
|
+
# - Array is appended to the command line as a sequence of words
|
13
|
+
# - other objects are turned into a string with #to_s and appended to the command line as a
|
14
|
+
# single word
|
15
|
+
#
|
16
|
+
# @return [Array] list of String words and options
|
17
|
+
#
|
18
|
+
# @example recursively find all text files
|
19
|
+
# parameters('docker', 'run', 'hello_world')
|
20
|
+
#
|
21
|
+
# @example run & remove docker hello world
|
22
|
+
# parameters('docker', 'run', rm: true, 'hello_world')
|
23
|
+
module Getopt
|
24
|
+
def self.parameters(*sugar)
|
25
|
+
sugar.each_with_object [] do |item, argv|
|
26
|
+
argv.concat extract_parameter(item)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.extract_parameter(item)
|
31
|
+
return item.map(&:to_s) if item.is_a? Array
|
32
|
+
return options(item) if item.is_a? Hash
|
33
|
+
[item.to_s]
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.options(kwargs = {})
|
37
|
+
# Transform opts into golang flags-style command line parameters;
|
38
|
+
# append them to the command.
|
39
|
+
kwargs.map { |kw, arg| convert_option kw, arg }.compact.flatten
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.convert_option(option_name, option_value)
|
43
|
+
flag = (option_name.length == 1) ? "-#{option_name}" : "--#{option_name}"
|
44
|
+
return [flag] if option_value == true
|
45
|
+
return process_list_option flag, option_value if option_value.is_a? Array
|
46
|
+
return process_non_null_option flag, option_value if option_value
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.process_list_option(flag, option_value)
|
50
|
+
option_value.map do |value_item|
|
51
|
+
process_non_null_option flag, value_item if value_item
|
52
|
+
end.compact.flatten
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.process_non_null_option(flag, option_value)
|
56
|
+
is_long_flag = flag[0..1] == '--'
|
57
|
+
return "#{flag}=#{option_value}" if is_long_flag
|
58
|
+
[flag, option_value.to_s]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/docker/session.rb
CHANGED
@@ -23,7 +23,7 @@ module Docker
|
|
23
23
|
# Hint that we are able to parse ps output
|
24
24
|
PS_HEADER = /ID\s+IMAGE\s+COMMAND\s+CREATED\s+STATUS\s+PORTS\s+NAMES$/
|
25
25
|
|
26
|
-
def initialize(shell=Backticks::Runner.new, host:ENV['DOCKER_HOST'])
|
26
|
+
def initialize(shell=Backticks::Runner.new(cli: Docker::CLI::Getopt), host:ENV['DOCKER_HOST'])
|
27
27
|
@host = host
|
28
28
|
@shell = shell
|
29
29
|
end
|
@@ -71,6 +71,19 @@ module Docker
|
|
71
71
|
# @example open a busybox shell
|
72
72
|
# session.run('busybox', '/bin/sh', tty:true, interactive:true)
|
73
73
|
#
|
74
|
+
# @example open busybox and remove vowels from user input
|
75
|
+
# session.run('busybox', '/bin/sh', tty:true, interactive:true) do |stream, data|
|
76
|
+
# if [:stdout, :stderr].include?(stream)
|
77
|
+
# puts data
|
78
|
+
# else
|
79
|
+
# data.gsub(/[aeiouy]/, '')
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# @yield [stream, data] intercepts container I/O and passes it to the block
|
84
|
+
# @yieldparam [Symbol] stream :stdin, :stdout or :stderr
|
85
|
+
# @yieldparam [String] data the intercepted stream activity
|
86
|
+
#
|
74
87
|
# @param [String] image id or name of base image to use for container
|
75
88
|
# @param [Array] command_and_args optional command to run in container
|
76
89
|
# @param [Integer] cpu_period scheduler period (μs)
|
@@ -113,7 +126,7 @@ module Docker
|
|
113
126
|
tty:false,
|
114
127
|
user:nil,
|
115
128
|
volume:[],
|
116
|
-
volumes_from:nil)
|
129
|
+
volumes_from:nil, &block)
|
117
130
|
|
118
131
|
cmd = []
|
119
132
|
|
@@ -137,7 +150,7 @@ module Docker
|
|
137
150
|
cmd.concat(command_and_args)
|
138
151
|
|
139
152
|
# return the output of `docker run` minus extra whitespace
|
140
|
-
run!('run', *cmd).strip
|
153
|
+
run!('run', *cmd, &block).strip
|
141
154
|
end
|
142
155
|
|
143
156
|
# Remove a container.
|
@@ -195,13 +208,20 @@ module Docker
|
|
195
208
|
# Run a docker command without validating that the CLI parameters
|
196
209
|
# make sense. Prepend implicit options if suitable.
|
197
210
|
#
|
211
|
+
# @yield [stream, data] intercepts command I/O and passes it to the block
|
212
|
+
# @yieldparam [Symbol] stream :stdin, :stdout or :stderr
|
213
|
+
# @yieldparam [String] data the intercepted stream activity
|
214
|
+
#
|
198
215
|
# @param [Array] args command-line arguments in the format accepted by
|
199
216
|
# Backticks::Runner#command
|
200
217
|
# @return [String] output of the command
|
201
218
|
# @raise [RuntimeError] if command fails
|
202
|
-
def run!(*args)
|
219
|
+
def run!(*args, &block)
|
203
220
|
# STDERR.puts "+ " + (['docker'] + args).inspect
|
204
|
-
cmd = @shell.run('docker', *args)
|
221
|
+
cmd = @shell.run('docker', *args)
|
222
|
+
cmd.tap(&block) if block_given?
|
223
|
+
cmd.join
|
224
|
+
|
205
225
|
status, out, err = cmd.status, cmd.captured_output, cmd.captured_error
|
206
226
|
status.success? || raise(Error.new(args.first, status, err))
|
207
227
|
out
|
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.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Spataro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backticks
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,9 +85,12 @@ files:
|
|
85
85
|
- Rakefile
|
86
86
|
- bin/console
|
87
87
|
- bin/setup
|
88
|
+
- dev.Dockerfile
|
89
|
+
- docker-compose.yml
|
88
90
|
- docker.gemspec
|
89
91
|
- lib/docker.rb
|
90
92
|
- lib/docker/asset.rb
|
93
|
+
- lib/docker/cli.rb
|
91
94
|
- lib/docker/container.rb
|
92
95
|
- lib/docker/error.rb
|
93
96
|
- lib/docker/session.rb
|