dockerfile-rails 1.0.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/DEMO.md +28 -0
- data/README.md +1 -1
- data/lib/dockerfile-rails/scanner.rb +1 -3
- data/lib/generators/dockerfile_generator.rb +62 -5
- data/lib/generators/templates/Dockerfile.erb +10 -8
- data/lib/generators/templates/_apt_install.erb +3 -3
- data/lib/generators/templates/_npm_install.erb +4 -1
- data/lib/generators/templates/docker-compose.yml.erb +23 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0227d5ff2b7d0a0d42d48ba7e3be63280ea528f3f80417a6419dfebbec44b3a7
|
4
|
+
data.tar.gz: ee9b4b14b72b85193a6e7b54862f6643b02896c5ff4636b294a845e7ae6a1b35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e9f99b443c3cab5dca0d5800eb996b7f727ef0dbfcf44ad0e1586edf1ed9691b3cafbf1c608f207a55c63fd9d768e2796c4d3644c3e6715214ca5aa159ae122
|
7
|
+
data.tar.gz: 6980319c05859df14c35649159c874271162ff83ac1c2918e4c959c93f6f39b29f5a4002cbf9305f82404ae8b5d00ee4d0e401e420c37a86abb6b0c8362adcf8
|
data/DEMO.md
CHANGED
@@ -275,3 +275,31 @@ bin/rails generate dockerfile
|
|
275
275
|
docker buildx build . -t rails-welcome
|
276
276
|
docker run -p 3000:3000 -e RAILS_MASTER_KEY=$(cat config/master.key) rails-welcome
|
277
277
|
```
|
278
|
+
|
279
|
+
# Demo 5 - Grover / puppeteer / Chrome
|
280
|
+
|
281
|
+
This demo runs only on Intel hardware as Google doesn't supply Chrome
|
282
|
+
binaries for Linux on ARM.
|
283
|
+
|
284
|
+
```bash
|
285
|
+
rails new welcome --minimal
|
286
|
+
cd welcome
|
287
|
+
bundle add grover
|
288
|
+
npm install puppeteer
|
289
|
+
|
290
|
+
echo 'Rails.application.routes.draw { root "grover#pdf" }' > config/routes.rb
|
291
|
+
|
292
|
+
cat << 'EOF' > app/controllers/grover_controller.rb
|
293
|
+
class GroverController < ApplicationController
|
294
|
+
def pdf
|
295
|
+
grover = Grover.new('https://google.com', format: 'A4')
|
296
|
+
send_data grover.to_pdf, filename: 'google.pdf', type: :pdf
|
297
|
+
end
|
298
|
+
end
|
299
|
+
EOF
|
300
|
+
|
301
|
+
bundle add dockerfile-rails --group development
|
302
|
+
bin/rails generate dockerfile
|
303
|
+
docker buildx build . -t rails-welcome
|
304
|
+
docker run -p 3000:3000 -e RAILS_MASTER_KEY=$(cat config/master.key) rails-welcome
|
305
|
+
```
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Provides a Rails generator to produce Dockerfiles and related files. This is be
|
|
10
10
|
## Usage
|
11
11
|
|
12
12
|
```
|
13
|
-
bundle add dockerfile-rails --
|
13
|
+
bundle add dockerfile-rails --optimistic --group development
|
14
14
|
bin/rails generate dockerfile
|
15
15
|
```
|
16
16
|
|
@@ -40,9 +40,7 @@ module DockerfileRails
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
@sidekiq = @gemfile.include? 'sidekiq'
|
44
43
|
@anycable = @gemfile.include? 'anycable-rails'
|
45
|
-
@rmagick = @gemfile.include? 'rmagick'
|
46
44
|
@vips = @gemfile.include? 'ruby-vips'
|
47
45
|
@bootstrap = @gemfile.include? 'bootstrap'
|
48
46
|
@puppeteer = @gemfile.include? 'puppeteer'
|
@@ -73,7 +71,7 @@ module DockerfileRails
|
|
73
71
|
@redis_cache = true
|
74
72
|
end
|
75
73
|
|
76
|
-
@redis = @redis_cable || @redis_cache
|
74
|
+
@redis = @redis_cable || @redis_cache
|
77
75
|
end
|
78
76
|
end
|
79
77
|
end
|
@@ -142,11 +142,19 @@ private
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def using_redis?
|
145
|
-
options.redis? or @redis
|
145
|
+
options.redis? or @redis or @gemfile.include?('sidekiq')
|
146
146
|
end
|
147
147
|
|
148
148
|
def using_execjs?
|
149
|
-
@gemfile.include?
|
149
|
+
@gemfile.include?('execjs') or @gemfile.include?('grover')
|
150
|
+
end
|
151
|
+
|
152
|
+
def using_puppeteer?
|
153
|
+
@gemfile.include?('grover') or @gemfile.include?('puppeteer-ruby')
|
154
|
+
end
|
155
|
+
|
156
|
+
def using_sidekiq?
|
157
|
+
@gemfile.include?('sidekiq')
|
150
158
|
end
|
151
159
|
|
152
160
|
def parallel?
|
@@ -172,6 +180,27 @@ private
|
|
172
180
|
end
|
173
181
|
end
|
174
182
|
|
183
|
+
def base_packages
|
184
|
+
packages = []
|
185
|
+
|
186
|
+
if using_execjs?
|
187
|
+
packages += %w(curl unzip)
|
188
|
+
end
|
189
|
+
|
190
|
+
if using_puppeteer?
|
191
|
+
packages += %w(curl gnupg)
|
192
|
+
end
|
193
|
+
|
194
|
+
packages.sort.uniq
|
195
|
+
end
|
196
|
+
|
197
|
+
def base_requirements
|
198
|
+
requirements = []
|
199
|
+
requirements << 'nodejs' if using_execjs?
|
200
|
+
requirements << 'chrome' if using_puppeteer?
|
201
|
+
requirements.join(' and ')
|
202
|
+
end
|
203
|
+
|
175
204
|
def build_packages
|
176
205
|
# start with the essentials
|
177
206
|
packages = %w(build-essential)
|
@@ -184,7 +213,7 @@ private
|
|
184
213
|
# add git if needed to install gems
|
185
214
|
packages << 'git' if @git
|
186
215
|
|
187
|
-
# add redis
|
216
|
+
# add redis if Action Cable, caching, or sidekiq are used
|
188
217
|
packages << "redis" if options.redis? or using_redis?
|
189
218
|
|
190
219
|
# ActiveStorage preview support
|
@@ -196,7 +225,7 @@ private
|
|
196
225
|
# node support, including support for building native modules
|
197
226
|
if using_node?
|
198
227
|
packages += %w(node-gyp pkg-config)
|
199
|
-
packages += %w(curl unzip) unless using_execjs?
|
228
|
+
packages += %w(curl unzip) unless using_execjs? or using_puppeteer?
|
200
229
|
|
201
230
|
# module build process depends on Python, and debian changed
|
202
231
|
# how python is installed with the bullseye release. Below
|
@@ -236,11 +265,34 @@ private
|
|
236
265
|
packages << "libvips" if @gemfile.include? 'ruby-vips'
|
237
266
|
|
238
267
|
# Rmagick gem
|
239
|
-
|
268
|
+
if @gemfile.include?('rmagick') or @gemfile.include?('mini_magick')
|
269
|
+
packages << 'imagemagick'
|
270
|
+
end
|
271
|
+
|
272
|
+
# Puppeteer
|
273
|
+
packages << 'google-chrome-stable' if using_puppeteer?
|
240
274
|
|
241
275
|
packages.sort
|
242
276
|
end
|
243
277
|
|
278
|
+
def deploy_repos
|
279
|
+
repos = []
|
280
|
+
|
281
|
+
if using_puppeteer?
|
282
|
+
repos += [
|
283
|
+
"curl https://dl-ssl.google.com/linux/linux_signing_key.pub |",
|
284
|
+
"gpg --dearmor > /etc/apt/trusted.gpg.d/google-archive.gpg &&",
|
285
|
+
'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
|
286
|
+
]
|
287
|
+
end
|
288
|
+
|
289
|
+
if repos.empty?
|
290
|
+
''
|
291
|
+
else
|
292
|
+
repos.join(" \\\n ") + " && \\\n "
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
244
296
|
def deploy_env
|
245
297
|
env = []
|
246
298
|
|
@@ -263,6 +315,11 @@ private
|
|
263
315
|
env << 'MALLOC_CONF="dirty_decay_ms:1000,narenas:2,background_thread:true"'
|
264
316
|
end
|
265
317
|
|
318
|
+
if using_puppeteer?
|
319
|
+
env << 'GROVER_NO_SANDBOX="true"' if @gemfile.include? 'grover'
|
320
|
+
env << 'PUPPETEER_EXECUTABLE_PATH="/usr/bin/google-chrome"'
|
321
|
+
end
|
322
|
+
|
266
323
|
env
|
267
324
|
end
|
268
325
|
|
@@ -26,10 +26,12 @@ ARG BUNDLER_VERSION=<%= Bundler::VERSION %>
|
|
26
26
|
RUN gem update --system --no-document && \
|
27
27
|
gem install -N bundler -v ${BUNDLER_VERSION}
|
28
28
|
|
29
|
-
<%
|
30
|
-
# Install packages needed to install
|
31
|
-
<%= render partial: 'apt_install', locals: {packages:
|
29
|
+
<% unless base_requirements.empty? -%>
|
30
|
+
# Install packages needed to install <%= base_requirements %>
|
31
|
+
<%= render partial: 'apt_install', locals: {packages: base_packages, clean: true, repos: ''} %>
|
32
32
|
|
33
|
+
<% end -%>
|
34
|
+
<% if using_execjs? -%>
|
33
35
|
<%= render partial: 'install_node', locals: {yarn_version: nil} %>
|
34
36
|
|
35
37
|
<% end -%>
|
@@ -38,15 +40,15 @@ RUN gem update --system --no-document && \
|
|
38
40
|
FROM base as <%= parallel? ? 'pre' : '' %>build
|
39
41
|
|
40
42
|
# Install packages needed to build gems<%= using_node? ? " and node modules" : "" %>
|
41
|
-
<%= render partial: 'apt_install', locals: {packages: build_packages, clean: false} %>
|
43
|
+
<%= render partial: 'apt_install', locals: {packages: build_packages, clean: false, repos: ''} %>
|
42
44
|
|
43
45
|
<% if parallel? -%>
|
44
46
|
|
45
47
|
FROM prebuild as node
|
46
48
|
|
47
49
|
<% end -%>
|
48
|
-
<% if using_node? -%>
|
49
|
-
<%= render partial: 'install_node', locals: {node_version: using_execjs? ? nil : node_version} %>
|
50
|
+
<% if using_node? and (!using_execjs? || File.exist?('yarn.lock')) -%>
|
51
|
+
<%= render partial: 'install_node', locals: {node_version: using_execjs? ? nil : node_version, yarn_version: File.exist?('yarn.lock') ? yarn_version : nil} %>
|
50
52
|
|
51
53
|
<% end -%>
|
52
54
|
<% if parallel? -%>
|
@@ -81,7 +83,7 @@ RUN bundle _${BUNDLER_VERSION}_ install<% if depend_on_bootsnap? -%> && \
|
|
81
83
|
COPY --from=node /rails/node_modules /rails/node_modules
|
82
84
|
|
83
85
|
<% elsif using_node? -%>
|
84
|
-
<%= render partial: 'npm_install', locals: {sources:
|
86
|
+
<%= render partial: 'npm_install', locals: {sources: Dir[*%w(package.json package-lock.json yarn.lock)]} %>
|
85
87
|
|
86
88
|
<% end -%>
|
87
89
|
# Copy application code
|
@@ -112,7 +114,7 @@ FROM base
|
|
112
114
|
<% unless deploy_packages.empty? -%>
|
113
115
|
|
114
116
|
# Install packages needed for deployment
|
115
|
-
<%= render partial: 'apt_install', locals: {packages: deploy_packages, clean: true} %>
|
117
|
+
<%= render partial: 'apt_install', locals: {packages: deploy_packages, clean: true, repos: deploy_repos} %>
|
116
118
|
<% end -%>
|
117
119
|
|
118
120
|
# Copy built application from previous stage
|
@@ -1,10 +1,10 @@
|
|
1
1
|
<% if options.cache? -%>
|
2
2
|
RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \
|
3
3
|
--mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \
|
4
|
-
apt-get update -qq && \
|
4
|
+
<%= repos %>apt-get update -qq && \
|
5
5
|
apt-get install --no-install-recommends -y <%= packages.join(" ") %>
|
6
6
|
<% else -%>
|
7
|
-
RUN apt-get update -qq && \
|
7
|
+
RUN <%= repos %>apt-get update -qq && \
|
8
8
|
apt-get install --no-install-recommends -y <%= packages.join(" ") %><% if clean %> && \
|
9
9
|
rm -rf /var/lib/apt/lists /var/cache/apt/archives<% end %>
|
10
10
|
<% end -%>
|
@@ -17,4 +17,4 @@ RUN apt-get update -qq && \
|
|
17
17
|
make && \
|
18
18
|
make install
|
19
19
|
<% end -%>
|
20
|
-
|
20
|
+
|
@@ -1,4 +1,7 @@
|
|
1
1
|
# Install node modules
|
2
|
+
<% if using_puppeteer? -%>
|
3
|
+
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true"
|
4
|
+
<% end -%>
|
2
5
|
COPY <%=sources.join(' ') %> .
|
3
6
|
<% if sources.join.include? 'yarn' -%>
|
4
7
|
<% if options.cache? -%>
|
@@ -14,4 +17,4 @@ RUN --mount=type=cache,id=bld-npm-cache,target=/root/.npm \
|
|
14
17
|
<% else -%>
|
15
18
|
RUN npm install
|
16
19
|
<% end -%>
|
17
|
-
<% end -%>
|
20
|
+
<% end -%>
|
@@ -68,4 +68,27 @@ services:
|
|
68
68
|
|
69
69
|
redis-db:
|
70
70
|
image: redis
|
71
|
+
<% end -%>
|
72
|
+
<% if using_sidekiq? and deploy_database != 'sqlite3' -%>
|
73
|
+
|
74
|
+
sidekiq:
|
75
|
+
build: .
|
76
|
+
environment:
|
77
|
+
- RAILS_MASTER_KEY=$RAILS_MASTER_KEY
|
78
|
+
- REDIS_URL=redis://redis-db:6379
|
79
|
+
<% if deploy_database == 'postgresql' -%>
|
80
|
+
- DATABASE_URL=postgres://root:password@postgres-db/
|
81
|
+
<% elsif deploy_database == 'mysql' -%>
|
82
|
+
- DATABASE_URL=mysql2://root:password@mysql-db/
|
83
|
+
<% end -%>
|
84
|
+
depends_on:
|
85
|
+
redis-db:
|
86
|
+
condition: service_started
|
87
|
+
<% if deploy_database == 'postgresql' -%>
|
88
|
+
postgres-db:
|
89
|
+
condition: service_healthy
|
90
|
+
<% elsif deploy_database == 'mysql' -%>
|
91
|
+
mysql-db:
|
92
|
+
condition: service_healthy
|
93
|
+
<% end -%>
|
71
94
|
<% 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.0.
|
4
|
+
version: 1.0.2
|
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-01
|
11
|
+
date: 2023-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|