dockerfile-rails 1.5.2 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -2
- data/lib/generators/dockerfile_generator.rb +34 -2
- data/lib/generators/templates/Dockerfile.erb +16 -3
- data/lib/generators/templates/_install_node.erb +2 -2
- data/lib/generators/templates/_nginx.erb +4 -4
- data/lib/generators/templates/_npm_install.erb +3 -0
- data/lib/generators/templates/_passenger.erb +1 -1
- data/lib/generators/templates/docker-compose.yml.erb +14 -0
- data/lib/generators/templates/dockerignore.erb +5 -0
- data/lib/generators/templates/rollbar.rb.erb +73 -0
- data/lib/generators/templates/sentry.rb.erb +5 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb14492c49c1cf3daf989207c2188413c0311a317a95727330fcec570f79632c
|
4
|
+
data.tar.gz: c18d7c536626010b3befe71e23ef8c99b53095680e7050dfbcfecd59960cba91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50725e7ac313645b93fddb4742a2e711b08e01ba1c593bd0126a70135d04f7467b9d2caa476eb2642903392fc805e2a38ff811aede86c4a2c23843aa30be0189
|
7
|
+
data.tar.gz: 85c0608fc27c115b95d42ddeef4b86b2e5c6be63f652338d01d4b24886686036e2572bab94356f41b3f6e18123d07370b2982f4b224eba34997ef0707381f557
|
data/README.md
CHANGED
@@ -44,9 +44,12 @@ bin/rails generate dockerfile
|
|
44
44
|
* `--nginx` - serve static files via [nginx](https://www.nginx.com/). May require `--root` on some targets to access `/dev/stdout`
|
45
45
|
* `--no-link` - don't add [--link](https://docs.docker.com/engine/reference/builder/#copy---link) to COPY statements. Some tools (like at the moment, [buildah](https://www.redhat.com/en/topics/containers/what-is-buildah)) don't yet support this feature.
|
46
46
|
* `--no-lock` - don't add linux platforms, set `BUNDLE_DEPLOY`, or `--frozen-lockfile`. May be needed at times to work around a [rubygems bug](https://github.com/rubygems/rubygems/issues/6082#issuecomment-1329756343).
|
47
|
-
* `--sentry` -- install gems and a starter initializer for sentry
|
48
47
|
* `--sudo` - install and configure sudo to enable `sudo -iu rails` access to full environment
|
49
48
|
|
49
|
+
#### Error Tracking & Alerting:
|
50
|
+
* `--rollbar` - install gem and a default initializer for [Rollbar](https://rollbar.com/#)
|
51
|
+
* `--sentry` - install gems and a default initializer for [Sentry](https://sentry.io/welcome/)
|
52
|
+
|
50
53
|
### Add a Database:
|
51
54
|
|
52
55
|
Generally the dockerfile generator will be able to determine what dependencies you
|
@@ -82,6 +85,7 @@ Not all of your needs can be determined by scanning your application. For examp
|
|
82
85
|
* `--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.
|
83
86
|
* `--root` - run application as root
|
84
87
|
* `--windows` - make Dockerfile work for Windows users that may have set `git config --global core.autocrlf true`
|
88
|
+
* `--private-gemserver-domain=gems.example.com` - set the domain name of your private gemserver. This is used to tell bundler for what domain to use the credentials of a private gemserver provided via a docker secret
|
85
89
|
|
86
90
|
### Advanced Customization:
|
87
91
|
|
@@ -116,7 +120,7 @@ rake test
|
|
116
120
|
ruby test/test_minimal.rb
|
117
121
|
```
|
118
122
|
|
119
|
-
To
|
123
|
+
To assist with this process, outputs of tests can be captured automatically. This is useful when adding new tests and when making a change that affects many tests. Be sure to inspect the output (e.g., by using `git diff`) before committing.
|
120
124
|
|
121
125
|
```
|
122
126
|
rake test:capture
|
@@ -28,9 +28,11 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
28
28
|
"postgresql" => false,
|
29
29
|
"precompile" => nil,
|
30
30
|
"prepare" => true,
|
31
|
+
"private-gemserver-domain" => nil,
|
31
32
|
"procfile" => "",
|
32
33
|
"redis" => false,
|
33
34
|
"registry" => "",
|
35
|
+
"rollbar" => false,
|
34
36
|
"root" => false,
|
35
37
|
"sqlite3" => false,
|
36
38
|
"sentry" => false,
|
@@ -171,7 +173,10 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
171
173
|
desc: "Install and configure sudo to enable running as rails with full environment"
|
172
174
|
|
173
175
|
class_option :sentry, type: :boolean, default: OPTION_DEFAULTS.sentry,
|
174
|
-
desc: "Install gems and a
|
176
|
+
desc: "Install gems and a default initializer for Sentry"
|
177
|
+
|
178
|
+
class_option :rollbar, type: :boolean, default: OPTION_DEFAULTS.rollbar,
|
179
|
+
desc: "Install gem and a default initializer for Rollbar"
|
175
180
|
|
176
181
|
class_option "migrate", type: :string, default: OPTION_DEFAULTS.migrate,
|
177
182
|
desc: "custom migration/db:prepare script"
|
@@ -179,6 +184,9 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
179
184
|
class_option "procfile", type: :string, default: OPTION_DEFAULTS.procfile,
|
180
185
|
desc: "custom procfile to start services"
|
181
186
|
|
187
|
+
class_option "private-gemserver-domain", type: :string, default: OPTION_DEFAULTS["private-gemserver-domain"],
|
188
|
+
desc: "domain name of a private gemserver used when installing application gems"
|
189
|
+
|
182
190
|
|
183
191
|
class_option "add-base", type: :array, default: [],
|
184
192
|
desc: "additional packages to install for both build and deploy"
|
@@ -299,6 +307,10 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
299
307
|
template "sentry.rb.erb", "config/initializers/sentry.rb"
|
300
308
|
end
|
301
309
|
|
310
|
+
if options.rollbar? && (not File.exist?("config/initializers/rollbar.rb"))
|
311
|
+
template "rollbar.rb.erb", "config/initializers/rollbar.rb"
|
312
|
+
end
|
313
|
+
|
302
314
|
if @gemfile.include?("vite_ruby")
|
303
315
|
package = JSON.load_file("package.json")
|
304
316
|
unless package.dig("scripts", "build")
|
@@ -445,6 +457,10 @@ private
|
|
445
457
|
system "bundle add sentry-rails --skip-install" unless @gemfile.include? "sentry-rails"
|
446
458
|
end
|
447
459
|
|
460
|
+
if options.rollbar?
|
461
|
+
system "bundle add rollbar --skip-install" unless @gemfile.include? "rollbar"
|
462
|
+
end
|
463
|
+
|
448
464
|
# https://stackoverflow.com/questions/70500220/rails-7-ruby-3-1-loaderror-cannot-load-such-file-net-smtp/70500221#70500221
|
449
465
|
if @gemfile.include? "mail"
|
450
466
|
%w(net-smtp net-imap net-pop).each do |gem|
|
@@ -526,6 +542,7 @@ private
|
|
526
542
|
# start with the essentials
|
527
543
|
packages = %w(build-essential)
|
528
544
|
packages += @@packages["build"] if @@packages["build"]
|
545
|
+
packages += %w(nodejs npm) if node_version == "lts"
|
529
546
|
|
530
547
|
# add databases: sqlite3, postgres, mysql
|
531
548
|
packages << "pkg-config" if options.sqlite3? || @sqlite3
|
@@ -837,7 +854,9 @@ private
|
|
837
854
|
|
838
855
|
def binfile_fixups
|
839
856
|
# binfiles may have OS specific paths to ruby. Normalize them.
|
840
|
-
shebangs = Dir["bin/*"].map
|
857
|
+
shebangs = Dir["bin/*"].map do |file|
|
858
|
+
IO.read(file).lines.first.encode("UTF-8", "binary", invalid: :replace, undef: :replace, replace: "")
|
859
|
+
end.join
|
841
860
|
rubies = shebangs.scan(%r{#!/usr/bin/env (ruby.*)}).flatten.uniq
|
842
861
|
|
843
862
|
binfixups = (rubies - %w(ruby)).map do |ruby|
|
@@ -1027,6 +1046,19 @@ private
|
|
1027
1046
|
nil
|
1028
1047
|
end
|
1029
1048
|
|
1049
|
+
# Takes the domain of the private gemserver and returns the name of the
|
1050
|
+
# environment variable, as expected by bundler.
|
1051
|
+
#
|
1052
|
+
# For example, if the domain is "gems.example.com", the environment variable
|
1053
|
+
# name will be "BUNDLE_GEMS__EXAMPLE__COM".
|
1054
|
+
def private_gemserver_env_variable_name
|
1055
|
+
option = options["private-gemserver-domain"]
|
1056
|
+
|
1057
|
+
return nil if option.blank?
|
1058
|
+
|
1059
|
+
"BUNDLE_#{option.upcase.gsub(".", "__")}"
|
1060
|
+
end
|
1061
|
+
|
1030
1062
|
# if running on fly v2, make a best effort to attach consul
|
1031
1063
|
def fly_attach_consul
|
1032
1064
|
# certainly not fly unless there is a fly.toml
|
@@ -86,10 +86,15 @@ ENV <%= build_env.join(" \\\n ") %>
|
|
86
86
|
COPY<% if options.link? %> --link<% end %> Gemfile Gemfile.lock ./
|
87
87
|
<% if options.cache? -%>
|
88
88
|
RUN --mount=type=cache,id=bld-gem-cache,sharing=locked,target=/srv/vendor \
|
89
|
+
<% if private_gemserver_env_variable_name -%>
|
90
|
+
--mount=type=secret,id=gemserver_credentials,dst=/kaniko/gemserver_credentials \
|
91
|
+
<%= private_gemserver_env_variable_name %>="$(cat /kaniko/gemserver_credentials)" && \
|
92
|
+
export <%= private_gemserver_env_variable_name %> && \
|
93
|
+
<% end -%>
|
89
94
|
bundle config set app_config .bundle && \
|
90
95
|
bundle config set path /srv/vendor && \
|
91
96
|
bundle install && \
|
92
|
-
<% if depend_on_bootsnap? -%>
|
97
|
+
<% if depend_on_bootsnap? && options.precompile != "defer" -%>
|
93
98
|
bundle exec bootsnap precompile --gemfile && \
|
94
99
|
<% end -%>
|
95
100
|
bundle clean && \
|
@@ -98,8 +103,16 @@ RUN --mount=type=cache,id=bld-gem-cache,sharing=locked,target=/srv/vendor \
|
|
98
103
|
cp -ar /srv/vendor .
|
99
104
|
|
100
105
|
<% else -%>
|
101
|
-
|
106
|
+
<% if private_gemserver_env_variable_name -%>
|
107
|
+
RUN --mount=type=secret,id=gemserver_credentials,dst=/kaniko/gemserver_credentials \
|
108
|
+
<%= private_gemserver_env_variable_name %>="$(cat /kaniko/gemserver_credentials)" && \
|
109
|
+
export <%= private_gemserver_env_variable_name %> && \
|
110
|
+
bundle install<% if depend_on_bootsnap? && options.precompile != "defer" -%> && \
|
102
111
|
bundle exec bootsnap precompile --gemfile<% end %> && \
|
112
|
+
<% else -%>
|
113
|
+
RUN bundle install<% if depend_on_bootsnap? && options.precompile != "defer" -%> && \
|
114
|
+
bundle exec bootsnap precompile --gemfile<% end %> && \
|
115
|
+
<% end -%>
|
103
116
|
rm -rf ~/.bundle/ $BUNDLE_PATH/ruby/*/cache $BUNDLE_PATH/ruby/*/bundler/gems/*/.git
|
104
117
|
|
105
118
|
<% end -%>
|
@@ -115,7 +128,7 @@ COPY --from=node /usr/local/node /usr/local/node
|
|
115
128
|
ENV PATH=/usr/local/node/bin:$PATH
|
116
129
|
|
117
130
|
<% elsif using_node? -%>
|
118
|
-
<%= render partial: 'npm_install', locals: {sources: Dir[*%w(package.json package-lock.json yarn.lock)]} %>
|
131
|
+
<%= render partial: 'npm_install', locals: {sources: Dir[*%w(.npmrc .yarnrc package.json package-lock.json yarn.lock)]} %>
|
119
132
|
|
120
133
|
<% end -%>
|
121
134
|
# Copy application code
|
@@ -5,13 +5,13 @@
|
|
5
5
|
<% elsif yarn_version -%>
|
6
6
|
# Install yarn
|
7
7
|
<% end -%>
|
8
|
-
<% if node_version -%>
|
8
|
+
<% if node_version && node_version != 'lts' -%>
|
9
9
|
ARG NODE_VERSION=<%= node_version %>
|
10
10
|
<% end -%>
|
11
11
|
<% if yarn_version -%>
|
12
12
|
ARG YARN_VERSION=<%= yarn_version %>
|
13
13
|
<% end -%>
|
14
|
-
<% if node_version -%>
|
14
|
+
<% if node_version && node_version != 'lts' -%>
|
15
15
|
ENV PATH=/usr/local/node/bin:$PATH
|
16
16
|
RUN curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz -C /tmp/ && \
|
17
17
|
/tmp/node-build-master/bin/node-build "${NODE_VERSION}" /usr/local/node && \
|
@@ -3,14 +3,14 @@ RUN gem install foreman && \
|
|
3
3
|
<% unless run_as_root? -%>
|
4
4
|
sed -i 's|pid /run|pid /rails/tmp/pids|' /etc/nginx/nginx.conf && \
|
5
5
|
<% end -%>
|
6
|
-
sed -i 's/access_log\s.*;/access_log stdout;/' /etc/nginx/nginx.conf && \
|
7
|
-
sed -i 's/error_log\s.*;/error_log stderr info;/' /etc/nginx/nginx.conf
|
6
|
+
sed -i 's/access_log\s.*;/access_log <% unless run_as_root? %>\/dev\/<% end %>stdout;/' /etc/nginx/nginx.conf && \
|
7
|
+
sed -i 's/error_log\s.*;/error_log <% unless run_as_root? %>\/dev\/<% end %>stderr info;/' /etc/nginx/nginx.conf
|
8
8
|
|
9
9
|
COPY <<-"EOF" /etc/nginx/sites-available/default
|
10
10
|
server {
|
11
11
|
listen 3000 default_server;
|
12
12
|
listen [::]:3000 default_server;
|
13
|
-
access_log stdout;
|
13
|
+
access_log <% unless run_as_root? %>/dev/<% end %>stdout;
|
14
14
|
|
15
15
|
root /rails/public;
|
16
16
|
|
@@ -28,7 +28,7 @@ server {
|
|
28
28
|
|
29
29
|
location @backend {
|
30
30
|
proxy_pass http://localhost:3001;
|
31
|
-
proxy_set_header
|
31
|
+
proxy_set_header Host $http_host;
|
32
32
|
}
|
33
33
|
}
|
34
34
|
EOF
|
@@ -1,5 +1,8 @@
|
|
1
1
|
# Install node modules
|
2
2
|
COPY<% if options.link? %> --link<% end %> <%= sources.join(' ') %> ./
|
3
|
+
<% if sources.join.include?('.yarnrc') && !Dir['.yarn/releases/*'].empty? -%>
|
4
|
+
COPY<% if options.link? %> --link<% end %> .yarn/releases/* .yarn/releases/
|
5
|
+
<% end -%>
|
3
6
|
<% if sources.join.include? 'yarn' -%>
|
4
7
|
RUN <% if options.cache? -%>--mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \
|
5
8
|
YARN_CACHE_FOLDER=/root/.yarn <% end -%>yarn install<% if options.lock? %> --frozen-lockfile<% end %>
|
@@ -10,6 +10,7 @@ server {
|
|
10
10
|
passenger_pool_idle_time <%= max_idle %>;
|
11
11
|
<% end -%>
|
12
12
|
}
|
13
|
+
EOF
|
13
14
|
<% if options['max-idle'] -%>
|
14
15
|
COPY <<-'EOF' /etc/nginx/sites-enabled/hook_detached_process
|
15
16
|
#!/usr/bin/env ruby
|
@@ -18,7 +19,6 @@ processes = status[/^Processes\s*:\s*(\d*)/, 1].to_i
|
|
18
19
|
system 'nginx -s stop' if processes == 0
|
19
20
|
EOF
|
20
21
|
<% end -%>
|
21
|
-
EOF
|
22
22
|
RUN echo "daemon off;" >> /etc/nginx/nginx.conf && \
|
23
23
|
sed -i 's/access_log\s.*;/access_log stdout;/' /etc/nginx/nginx.conf && \
|
24
24
|
sed -i 's/error_log\s.*;/error_log stderr info;/' /etc/nginx/nginx.conf && \
|
@@ -3,6 +3,10 @@ services:
|
|
3
3
|
web:
|
4
4
|
<% if all_args.empty? -%>
|
5
5
|
build: .
|
6
|
+
<% if private_gemserver_env_variable_name -%>
|
7
|
+
secrets:
|
8
|
+
- gemserver_credentials
|
9
|
+
<% end -%>
|
6
10
|
<% else -%>
|
7
11
|
build:
|
8
12
|
context: .
|
@@ -10,6 +14,10 @@ services:
|
|
10
14
|
<% all_args.each do |name, value| -%>
|
11
15
|
<%= name %>: <%= value.html_safe? ? value : "\"#{Shellwords.escape(value)}\"" %>
|
12
16
|
<% end -%>
|
17
|
+
<% if private_gemserver_env_variable_name -%>
|
18
|
+
secrets:
|
19
|
+
- gemserver_credentials
|
20
|
+
<% end -%>
|
13
21
|
<% end -%>
|
14
22
|
ports:
|
15
23
|
- "3000:3000"
|
@@ -110,3 +118,9 @@ services:
|
|
110
118
|
condition: service_healthy
|
111
119
|
<% end -%>
|
112
120
|
<% end -%>
|
121
|
+
<% if private_gemserver_env_variable_name -%>
|
122
|
+
|
123
|
+
secrets:
|
124
|
+
gemserver_credentials:
|
125
|
+
file: ./GEMSERVER_CREDENTIALS.secret.txt
|
126
|
+
<% end -%>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
if ENV['ROLLBAR_ENV']
|
2
|
+
Rollbar.configure do |config|
|
3
|
+
# Without configuration, Rollbar is enabled in all environments.
|
4
|
+
# To disable in specific environments, set config.enabled=false.
|
5
|
+
|
6
|
+
config.access_token = ENV['ROLLBAR_ACCESS_TOKEN']
|
7
|
+
|
8
|
+
# Here we'll disable in 'test':
|
9
|
+
if Rails.env.test?
|
10
|
+
config.enabled = false
|
11
|
+
end
|
12
|
+
|
13
|
+
# By default, Rollbar will try to call the `current_user` controller method
|
14
|
+
# to fetch the logged-in user object, and then call that object's `id`
|
15
|
+
# method to fetch this property. To customize:
|
16
|
+
# config.person_method = "my_current_user"
|
17
|
+
# config.person_id_method = "my_id"
|
18
|
+
|
19
|
+
# Additionally, you may specify the following:
|
20
|
+
# config.person_username_method = "username"
|
21
|
+
# config.person_email_method = "email"
|
22
|
+
|
23
|
+
# If you want to attach custom data to all exception and message reports,
|
24
|
+
# provide a lambda like the following. It should return a hash.
|
25
|
+
# config.custom_data_method = lambda { {:some_key => "some_value" } }
|
26
|
+
|
27
|
+
# Add exception class names to the exception_level_filters hash to
|
28
|
+
# change the level that exception is reported at. Note that if an exception
|
29
|
+
# has already been reported and logged the level will need to be changed
|
30
|
+
# via the rollbar interface.
|
31
|
+
# Valid levels: 'critical', 'error', 'warning', 'info', 'debug', 'ignore'
|
32
|
+
# 'ignore' will cause the exception to not be reported at all.
|
33
|
+
# config.exception_level_filters.merge!('MyCriticalException' => 'critical')
|
34
|
+
#
|
35
|
+
# You can also specify a callable, which will be called with the exception instance.
|
36
|
+
# config.exception_level_filters.merge!('MyCriticalException' => lambda { |e| 'critical' })
|
37
|
+
|
38
|
+
# Enable asynchronous reporting (uses girl_friday or Threading if girl_friday
|
39
|
+
# is not installed)
|
40
|
+
# config.use_async = true
|
41
|
+
# Supply your own async handler:
|
42
|
+
# config.async_handler = Proc.new { |payload|
|
43
|
+
# Thread.new { Rollbar.process_from_async_handler(payload) }
|
44
|
+
# }
|
45
|
+
|
46
|
+
# Enable asynchronous reporting (using sucker_punch)
|
47
|
+
# config.use_sucker_punch
|
48
|
+
|
49
|
+
# Enable delayed reporting (using Sidekiq)
|
50
|
+
# config.use_sidekiq
|
51
|
+
# You can supply custom Sidekiq options:
|
52
|
+
# config.use_sidekiq 'queue' => 'default'
|
53
|
+
|
54
|
+
# If your application runs behind a proxy server, you can set proxy parameters here.
|
55
|
+
# If https_proxy is set in your environment, that will be used. Settings here have precedence.
|
56
|
+
# The :host key is mandatory and must include the URL scheme (e.g. 'http://'), all other fields
|
57
|
+
# are optional.
|
58
|
+
#
|
59
|
+
# config.proxy = {
|
60
|
+
# host: 'http://some.proxy.server',
|
61
|
+
# port: 80,
|
62
|
+
# user: 'username_if_auth_required',
|
63
|
+
# password: 'password_if_auth_required'
|
64
|
+
# }
|
65
|
+
|
66
|
+
# If you run your staging application instance in production environment then
|
67
|
+
# you'll want to override the environment reported by `Rails.env` with an
|
68
|
+
# environment variable like this: `ROLLBAR_ENV=staging`. This is a recommended
|
69
|
+
# setup for Heroku. See:
|
70
|
+
# https://devcenter.heroku.com/articles/deploying-to-a-custom-rails-environment
|
71
|
+
config.environment = ENV['ROLLBAR_ENV'].presence || Rails.env
|
72
|
+
end
|
73
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
if ENV["SENTRY_DSN"]
|
2
|
+
|
1
3
|
Sentry.init do |config|
|
2
4
|
config.dsn = ENV["SENTRY_DSN"]
|
3
5
|
config.breadcrumbs_logger = [:active_support_logger, :http_logger]
|
@@ -10,4 +12,6 @@ Sentry.init do |config|
|
|
10
12
|
config.traces_sampler = lambda do |context|
|
11
13
|
true
|
12
14
|
end
|
13
|
-
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
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.5.
|
4
|
+
version: 1.5.4
|
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-
|
11
|
+
date: 2023-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,6 +52,7 @@ files:
|
|
52
52
|
- lib/generators/templates/fly.toml.erb
|
53
53
|
- lib/generators/templates/litefs.yml.erb
|
54
54
|
- lib/generators/templates/node-version.erb
|
55
|
+
- lib/generators/templates/rollbar.rb.erb
|
55
56
|
- lib/generators/templates/sentry.rb.erb
|
56
57
|
homepage: https://github.com/fly-apps/dockerfile-rails
|
57
58
|
licenses:
|