docker-rails 0.3.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 52b6b65dc737230fe132456a384179de3a42a2c1
4
- data.tar.gz: a8cae9865e9b9bc5dbceb954746e32a5b02708ac
3
+ metadata.gz: d26c8278640216cf598752f489b351eac1528b36
4
+ data.tar.gz: d6b8073a625aba9bf8a2e8363dc13f88e043b30e
5
5
  SHA512:
6
- metadata.gz: 4e6c98d4b1bf72679aeb9a1002bb85b4e46434923202dd79ca9366695a4543f67a18e07f05629bdaeb5f3a29f6b261b43c56a0d32e718548252214bf398bfe06
7
- data.tar.gz: aec9dd8c82ab3e4922c49b3ce862575463d412f15cf6800b191b9dfdb830bf44a450557fe3e9df5c05895abcd4356e28a5808a80cd3c7165519035f2d0524c62
6
+ metadata.gz: 968f011b7447d44c7f9d300256092f16bccd3d1cb76a374a56fa96f9e94c8e56e6471b7f49dd6731a167401c4012c4023ed7c0a21a1ee00923a486c158815276
7
+ data.tar.gz: bb4a69f2f43f141989b8cbea4ba678ed088d14769b2ec7f96248103dc7e43a291cd44b6f9ccdec4a19afa6ad0a45d22bb6711ea784c82737bb70eb092ab6ad12
data/README.md CHANGED
@@ -7,7 +7,7 @@ A simplified pattern to execute rails applications within Docker (with a CI buil
7
7
 
8
8
  ## Features
9
9
  - DRY declarative `docker-rails.yml` allowing multiple environments to be defined with an inherited docker `compose` configuration
10
- - Provides individual convenience functions `up | bash | stop | cleanup` to easily work with target environment (even in a concurrent situation)
10
+ - Provides individual convenience functions `up | bash | stop | extract | cleanup` to easily work with target environment (even in a concurrent situation)
11
11
  - Full workflow for CI usage with automated container, volume, and image cleanup.
12
12
  - Automated cached global gems data volume based on ruby version
13
13
  - Interpolates variables `docker-compose.yml` making CI builds much easier
@@ -103,6 +103,8 @@ RUN apt-get update -qq && \
103
103
  cd /var/lib/apt/lists && rm -fr *Release* *Sources* *Packages* && \
104
104
  truncate -s 0 /var/log/*log
105
105
 
106
+ COPY . /project # figure out/automate this as a volume instead https://github.com/alienfast/docker-rails/issues/14
107
+
106
108
  # https://github.com/docker/docker/issues/4032
107
109
  ENV DEBIAN_FRONTEND newt
108
110
  ```
@@ -110,11 +112,20 @@ ENV DEBIAN_FRONTEND newt
110
112
  ### 2. Add a docker-rails.yml
111
113
 
112
114
  Environment variables will be interpolated, so feel free to use them.
113
- Below shows an example with all of the environments `development | test | parallel_tests | staging` to show reuse of the primary `compose` configuration.
115
+ The rails engine example below shows an example with all of the environments `development | test | parallel_tests | staging` to show reuse of the primary `compose` configuration.
114
116
 
115
117
  ```yaml
116
118
  verbose: true
119
+ before_command: bash -c "rm -Rf target && rm -Rf spec/dummy/log"
117
120
 
121
+ extractions: &extractions
122
+ web:
123
+ extract:
124
+ - '/project/target'
125
+ - '/project/vcr'
126
+ - '/project/tmp'
127
+ - '/project/spec/dummy/log:spec/dummy'
128
+
118
129
  # local environments need elasticsearch, staging/production connects to existing running instance.
119
130
  elasticsearch: &elasticsearch
120
131
  elasticsearch:
@@ -157,7 +168,7 @@ development:
157
168
  "
158
169
 
159
170
  test:
160
- before_command: rm -Rf target
171
+ <<: *extractions
161
172
  compose:
162
173
  <<: *elasticsearch
163
174
  web:
@@ -185,7 +196,7 @@ test:
185
196
  "
186
197
 
187
198
  parallel_tests:
188
- before_command: rm -Rf target
199
+ <<: *extractions
189
200
  compose:
190
201
  <<: *elasticsearch
191
202
  web:
@@ -252,9 +263,6 @@ compose:
252
263
  links:
253
264
  - db
254
265
 
255
- volumes:
256
- - .:/project
257
-
258
266
  volumes_from:
259
267
  # Mount the gems data volume container for cached bundler gem files
260
268
  - #{DOCKER_RAILS_GEMS_VOLUME_NAME}
data/bin/docker-rails CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  # enable local usage from cloned repo
4
- # root = File.expand_path('../..', __FILE__)
5
- # $LOAD_PATH << "#{root}/lib" if File.exist?("#{root}/Gemfile")
4
+ root = File.expand_path('../..', __FILE__)
5
+ $LOAD_PATH << "#{root}/lib" if File.exist?("#{root}/Gemfile")
6
6
 
7
7
  require 'docker/rails'
8
8
 
data/docker-rails.gemspec CHANGED
@@ -29,4 +29,5 @@ Gem::Specification.new do |s|
29
29
  s.add_dependency 'docker-api'
30
30
  s.add_dependency 'dry-config', '>= 1.2.7'
31
31
  s.add_dependency 'thor'
32
+ s.add_dependency 'minitar'
32
33
  end
data/lib/docker/rails.rb CHANGED
@@ -7,6 +7,7 @@ end
7
7
 
8
8
  require 'thor'
9
9
  require 'docker'
10
+ require 'archive/tar/minitar'
10
11
 
11
12
  require 'docker/rails/core_ext/hash'
12
13
 
@@ -41,6 +41,66 @@ module Docker
41
41
  @is_configured || false
42
42
  end
43
43
 
44
+ def extract
45
+
46
+ # For each container, process extractions
47
+ # Containers are defined in compose, extractions are defined at root under container name e.g.:
48
+ # web:
49
+ # extract:
50
+ # - '<from_container>:<to_host>'
51
+ # - '/project/target:.'
52
+ # - '/project/vcr' # same as extract to '.'
53
+ # - '/project/tmp'
54
+ # - '/project/spec/dummy/log:spec/dummy'
55
+ @compose_config.each_key do |service_name|
56
+ service_config = @config[service_name]
57
+ extractions = service_config[:extract] unless service_config.nil?
58
+ next if extractions.nil?
59
+
60
+ puts "Processing extract for #{service_name}:"
61
+ puts '---------------------------------'
62
+ container = get_container(service_name)
63
+ extractions.each do |extraction|
64
+ if extraction =~ /:/
65
+ tokens = extraction.split(':')
66
+ from = tokens[0]
67
+ to = tokens[1]
68
+ else
69
+ from = extraction
70
+ to = '.'
71
+ end
72
+
73
+ puts "\nExtracting #{service_name} #{from} to #{to}"
74
+ extract_files(container, from, to)
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+ def extract_files(container, from, to)
81
+ # or something like
82
+ tar_stringio = StringIO.new
83
+ container.copy(from) do |chunk|
84
+ tar_stringio.write(chunk)
85
+ end
86
+
87
+ tar_stringio.rewind
88
+
89
+ input = Archive::Tar::Minitar::Input.new(tar_stringio)
90
+ input.each { |entry|
91
+
92
+ # Need to check the file name length to prevent some very bad things from happening.
93
+ if entry.full_name.length > 255
94
+ puts "ERROR - file name length is > 255 characters: #{entry.full_name}"
95
+ elsif entry.full_name.length <= 0
96
+ puts "ERROR - file name length is too small: #{entry.full_name}"
97
+ else
98
+ puts "Extracting #{entry.full_name}"
99
+ input.extract_entry(to, entry)
100
+ end
101
+ }
102
+ end
103
+
44
104
  def compose
45
105
  # Write a docker-compose.yml with interpolated variables
46
106
  @compose_filename = compose_filename_from @build, @target
@@ -162,6 +222,10 @@ module Docker
162
222
  $1
163
223
  end
164
224
 
225
+ def get_container(service_name)
226
+ Docker::Container.get(get_container_name(service_name))
227
+ end
228
+
165
229
  # def up_service(service_name, options = '')
166
230
  # exec_compose "up #{options} #{service_name}"
167
231
  # container_name = get_container_name(service_name)
@@ -24,9 +24,9 @@ module Docker
24
24
  # init singleton with full options
25
25
  App.configured(target, options)
26
26
 
27
- invoke :compose
27
+ invoke :before, [target], []
28
+ invoke :compose, [target], []
28
29
  invoke CLI::GemsVolume, :create, [target], options
29
- invoke :before
30
30
  begin
31
31
  invoke :build # on CI - always build to ensure dockerfile hasn't been altered - small price to pay for consistent CI.
32
32
  invoke :up
@@ -35,9 +35,20 @@ module Docker
35
35
  end
36
36
  end
37
37
 
38
+ desc 'extract <target>', 'Invoke extractions', hide: true
39
+
40
+ def extract(target)
41
+ app = App.configured(target, options)
42
+ invoke :compose, [target], []
43
+ app.extract
44
+ end
45
+
38
46
  desc 'cleanup <target>', 'Runs container cleanup functions stop, rm_volumes, rm_compose, rm_dangling, ps_all e.g. bundle exec docker-rails cleanup --build=222 development'
47
+ option :extract, aliases: ['-e'], type: :boolean, default: true, desc: 'Extract any directories defined in configuration.'
48
+
39
49
  def cleanup(target)
40
50
  invoke :stop
51
+ invoke :extract if options[:extract]
41
52
  invoke :rm_volumes
42
53
  invoke :rm_compose
43
54
  invoke :rm_dangling
@@ -45,7 +56,6 @@ module Docker
45
56
  end
46
57
 
47
58
  desc 'up <target>', 'Up the docker-compose configuration for the given build/target. Use -d for detached mode. e.g. bundle exec docker-rails up -d --build=222 test'
48
-
49
59
  option :detached, aliases: ['-d'], type: :boolean, desc: 'Detached mode: Run containers in the background'
50
60
 
51
61
  def up(target)
@@ -53,8 +63,8 @@ module Docker
53
63
  app = App.configured(target, options)
54
64
  base_options = options.except(:detached)
55
65
 
56
- invoke CLI::GemsVolume, :create, [target], base_options
57
66
  invoke :before, [target], base_options
67
+ invoke CLI::GemsVolume, :create, [target], base_options
58
68
 
59
69
  compose_options = ''
60
70
  compose_options = '-d' if options[:detached]
@@ -79,8 +89,9 @@ module Docker
79
89
  desc 'before <target>', 'Invoke before_command', hide: true
80
90
 
81
91
  def before(target)
82
- invoke :compose, [target]
83
- App.configured(target, options).exec_before_command
92
+ app = App.configured(target, options)
93
+ invoke :compose, [target], []
94
+ app.exec_before_command
84
95
  end
85
96
 
86
97
 
@@ -1,5 +1,5 @@
1
1
  module Docker
2
2
  module Rails
3
- VERSION = '0.3.1'
3
+ VERSION = '0.4.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Ross
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-22 00:00:00.000000000 Z
11
+ date: 2015-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitar
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  description: ''
126
140
  email:
127
141
  - kevin.ross@alienfast.com