dockerfile-rails 1.0.17 → 1.0.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05b8a577ac00405dd179ea5b1cde996561ea653975160a946c204191a0fa0a26
4
- data.tar.gz: 2ea30cf471f625e997fca7185bcbc89d59731516cd6165d8553a3c8a59ddcfa5
3
+ metadata.gz: 9cc1cc395215fe473533ab4418d6e9949a5f58d2a366c2e8d49d29ee2f8e65d8
4
+ data.tar.gz: 9e5a602abb603a024c08ce9e7cd0a4ebb393cfcb92b15fcbc2efd2302ea5d2d4
5
5
  SHA512:
6
- metadata.gz: 1f6ea1a1dc18afd820a0af903385837688f22cac8b11e625e706b6fa2342b850e03f6a0d05606b7ea1c565560993eead3fd31259b1ca34c611b8c0178acdb38a
7
- data.tar.gz: 9b9c27e9c40f6b6edac3aa732d0fae0b2b10a68127b229ade66c980e333ba0601e6f85de78f729efa8acf947f797ef0abf8923990f757c57bcf20c58867074be
6
+ metadata.gz: 30fceacbbc93b16c8f9f3e6e850dfe372d76675407239f4fec6e26fedc4d956a614a2b6d3c88cacd5cf0085ce06c20709b7c2885954796fe0b7f3e1f63c97cf9
7
+ data.tar.gz: dbd788b1bbf86b86950d95cfa4f6222e43a1359e3453bbe26c275b0ac451d5a00e1b8a038498d3cc8a554b567c35f27a1c5c143ff5deaed6d197fa7309f0f1ce
data/README.md CHANGED
@@ -54,6 +54,7 @@ Configuration:
54
54
  * `--no-prepare` - omit `db:prepare`. Useful for cloud platforms with [release](https://devcenter.heroku.com/articles/release-phase) phases
55
55
  * `--platform=s` - specify target platform. See [FROM](https://docs.docker.com/engine/reference/builder/#from) for details
56
56
  * `--precompile=defer` - may be needed when your configuration requires access to secrets that are not available at build time. Results in larger images and slower deployments.
57
+ * `--root` - run application as root
57
58
 
58
59
  Options are saved between runs into `config/dockerfile.yml`. To invert a boolean options, add or remove a `no-` prefix from the option name.
59
60
 
@@ -11,20 +11,22 @@ class DockerfileGenerator < Rails::Generators::Base
11
11
  'compose' => false,
12
12
  'fullstaq' => false,
13
13
  'jemalloc' => false,
14
+ 'label' => {},
14
15
  'mysql' => false,
16
+ 'nginx' => false,
15
17
  'parallel' => false,
16
18
  'platform' => nil,
17
19
  'postgresql' => false,
18
20
  'precompile' => nil,
19
21
  'prepare' => true,
20
22
  'redis' => false,
23
+ 'root' => false,
21
24
  'swap' => nil,
22
25
  'yjit' => false,
23
- 'label' => {},
24
- 'nginx' => false,
25
26
  )
26
27
 
27
28
  @@labels = {}
29
+ @@packages = {"base" => [], "build" => [], "deploy" => []}
28
30
 
29
31
  # load defaults from config file
30
32
  if File.exist? 'config/dockerfile.yml'
@@ -35,6 +37,12 @@ class DockerfileGenerator < Rails::Generators::Base
35
37
  OPTION_DEFAULTS[option] = options[option] if options.include? option
36
38
  end
37
39
 
40
+ if options[:packages]
41
+ options[:packages].each do |stage, list|
42
+ @@packages[stage.to_s] = list
43
+ end
44
+ end
45
+
38
46
  @@labels = options[:label].stringify_keys if options.include? :label
39
47
  end
40
48
  end
@@ -93,6 +101,27 @@ class DockerfileGenerator < Rails::Generators::Base
93
101
  class_option :nginx, type: :boolean, default: OPTION_DEFAULTS.nginx,
94
102
  desc: 'Serve static files with nginx'
95
103
 
104
+ class_option :root, type: :boolean, default: OPTION_DEFAULTS.root,
105
+ desc: 'Run application as root user'
106
+
107
+ class_option 'add-base', type: :array, default: [],
108
+ desc: 'additional packages to install for both build and deploy'
109
+
110
+ class_option 'add-build', type: :array, default: [],
111
+ desc: 'additional packages to install for use during build'
112
+
113
+ class_option 'add-deploy', aliases: '--add', type: :array, default: [],
114
+ desc: 'additional packages to install for deployment'
115
+
116
+ class_option 'remove-base', type: :array, default: [],
117
+ desc: 'remove from list of base packages'
118
+
119
+ class_option 'remove-build', type: :array, default: [],
120
+ desc: 'remove from list of build packages'
121
+
122
+ class_option 'remove-deploy', aliases: '--remove', type: :array, default: [],
123
+ desc: 'remove from list of deploy packages'
124
+
96
125
  def generate_app
97
126
  source_paths.push File.expand_path('./templates', __dir__)
98
127
 
@@ -105,6 +134,16 @@ class DockerfileGenerator < Rails::Generators::Base
105
134
  @dockerfile_config[option] = value if @dockerfile_config.include? option
106
135
  end
107
136
 
137
+ # apply requested package changes
138
+ %w(base build deploy).each do |phase|
139
+ @@packages[phase] += options["add-#{phase}"]
140
+ @@packages[phase] -= options["remove-#{phase}"]
141
+ @@packages[phase].uniq!
142
+ @@packages.delete phase if @@packages[phase].empty?
143
+ end
144
+
145
+ @dockerfile_config['packages'] = @@packages
146
+
108
147
  scan_rails_app
109
148
 
110
149
  Bundler.with_original_env { install_gems }
@@ -169,6 +208,10 @@ private
169
208
  end
170
209
  end
171
210
 
211
+ def run_as_root?
212
+ true # options.root? || options.nginx?
213
+ end
214
+
172
215
  def using_node?
173
216
  return @using_node if @using_node != nil
174
217
  @using_node = File.exist? 'package.json'
@@ -215,6 +258,7 @@ private
215
258
 
216
259
  def base_packages
217
260
  packages = []
261
+ packages += @@packages['base'] if @@packages['base']
218
262
 
219
263
  if using_execjs?
220
264
  packages += %w(curl unzip)
@@ -248,6 +292,7 @@ private
248
292
  def build_packages
249
293
  # start with the essentials
250
294
  packages = %w(build-essential)
295
+ packages += @@packages['build'] if @@packages['build']
251
296
 
252
297
  # add databases: sqlite3, postgres, mysql
253
298
  packages << 'pkg-config' if options.sqlite3? or @sqlite3
@@ -298,6 +343,7 @@ private
298
343
 
299
344
  def deploy_packages
300
345
  packages = []
346
+ packages += @@packages['deploy'] if @@packages['deploy']
301
347
 
302
348
  # start with databases: sqlite3, postgres, mysql
303
349
  packages << 'libsqlite3-0' if options.sqlite3? or @sqlite3
@@ -124,6 +124,11 @@ RUN SECRET_KEY_BASE<%= Rails::VERSION::MAJOR<7 || Rails::VERSION::STRING.start_w
124
124
  # Final stage for app image
125
125
  FROM base
126
126
 
127
+ <% end -%>
128
+ <% unless run_as_root? -%>
129
+ # add a non-root user
130
+ RUN useradd rails
131
+
127
132
  <% end -%>
128
133
  <% unless deploy_packages.empty? -%>
129
134
  # Install packages needed for deployment
@@ -139,11 +144,11 @@ RUN gem install foreman
139
144
  <% end -%>
140
145
  <% unless options.precompile == "defer" -%>
141
146
  # Copy built application from previous stage
142
- COPY --from=build /rails /rails
147
+ COPY --from=build <% unless run_as_root? %>--chown=rails:rails <% end %>/rails /rails
143
148
  <% if api_client_dir -%>
144
149
 
145
150
  # Copy built client
146
- COPY --from=client /rails/<%= api_client_dir %>/build /rails/public
151
+ COPY --from=client <% unless run_as_root? %>--chown=rails:rails <% end %>/rails/<%= api_client_dir %>/build /rails/public
147
152
  <% end -%>
148
153
 
149
154
  <% end -%>
@@ -1,4 +1,4 @@
1
- #!/bin/bash
1
+ #!/bin/bash -e
2
2
 
3
3
  <% if options.swap -%>
4
4
  # allocate swap space
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockerfile-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.17
4
+ version: 1.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Ruby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-15 00:00:00.000000000 Z
11
+ date: 2023-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails