dry-dock 0.1.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 +7 -0
- data/.dockerignore +6 -0
- data/.pryrc +1 -0
- data/.rspec +2 -0
- data/Dockerfile +69 -0
- data/Gemfile +20 -0
- data/Gemfile.lock +102 -0
- data/LICENSE +22 -0
- data/README.md +75 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/bin/drydock +45 -0
- data/bin/json-test-consumer.rb +11 -0
- data/bin/json-test-producer.rb +25 -0
- data/bin/test-tar-writer-digest.rb +27 -0
- data/dry-dock.gemspec +135 -0
- data/examples/ruby-dsl.rb +14 -0
- data/examples/ruby-node-app-dsl.rb +128 -0
- data/examples/test-dsl.rb +9 -0
- data/examples/test.rb +46 -0
- data/lib/drydock/cli_flags.rb +46 -0
- data/lib/drydock/container_config.rb +75 -0
- data/lib/drydock/docker_api_patch.rb +176 -0
- data/lib/drydock/drydock.rb +65 -0
- data/lib/drydock/errors.rb +6 -0
- data/lib/drydock/file_manager.rb +26 -0
- data/lib/drydock/formatters.rb +13 -0
- data/lib/drydock/ignorefile_definition.rb +61 -0
- data/lib/drydock/image_repository.rb +50 -0
- data/lib/drydock/logger.rb +61 -0
- data/lib/drydock/object_caches/base.rb +24 -0
- data/lib/drydock/object_caches/filesystem_cache.rb +88 -0
- data/lib/drydock/object_caches/in_memory_cache.rb +52 -0
- data/lib/drydock/object_caches/no_cache.rb +38 -0
- data/lib/drydock/phase.rb +50 -0
- data/lib/drydock/phase_chain.rb +233 -0
- data/lib/drydock/plugins/apk.rb +31 -0
- data/lib/drydock/plugins/base.rb +15 -0
- data/lib/drydock/plugins/npm.rb +16 -0
- data/lib/drydock/plugins/package_manager.rb +30 -0
- data/lib/drydock/plugins/rubygems.rb +30 -0
- data/lib/drydock/project.rb +427 -0
- data/lib/drydock/runtime_options.rb +79 -0
- data/lib/drydock/stream_monitor.rb +54 -0
- data/lib/drydock/tar_writer.rb +36 -0
- data/lib/drydock.rb +35 -0
- data/spec/assets/MANIFEST +4 -0
- data/spec/assets/hello-world.txt +1 -0
- data/spec/assets/sample.tar +0 -0
- data/spec/assets/test.sh +3 -0
- data/spec/drydock/cli_flags_spec.rb +38 -0
- data/spec/drydock/container_config_spec.rb +230 -0
- data/spec/drydock/docker_api_patch_spec.rb +103 -0
- data/spec/drydock/drydock_spec.rb +25 -0
- data/spec/drydock/file_manager_spec.rb +53 -0
- data/spec/drydock/formatters_spec.rb +26 -0
- data/spec/drydock/ignorefile_definition_spec.rb +123 -0
- data/spec/drydock/image_repository_spec.rb +54 -0
- data/spec/drydock/object_caches/base_spec.rb +28 -0
- data/spec/drydock/object_caches/filesystem_cache_spec.rb +48 -0
- data/spec/drydock/object_caches/no_cache_spec.rb +62 -0
- data/spec/drydock/phase_chain_spec.rb +118 -0
- data/spec/drydock/phase_spec.rb +67 -0
- data/spec/drydock/plugins/apk_spec.rb +49 -0
- data/spec/drydock/plugins/base_spec.rb +13 -0
- data/spec/drydock/plugins/npm_spec.rb +26 -0
- data/spec/drydock/plugins/package_manager_spec.rb +12 -0
- data/spec/drydock/plugins/rubygems_spec.rb +53 -0
- data/spec/drydock/project_import_spec.rb +39 -0
- data/spec/drydock/project_spec.rb +156 -0
- data/spec/drydock/runtime_options_spec.rb +31 -0
- data/spec/drydock/stream_monitor_spec.rb +41 -0
- data/spec/drydock/tar_writer_spec.rb +27 -0
- data/spec/spec_helper.rb +47 -0
- data/spec/support/shared_examples/base_class.rb +3 -0
- data/spec/support/shared_examples/container_config.rb +12 -0
- data/spec/support/shared_examples/drydockfile.rb +6 -0
- metadata +223 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7ae72734cb29ba338e59b30a6e20eab3b97d3871
|
4
|
+
data.tar.gz: d7b6a777e09a3118f47aad70cc5a28c52e484d73
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 418c2516346a52be4c91f4d7b0ffcd666d2be264d52e9d536088ad4bb4ce71d4335dc577a982f0592624ef7730fc95674ba8fbd2301cdf18fd7729f25e084762
|
7
|
+
data.tar.gz: 6369d9384d4e0d9d65a49029f4b385191d41a3a7547c3c68b2f673a01c978df75e1167b6837623d9bbdef0a42572a3500c28b66bd515c2bf751ca1ff8793c9e5
|
data/.dockerignore
ADDED
data/.pryrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'lib/drydock'
|
data/.rspec
ADDED
data/Dockerfile
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
# Dockerfile
|
2
|
+
# image: ripta/drydock:v1.0
|
3
|
+
# repo: https://github.com/ripta/drydock.git
|
4
|
+
|
5
|
+
FROM gliderlabs/alpine:3.2
|
6
|
+
MAINTAINER Ripta Pasay <ripta+docker@pasay.name>
|
7
|
+
|
8
|
+
LABEL meta.version="1.0" meta.onbuild=true
|
9
|
+
|
10
|
+
RUN apk update
|
11
|
+
|
12
|
+
# Install the base and dev packages
|
13
|
+
RUN apk add ruby ruby-dev \
|
14
|
+
&& apk add nodejs nodejs-dev
|
15
|
+
|
16
|
+
# Install the headers and build packages
|
17
|
+
RUN apk add musl musl-dev \
|
18
|
+
&& apk add linux-headers \
|
19
|
+
&& apk add gcc g++ \
|
20
|
+
&& apk add make \
|
21
|
+
&& apk add curl curl-dev \
|
22
|
+
&& apk add openssh
|
23
|
+
|
24
|
+
RUN apk add libffi-dev libxml2-dev libxslt-dev
|
25
|
+
|
26
|
+
RUN apk add git
|
27
|
+
|
28
|
+
RUN curl -sL -o /bin/gosu https://github.com/tianon/gosu/releases/download/1.3/gosu-amd64 \
|
29
|
+
&& chmod +x /bin/gosu
|
30
|
+
|
31
|
+
# This is needed due to the missing trust certificates in alpine linux
|
32
|
+
RUN gem source --add https://s3.amazonaws.com/production.s3.rubygems.org/ \
|
33
|
+
&& gem source --remove https://rubygems.org/
|
34
|
+
|
35
|
+
# Update to the latest rubygems and install bundler
|
36
|
+
RUN gem update --system --no-document \
|
37
|
+
&& gem install --no-document bundler \
|
38
|
+
&& gem install --no-document unicorn
|
39
|
+
|
40
|
+
# Throw build errors if Gemfile has been modified without updating Gemfile.lock
|
41
|
+
RUN bundle config --global frozen 1 \
|
42
|
+
&& bundle config --global build.nokogiri --use-system-libraries
|
43
|
+
|
44
|
+
# Install bower and gulp
|
45
|
+
RUN npm install -g bower gulp
|
46
|
+
|
47
|
+
# Prepare global environment variables
|
48
|
+
ENV APPLICATION_ROOT /app/
|
49
|
+
RUN mkdir ${APPLICATION_ROOT}
|
50
|
+
WORKDIR ${APPLICATION_ROOT}
|
51
|
+
|
52
|
+
# Build rubygem dependencies
|
53
|
+
ONBUILD COPY Gemfile ${APPLICATION_ROOT}
|
54
|
+
ONBUILD COPY Gemfile.lock ${APPLICATION_ROOT}
|
55
|
+
ONBUILD RUN bundle --path vendor
|
56
|
+
|
57
|
+
# Build npm dependencies
|
58
|
+
ONBUILD COPY package.json ${APPLICATION_ROOT}/package.json
|
59
|
+
ONBUILD RUN cd ${APPLICATION_ROOT} && npm install
|
60
|
+
|
61
|
+
# Copy the application source in
|
62
|
+
ONBUILD COPY . ${APPLICATION_ROOT}
|
63
|
+
|
64
|
+
# Clean up build tools
|
65
|
+
ONBUILD RUN apk del libffi-dev libxml2-dev libxslt-dev curl-dev \
|
66
|
+
&& apk del gcc g++ make musl-dev \
|
67
|
+
&& apk del nodejs-dev ruby-dev
|
68
|
+
ONBUILD RUN rm -rf /var/cache/apk/*
|
69
|
+
|
data/Gemfile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
source 'https://rubygems.org'
|
3
|
+
|
4
|
+
group :development do
|
5
|
+
gem 'rake', '~> 10.0'
|
6
|
+
gem 'jeweler', '~> 2.0'
|
7
|
+
gem 'pry', '~> 0.10'
|
8
|
+
|
9
|
+
gem 'simplecov', '~> 0.9'
|
10
|
+
gem 'simplecov-rcov', '~> 0.2'
|
11
|
+
end
|
12
|
+
|
13
|
+
group :test do
|
14
|
+
gem 'rspec', '~> 3.0'
|
15
|
+
gem 'rspec-collection_matchers'
|
16
|
+
gem 'fakefs', require: false
|
17
|
+
end
|
18
|
+
|
19
|
+
gem 'docker-api', '~> 1.22', require: 'docker'
|
20
|
+
gem 'excon', '~> 0.45'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.3.8)
|
5
|
+
builder (3.2.2)
|
6
|
+
coderay (1.1.0)
|
7
|
+
descendants_tracker (0.0.4)
|
8
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
9
|
+
diff-lcs (1.2.5)
|
10
|
+
docile (1.1.5)
|
11
|
+
docker-api (1.22.4)
|
12
|
+
excon (>= 0.38.0)
|
13
|
+
json
|
14
|
+
excon (0.45.4)
|
15
|
+
fakefs (0.6.7)
|
16
|
+
faraday (0.9.1)
|
17
|
+
multipart-post (>= 1.2, < 3)
|
18
|
+
git (1.2.9.1)
|
19
|
+
github_api (0.12.4)
|
20
|
+
addressable (~> 2.3)
|
21
|
+
descendants_tracker (~> 0.0.4)
|
22
|
+
faraday (~> 0.8, < 0.10)
|
23
|
+
hashie (>= 3.4)
|
24
|
+
multi_json (>= 1.7.5, < 2.0)
|
25
|
+
nokogiri (~> 1.6.6)
|
26
|
+
oauth2
|
27
|
+
hashie (3.4.2)
|
28
|
+
highline (1.7.3)
|
29
|
+
jeweler (2.0.1)
|
30
|
+
builder
|
31
|
+
bundler (>= 1.0)
|
32
|
+
git (>= 1.2.5)
|
33
|
+
github_api
|
34
|
+
highline (>= 1.6.15)
|
35
|
+
nokogiri (>= 1.5.10)
|
36
|
+
rake
|
37
|
+
rdoc
|
38
|
+
json (1.8.3)
|
39
|
+
jwt (1.5.1)
|
40
|
+
method_source (0.8.2)
|
41
|
+
mini_portile (0.6.2)
|
42
|
+
multi_json (1.11.2)
|
43
|
+
multi_xml (0.5.5)
|
44
|
+
multipart-post (2.0.0)
|
45
|
+
nokogiri (1.6.6.2)
|
46
|
+
mini_portile (~> 0.6.0)
|
47
|
+
oauth2 (1.0.0)
|
48
|
+
faraday (>= 0.8, < 0.10)
|
49
|
+
jwt (~> 1.0)
|
50
|
+
multi_json (~> 1.3)
|
51
|
+
multi_xml (~> 0.5)
|
52
|
+
rack (~> 1.2)
|
53
|
+
pry (0.10.1)
|
54
|
+
coderay (~> 1.1.0)
|
55
|
+
method_source (~> 0.8.1)
|
56
|
+
slop (~> 3.4)
|
57
|
+
rack (1.6.4)
|
58
|
+
rake (10.4.2)
|
59
|
+
rdoc (4.2.0)
|
60
|
+
json (~> 1.4)
|
61
|
+
rspec (3.3.0)
|
62
|
+
rspec-core (~> 3.3.0)
|
63
|
+
rspec-expectations (~> 3.3.0)
|
64
|
+
rspec-mocks (~> 3.3.0)
|
65
|
+
rspec-collection_matchers (1.1.2)
|
66
|
+
rspec-expectations (>= 2.99.0.beta1)
|
67
|
+
rspec-core (3.3.2)
|
68
|
+
rspec-support (~> 3.3.0)
|
69
|
+
rspec-expectations (3.3.1)
|
70
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
71
|
+
rspec-support (~> 3.3.0)
|
72
|
+
rspec-mocks (3.3.2)
|
73
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
74
|
+
rspec-support (~> 3.3.0)
|
75
|
+
rspec-support (3.3.0)
|
76
|
+
simplecov (0.10.0)
|
77
|
+
docile (~> 1.1.0)
|
78
|
+
json (~> 1.8)
|
79
|
+
simplecov-html (~> 0.10.0)
|
80
|
+
simplecov-html (0.10.0)
|
81
|
+
simplecov-rcov (0.2.3)
|
82
|
+
simplecov (>= 0.4.1)
|
83
|
+
slop (3.6.0)
|
84
|
+
thread_safe (0.3.5)
|
85
|
+
|
86
|
+
PLATFORMS
|
87
|
+
ruby
|
88
|
+
|
89
|
+
DEPENDENCIES
|
90
|
+
docker-api (~> 1.22)
|
91
|
+
excon (~> 0.45)
|
92
|
+
fakefs
|
93
|
+
jeweler (~> 2.0)
|
94
|
+
pry (~> 0.10)
|
95
|
+
rake (~> 10.0)
|
96
|
+
rspec (~> 3.0)
|
97
|
+
rspec-collection_matchers
|
98
|
+
simplecov (~> 0.9)
|
99
|
+
simplecov-rcov (~> 0.2)
|
100
|
+
|
101
|
+
BUNDLED WITH
|
102
|
+
1.10.5
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Ripta Pasay
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# drydock
|
2
|
+
|
3
|
+
(WORK IN PROGRESS)
|
4
|
+
|
5
|
+
A ruby DSL to build your own docker images. Images are built based on instructions
|
6
|
+
contained in your project's `Drydockfile`.
|
7
|
+
|
8
|
+
## Why not Dockerfile?
|
9
|
+
|
10
|
+
[Dockerfiles](https://docs.docker.com/reference/builder/) are great to start out
|
11
|
+
with, but:
|
12
|
+
|
13
|
+
1. **They are static,** which isn't necessarily a bad thing. I'm not opposed to
|
14
|
+
a declarative approach to building images, but _sometimes_ it may be limiting.
|
15
|
+
2. **They are less hackable,** because `docker build` doesn't support plugins
|
16
|
+
to expand its capabilities.
|
17
|
+
3. **More complicated build pipelines are hard to implement,** or perhaps even
|
18
|
+
impossible. For instance, being able to build multiple images, then combine them
|
19
|
+
at the end, would be a nice option. Imagine building your ruby gem dependencies
|
20
|
+
and node.js dependencies separately, before combining both images into your
|
21
|
+
application's final image.
|
22
|
+
4. **Caching rules are fairly limiting.** For instance, when your Gemfile changes,
|
23
|
+
it would be nice to import a configurably-older image, import the new Gemfile,
|
24
|
+
and re-run the build. On the other hand, it would be important to be able to limit
|
25
|
+
the age of the cache.
|
26
|
+
|
27
|
+
## Why Drydock?
|
28
|
+
|
29
|
+
Drydock interfaces directly with the [Docker Remote API](https://docs.docker.com/reference/api/docker_remote_api/)
|
30
|
+
via [the docker-api gem](https://github.com/swipely/docker-api/). It's
|
31
|
+
not for every use case, but it provides great control over what and how an image
|
32
|
+
is built.
|
33
|
+
|
34
|
+
Drydock supports plugins, either provided through ruby gems or ruby files included
|
35
|
+
in your project being built by Drydock.
|
36
|
+
|
37
|
+
Drydockfiles are written in ruby.
|
38
|
+
|
39
|
+
## Production Installation
|
40
|
+
|
41
|
+
Either (a) `gem install drydock`, or (b) add "drydock" to your project's Gemfile,
|
42
|
+
and run `bundle`.
|
43
|
+
|
44
|
+
In your project's root directory, you'll want to create a `Drydockfile` containing
|
45
|
+
drydock functions. When you're ready, build an image using:
|
46
|
+
|
47
|
+
```
|
48
|
+
$ drydock
|
49
|
+
```
|
50
|
+
|
51
|
+
Alternatively, point drydock to a directory containing the `Drydockfile`, or to any
|
52
|
+
file to treat it as the `Drydockfile`, e.g.:
|
53
|
+
|
54
|
+
```
|
55
|
+
$ drydock ~/source/miniproject # project directory expects a file named Drydockfile
|
56
|
+
$ drydock ~/source/miniproject/drydock-definition.rb # expects a drydock-definition.rb
|
57
|
+
```
|
58
|
+
|
59
|
+
Example `Drydockfile`s may be seen in `examples/`.
|
60
|
+
|
61
|
+
## Development Installation
|
62
|
+
|
63
|
+
This is needed if you plan on hacking drydock:
|
64
|
+
|
65
|
+
```
|
66
|
+
$ git clone git@github.com:ripta/drydock.git
|
67
|
+
$ bundle
|
68
|
+
```
|
69
|
+
|
70
|
+
## Roadmap
|
71
|
+
|
72
|
+
1. Customizable caching subsystem.
|
73
|
+
2. Derived docker images from a previous build step.
|
74
|
+
3. Composable docker images.
|
75
|
+
4. Customizable caching rules.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
17
|
+
gem.name = "dry-dock"
|
18
|
+
gem.homepage = "http://github.com/ripta/drydock"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{Docker Image Pipeline DSL}
|
21
|
+
gem.description = %Q{A Dockerfile-replacement DSL for building complex images}
|
22
|
+
gem.email = "github@r8y.org"
|
23
|
+
gem.authors = ["Ripta Pasay"]
|
24
|
+
|
25
|
+
# dependencies defined in Gemfile
|
26
|
+
end
|
27
|
+
|
28
|
+
Jeweler::RubygemsDotOrgTasks.new
|
29
|
+
|
30
|
+
require 'rake/testtask'
|
31
|
+
Rake::TestTask.new(:test) do |test|
|
32
|
+
test.libs << 'lib' << 'test'
|
33
|
+
test.pattern = 'test/**/test_*.rb'
|
34
|
+
test.verbose = true
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "Code coverage detail"
|
38
|
+
task :simplecov do
|
39
|
+
ENV['COVERAGE'] = "true"
|
40
|
+
Rake::Task['test'].execute
|
41
|
+
end
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rdoc/task'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "drydock #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/bin/drydock
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'drydock'
|
4
|
+
|
5
|
+
opts = Drydock::RuntimeOptions.parse!(ARGV)
|
6
|
+
|
7
|
+
STDOUT.sync = true
|
8
|
+
Drydock.logger = Drydock::Logger.new(STDOUT).tap do |l|
|
9
|
+
l.level = opts.log_level
|
10
|
+
l.formatter = Drydock::Formatter.new
|
11
|
+
end
|
12
|
+
|
13
|
+
build_opts = {}
|
14
|
+
build_opts[:event_handler] = Proc.new do |event, is_new, serial, event_type|
|
15
|
+
long_id = event.id.to_s
|
16
|
+
short_id = if long_id.include?(':') || long_id.include?('/')
|
17
|
+
long_id
|
18
|
+
else
|
19
|
+
long_id.slice(0, 12)
|
20
|
+
end
|
21
|
+
|
22
|
+
if is_new
|
23
|
+
Drydock.logger.info(message: "#{event_type.to_s.capitalize} #{short_id} #{event.status}")
|
24
|
+
else
|
25
|
+
Drydock.logger.debug(message: "#{event_type.to_s.capitalize} #{short_id} #{event.status}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
build_opts[:cache] = Drydock::ObjectCaches::FilesystemCache.new if opts.cache
|
29
|
+
|
30
|
+
Drydock.build(build_opts) do |project|
|
31
|
+
Drydock.logger.info Drydock.banner
|
32
|
+
|
33
|
+
filename = ARGV.first || 'Drydockfile'
|
34
|
+
filename = "#{filename}/Drydockfile" if File.directory?(filename)
|
35
|
+
|
36
|
+
unless File.exist?(filename)
|
37
|
+
Drydock.logger.error "Cannot find file #{filename} in #{Dir.pwd}"
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
|
41
|
+
contents = File.read(filename)
|
42
|
+
Drydock.logger.info "Loaded #{contents.length} bytes from #{filename}"
|
43
|
+
|
44
|
+
[contents, filename]
|
45
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
STDOUT.sync = true
|
4
|
+
|
5
|
+
puts '{"status":"Pulling repository docker.io/gliderlabs/alpine"}'
|
6
|
+
sleep 2
|
7
|
+
|
8
|
+
print '{"status":"Pulling image (latest) from docker.io/gliderlabs/alpine","progressDetail":{},"id":"5bd56d818842"}'
|
9
|
+
print '{"status":"Pulling image (latest) from docker.io/gliderlabs/alpine, endpoint: https://registry-1.docker.io/v1/","progressDetail":{},"id":"5bd56d818842"}'
|
10
|
+
sleep 2
|
11
|
+
|
12
|
+
puts '{"status":"Pulling dependent layers","progressDetail":{},"id":"5bd56d818842"}'
|
13
|
+
sleep 1
|
14
|
+
|
15
|
+
print '{"status":"Download complete","progressDetail":{},"id":"511136ea3c5a"}'
|
16
|
+
sleep 1
|
17
|
+
|
18
|
+
print '{"status":"Download complete","progressDetail":{},"id":"5bd56d818842"}'
|
19
|
+
sleep 1
|
20
|
+
|
21
|
+
print '{"status":"Download complete","progressDetail":{},"id":"5bd56d818842"}'
|
22
|
+
sleep 1
|
23
|
+
|
24
|
+
print '{"status":"Status: Image is up to date for gliderlabs/alpine:latest"}'
|
25
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'docker'
|
4
|
+
require_relative '../lib/drydock'
|
5
|
+
|
6
|
+
def build_tar(*source_files)
|
7
|
+
buffer = StringIO.new
|
8
|
+
# Gem::Package::TarWriter
|
9
|
+
Drydock::TarWriter.new(buffer) do |tar|
|
10
|
+
source_files.each do |source_file|
|
11
|
+
File.open(source_file, 'r') do |input|
|
12
|
+
tar.add_entry(source_file, mode: input.stat.mode, mtime: input.stat.mtime) do |tar_file|
|
13
|
+
tar_file.write(input.read)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
buffer.rewind
|
20
|
+
Digest::MD5.hexdigest(buffer.read)
|
21
|
+
end
|
22
|
+
|
23
|
+
files = Dir.glob('./*').reject { |path| File.directory?(path) }
|
24
|
+
|
25
|
+
puts build_tar(*files)
|
26
|
+
sleep 2
|
27
|
+
puts build_tar(*files)
|
data/dry-dock.gemspec
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: dry-dock 0.1.0 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "dry-dock"
|
9
|
+
s.version = "0.1.0"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.authors = ["Ripta Pasay"]
|
14
|
+
s.date = "2015-09-30"
|
15
|
+
s.description = "A Dockerfile-replacement DSL for building complex images"
|
16
|
+
s.email = "github@r8y.org"
|
17
|
+
s.executables = ["drydock", "json-test-consumer.rb", "json-test-producer.rb", "test-tar-writer-digest.rb"]
|
18
|
+
s.extra_rdoc_files = [
|
19
|
+
"LICENSE",
|
20
|
+
"README.md"
|
21
|
+
]
|
22
|
+
s.files = [
|
23
|
+
".dockerignore",
|
24
|
+
".pryrc",
|
25
|
+
".rspec",
|
26
|
+
"Dockerfile",
|
27
|
+
"Gemfile",
|
28
|
+
"Gemfile.lock",
|
29
|
+
"LICENSE",
|
30
|
+
"README.md",
|
31
|
+
"Rakefile",
|
32
|
+
"VERSION",
|
33
|
+
"bin/drydock",
|
34
|
+
"bin/json-test-consumer.rb",
|
35
|
+
"bin/json-test-producer.rb",
|
36
|
+
"bin/test-tar-writer-digest.rb",
|
37
|
+
"dry-dock.gemspec",
|
38
|
+
"examples/ruby-dsl.rb",
|
39
|
+
"examples/ruby-node-app-dsl.rb",
|
40
|
+
"examples/test-dsl.rb",
|
41
|
+
"examples/test.rb",
|
42
|
+
"lib/drydock.rb",
|
43
|
+
"lib/drydock/cli_flags.rb",
|
44
|
+
"lib/drydock/container_config.rb",
|
45
|
+
"lib/drydock/docker_api_patch.rb",
|
46
|
+
"lib/drydock/drydock.rb",
|
47
|
+
"lib/drydock/errors.rb",
|
48
|
+
"lib/drydock/file_manager.rb",
|
49
|
+
"lib/drydock/formatters.rb",
|
50
|
+
"lib/drydock/ignorefile_definition.rb",
|
51
|
+
"lib/drydock/image_repository.rb",
|
52
|
+
"lib/drydock/logger.rb",
|
53
|
+
"lib/drydock/object_caches/base.rb",
|
54
|
+
"lib/drydock/object_caches/filesystem_cache.rb",
|
55
|
+
"lib/drydock/object_caches/in_memory_cache.rb",
|
56
|
+
"lib/drydock/object_caches/no_cache.rb",
|
57
|
+
"lib/drydock/phase.rb",
|
58
|
+
"lib/drydock/phase_chain.rb",
|
59
|
+
"lib/drydock/plugins/apk.rb",
|
60
|
+
"lib/drydock/plugins/base.rb",
|
61
|
+
"lib/drydock/plugins/npm.rb",
|
62
|
+
"lib/drydock/plugins/package_manager.rb",
|
63
|
+
"lib/drydock/plugins/rubygems.rb",
|
64
|
+
"lib/drydock/project.rb",
|
65
|
+
"lib/drydock/runtime_options.rb",
|
66
|
+
"lib/drydock/stream_monitor.rb",
|
67
|
+
"lib/drydock/tar_writer.rb",
|
68
|
+
"spec/assets/MANIFEST",
|
69
|
+
"spec/assets/hello-world.txt",
|
70
|
+
"spec/assets/sample.tar",
|
71
|
+
"spec/assets/test.sh",
|
72
|
+
"spec/drydock/cli_flags_spec.rb",
|
73
|
+
"spec/drydock/container_config_spec.rb",
|
74
|
+
"spec/drydock/docker_api_patch_spec.rb",
|
75
|
+
"spec/drydock/drydock_spec.rb",
|
76
|
+
"spec/drydock/file_manager_spec.rb",
|
77
|
+
"spec/drydock/formatters_spec.rb",
|
78
|
+
"spec/drydock/ignorefile_definition_spec.rb",
|
79
|
+
"spec/drydock/image_repository_spec.rb",
|
80
|
+
"spec/drydock/object_caches/base_spec.rb",
|
81
|
+
"spec/drydock/object_caches/filesystem_cache_spec.rb",
|
82
|
+
"spec/drydock/object_caches/no_cache_spec.rb",
|
83
|
+
"spec/drydock/phase_chain_spec.rb",
|
84
|
+
"spec/drydock/phase_spec.rb",
|
85
|
+
"spec/drydock/plugins/apk_spec.rb",
|
86
|
+
"spec/drydock/plugins/base_spec.rb",
|
87
|
+
"spec/drydock/plugins/npm_spec.rb",
|
88
|
+
"spec/drydock/plugins/package_manager_spec.rb",
|
89
|
+
"spec/drydock/plugins/rubygems_spec.rb",
|
90
|
+
"spec/drydock/project_import_spec.rb",
|
91
|
+
"spec/drydock/project_spec.rb",
|
92
|
+
"spec/drydock/runtime_options_spec.rb",
|
93
|
+
"spec/drydock/stream_monitor_spec.rb",
|
94
|
+
"spec/drydock/tar_writer_spec.rb",
|
95
|
+
"spec/spec_helper.rb",
|
96
|
+
"spec/support/shared_examples/base_class.rb",
|
97
|
+
"spec/support/shared_examples/container_config.rb",
|
98
|
+
"spec/support/shared_examples/drydockfile.rb"
|
99
|
+
]
|
100
|
+
s.homepage = "http://github.com/ripta/drydock"
|
101
|
+
s.licenses = ["MIT"]
|
102
|
+
s.rubygems_version = "2.2.2"
|
103
|
+
s.summary = "Docker Image Pipeline DSL"
|
104
|
+
|
105
|
+
if s.respond_to? :specification_version then
|
106
|
+
s.specification_version = 4
|
107
|
+
|
108
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
109
|
+
s.add_runtime_dependency(%q<docker-api>, ["~> 1.22"])
|
110
|
+
s.add_runtime_dependency(%q<excon>, ["~> 0.45"])
|
111
|
+
s.add_development_dependency(%q<rake>, ["~> 10.0"])
|
112
|
+
s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
|
113
|
+
s.add_development_dependency(%q<pry>, ["~> 0.10"])
|
114
|
+
s.add_development_dependency(%q<simplecov>, ["~> 0.9"])
|
115
|
+
s.add_development_dependency(%q<simplecov-rcov>, ["~> 0.2"])
|
116
|
+
else
|
117
|
+
s.add_dependency(%q<docker-api>, ["~> 1.22"])
|
118
|
+
s.add_dependency(%q<excon>, ["~> 0.45"])
|
119
|
+
s.add_dependency(%q<rake>, ["~> 10.0"])
|
120
|
+
s.add_dependency(%q<jeweler>, ["~> 2.0"])
|
121
|
+
s.add_dependency(%q<pry>, ["~> 0.10"])
|
122
|
+
s.add_dependency(%q<simplecov>, ["~> 0.9"])
|
123
|
+
s.add_dependency(%q<simplecov-rcov>, ["~> 0.2"])
|
124
|
+
end
|
125
|
+
else
|
126
|
+
s.add_dependency(%q<docker-api>, ["~> 1.22"])
|
127
|
+
s.add_dependency(%q<excon>, ["~> 0.45"])
|
128
|
+
s.add_dependency(%q<rake>, ["~> 10.0"])
|
129
|
+
s.add_dependency(%q<jeweler>, ["~> 2.0"])
|
130
|
+
s.add_dependency(%q<pry>, ["~> 0.10"])
|
131
|
+
s.add_dependency(%q<simplecov>, ["~> 0.9"])
|
132
|
+
s.add_dependency(%q<simplecov-rcov>, ["~> 0.2"])
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env drydock
|
2
|
+
|
3
|
+
from 'gliderlabs/alpine', '3.2'
|
4
|
+
|
5
|
+
with Plugins::APK do |pkg|
|
6
|
+
pkg.update
|
7
|
+
pkg.upgrade
|
8
|
+
pkg.add 'ruby', 'ruby-dev'
|
9
|
+
pkg.add 'curl'
|
10
|
+
end
|
11
|
+
|
12
|
+
download_once 'https://github.com/tianon/gosu/releases/download/1.3/gosu-amd64', '/bin/gosu', chmod: 0755
|
13
|
+
|
14
|
+
run 'sleep 2 && date && sleep 2 && date && sleep 2 && date && sleep 2 && date', no_cache: true
|