dockerfile-rails 0.4.9 → 0.5.1
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 +4 -4
- data/README.md +7 -3
- data/lib/dockerfile-rails/scanner.rb +1 -1
- data/lib/generators/dockerfile_generator.rb +77 -14
- data/lib/generators/templates/Dockerfile.erb +7 -9
- data/lib/generators/templates/docker-entrypoint.erb +5 -0
- data/lib/generators/templates/dockerfile.yml.erb +3 -0
- 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: 5146ba972235a473c3018799f3b75bc7856dad4c7c1e1b34a9fc0e87aa0de196
|
4
|
+
data.tar.gz: f9848a9d5103550a9fe7e1be7ee3820d4f99cee50ec39cc53933f568ffe29357
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14b6231959a35395703f0019a2c4e38062dd6b8d37d2c5c936dad2920c120118f7c95ad80a4c4d6591449bc2c79fc86c4ffd35bf3ac107ca6894291906ddd23b
|
7
|
+
data.tar.gz: d62ba6ea16c3705de8bc1606d8c1adbca6c91e591ff949d0d132f7f47b315662cc2659919a25febe9628dce5b7a9c34e5215dba0081b79525f6dae99b0fe4c3b
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
## Overview
|
2
2
|
|
3
|
-
Provides Rails
|
3
|
+
Provides a Rails generator to produce Dockerfiles and related files. This is being proposed as the generator to be included in Rails 7.1, and a substantial number of pull requests along those lines have already been merged. This repository contains fixes and features beyond those pull requests. Highlights:
|
4
4
|
|
5
5
|
* Supports all [Rails supported releases](https://guides.rubyonrails.org/maintenance_policy.html), not just Rails 7.1, and likely works with a number of previous releases.
|
6
6
|
* Can be customized using flags on the `generate dockerfile` command, and rerun to produce a custom tailored dockerfile based on detecting the actual features used by your application.
|
@@ -9,7 +9,7 @@ Provides Rails generators to produce Dockerfiles and related files. This is bei
|
|
9
9
|
## Usage
|
10
10
|
|
11
11
|
```
|
12
|
-
bundle add dockerfile-rails --group development
|
12
|
+
bundle add dockerfile-rails --version ">= 0.5.0" --group development
|
13
13
|
bin/rails generate dockerfile
|
14
14
|
```
|
15
15
|
|
@@ -18,6 +18,7 @@ General options:
|
|
18
18
|
* `--force` - overwrite existing files
|
19
19
|
* `--ci` - include test gems in deployed image
|
20
20
|
* `--bin-cd` - adjust binstubs to set current working directory
|
21
|
+
* `--no-prepare` - omit `db:prepare`. Useful for cloud platforms with [release](https://devcenter.heroku.com/articles/release-phase) phases.
|
21
22
|
* `--platform=s` - specify target platform. See [FROM](https://docs.docker.com/engine/reference/builder/#from) for details.
|
22
23
|
* `--cache` - use build caching to speed up builds
|
23
24
|
* `--parallel` - use multi-stage builds to install gems and node modules in parallel
|
@@ -34,13 +35,15 @@ additional support may be needed:
|
|
34
35
|
* `--redis` - add redis libraries
|
35
36
|
* `--sqlite3` - add sqlite3 libraries
|
36
37
|
|
37
|
-
Optimizations:
|
38
|
+
Runtime Optimizations:
|
38
39
|
|
39
40
|
* `--fullstaq` - use [fullstaq](https://fullstaqruby.org/) [images](https://github.com/evilmartians/fullstaq-ruby-docker) on [quay.io](https://quay.io/repository/evl.ms/fullstaq-ruby?tab=tags&tag=latest)
|
40
41
|
* `--jemalloc` - use [jemalloc](https://jemalloc.net/) memory allocator
|
41
42
|
* `--yjit` - enable [YJIT](https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md) optimizing compiler
|
42
43
|
* `--swap=n` - allocate swap space. See [falloc options](https://man7.org/linux/man-pages/man1/fallocate.1.html#OPTIONS) for suffixes
|
43
44
|
|
45
|
+
Options are saved between runs into `config/dockerfile.yml`. To invert a boolean options, add or remove a `no-` prefix from the option name.
|
46
|
+
|
44
47
|
## Testing
|
45
48
|
|
46
49
|
The current testing strategy is to run `rails new` and `generate dockerfile` with various configurations and compare the generated artifacts with expected results. `ARG` values in `Dockerfiles` are masked before comparison.
|
@@ -74,3 +77,4 @@ Many of the following links relate to the current development status with respec
|
|
74
77
|
* [Rails Dockerfile futures](https://discuss.rubyonrails.org/t/rails-dockerfile-futures/82091/1) - rationale for a generator
|
75
78
|
* [Fly Cookbooks](https://fly.io/docs/rails/cookbooks/) - deeper dive into Dockerfile design choices
|
76
79
|
* [app/templates/Dockerfile.tt](https://github.com/rails/rails/blob/main/railties/lib/rails/generators/rails/app/templates/Dockerfile.tt) - current Rails 7.1 template
|
80
|
+
* Fly.io [Cut over to Rails Dockerfile Generator on Sunday 29 Jan 2023](https://community.fly.io/t/cut-over-to-rails-dockerfile-generator-on-sunday-29-jan-2023/10350)
|
@@ -4,51 +4,87 @@ require_relative '../dockerfile-rails/scanner.rb'
|
|
4
4
|
class DockerfileGenerator < Rails::Generators::Base
|
5
5
|
include DockerfileRails::Scanner
|
6
6
|
|
7
|
-
|
7
|
+
OPTION_DEFAULTS = OpenStruct.new(
|
8
|
+
'bin-cd' => false,
|
9
|
+
'cache' => false,
|
10
|
+
'ci' => false,
|
11
|
+
'compose' => false,
|
12
|
+
'fullstaq' => false,
|
13
|
+
'jemalloc' => false,
|
14
|
+
'mysql' => false,
|
15
|
+
'parallel' => false,
|
16
|
+
'platform' => nil,
|
17
|
+
'postgresql' => false,
|
18
|
+
'prepare' => true,
|
19
|
+
'redis' => false,
|
20
|
+
'swap' => nil,
|
21
|
+
'yjit' => false,
|
22
|
+
)
|
23
|
+
|
24
|
+
# load defaults from config file
|
25
|
+
if File.exist? 'config/dockerfile.yml'
|
26
|
+
options = YAML.safe_load_file('config/dockerfile.yml', symbolize_names: true)[:options]
|
27
|
+
if options
|
28
|
+
OPTION_DEFAULTS.to_h.each do |option, value|
|
29
|
+
OPTION_DEFAULTS[option] = options[option] if options.include? option
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class_option :ci, type: :boolean, default: OPTION_DEFAULTS.ci,
|
8
35
|
desc: 'include test gems in bundle'
|
9
36
|
|
10
|
-
class_option 'bin-cd', type: :boolean, default:
|
37
|
+
class_option 'bin-cd', type: :boolean, default: OPTION_DEFAULTS['bin-cd'],
|
11
38
|
desc: 'modify binstubs to set working directory'
|
12
39
|
|
13
|
-
class_option :cache, type: :boolean, default:
|
40
|
+
class_option :cache, type: :boolean, default: OPTION_DEFAULTS.cache,
|
14
41
|
desc: 'use build cache to speed up installs'
|
15
42
|
|
16
|
-
class_option :
|
43
|
+
class_option :prepare, type: :boolean, default: OPTION_DEFAULTS.prepare,
|
44
|
+
desc: 'include db:prepare step'
|
45
|
+
|
46
|
+
class_option :parallel, type: :boolean, default: OPTION_DEFAULTS.parallel,
|
17
47
|
desc: 'use build stages to install gems and node modules in parallel'
|
18
48
|
|
19
|
-
class_option :swap, type: :string, default:
|
49
|
+
class_option :swap, type: :string, default: OPTION_DEFAULTS.swap,
|
20
50
|
desc: 'allocate swapspace'
|
21
51
|
|
22
|
-
class_option :compose, type: :boolean, default:
|
52
|
+
class_option :compose, type: :boolean, default: OPTION_DEFAULTS.compose,
|
23
53
|
desc: 'generate a docker-compose.yml file'
|
24
54
|
|
25
|
-
class_option :redis, type: :boolean, default:
|
55
|
+
class_option :redis, type: :boolean, default: OPTION_DEFAULTS.redis,
|
26
56
|
desc: 'include redis libraries'
|
27
57
|
|
28
|
-
class_option :sqlite3, aliases: '--sqlite', type: :boolean, default:
|
58
|
+
class_option :sqlite3, aliases: '--sqlite', type: :boolean, default: OPTION_DEFAULTS.sqlite3,
|
29
59
|
desc: 'include sqlite3 libraries'
|
30
60
|
|
31
|
-
class_option :postgresql, aliases: '--postgres', type: :boolean, default:
|
61
|
+
class_option :postgresql, aliases: '--postgres', type: :boolean, default: OPTION_DEFAULTS.postgresql,
|
32
62
|
desc: 'include postgresql libraries'
|
33
63
|
|
34
|
-
class_option :mysql, type: :boolean, default:
|
64
|
+
class_option :mysql, type: :boolean, default: OPTION_DEFAULTS.mysql,
|
35
65
|
desc: 'include mysql libraries'
|
36
66
|
|
37
|
-
class_option :platform, type: :string, default:
|
67
|
+
class_option :platform, type: :string, default: OPTION_DEFAULTS.platform,
|
38
68
|
desc: 'image platform (example: linux/arm64)'
|
39
69
|
|
40
|
-
class_option :jemalloc, type: :boolean, default:
|
70
|
+
class_option :jemalloc, type: :boolean, default: OPTION_DEFAULTS.jemalloc,
|
41
71
|
desc: 'use jemalloc alternative malloc implementation'
|
42
72
|
|
43
|
-
class_option :fullstaq, type: :boolean, default:
|
73
|
+
class_option :fullstaq, type: :boolean, default: OPTION_DEFAULTS.fullstaq,
|
44
74
|
descr: 'use Fullstaq Ruby image from Quay.io'
|
45
75
|
|
46
|
-
class_option :yjit, type: :boolean, default:
|
76
|
+
class_option :yjit, type: :boolean, default: OPTION_DEFAULTS.yjit,
|
47
77
|
desc: 'enable YJIT optimizing compiler'
|
48
78
|
|
49
79
|
def generate_app
|
50
80
|
source_paths.push File.expand_path('./templates', __dir__)
|
51
81
|
|
82
|
+
# gather up options for config file
|
83
|
+
@dockerfile_config = OPTION_DEFAULTS.dup.to_h.stringify_keys
|
84
|
+
options.to_h.each do |option, value|
|
85
|
+
@dockerfile_config[option] = value if @dockerfile_config.include? option
|
86
|
+
end
|
87
|
+
|
52
88
|
scan_rails_app
|
53
89
|
|
54
90
|
template 'Dockerfile.erb', 'Dockerfile'
|
@@ -60,6 +96,8 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
60
96
|
chmod "bin/docker-entrypoint", 0755 & ~File.umask, verbose: false
|
61
97
|
|
62
98
|
template 'docker-compose.yml.erb', 'docker-compose.yml' if options.compose
|
99
|
+
|
100
|
+
template 'dockerfile.yml.erb', 'config/dockerfile.yml'
|
63
101
|
end
|
64
102
|
|
65
103
|
private
|
@@ -187,6 +225,31 @@ private
|
|
187
225
|
packages.sort
|
188
226
|
end
|
189
227
|
|
228
|
+
def deploy_env
|
229
|
+
env = []
|
230
|
+
|
231
|
+
if Rails::VERSION::MAJOR<7 || Rails::VERSION::STRING.start_with?('7.0')
|
232
|
+
env << 'RAILS_LOG_TO_STDOUT="1"'
|
233
|
+
env << 'RAILS_SERVE_STATIC_FILES="true"'
|
234
|
+
end
|
235
|
+
|
236
|
+
if options.yjit
|
237
|
+
env << 'RUBY_YJIT_ENABLE="1"'
|
238
|
+
end
|
239
|
+
|
240
|
+
if options.jemalloc and not options.fullstaq
|
241
|
+
if (options.platform || Gem::Platform::local.cpu).include? 'arm'
|
242
|
+
env << 'LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libjemalloc.so.2"'
|
243
|
+
else
|
244
|
+
env << 'LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2"'
|
245
|
+
end
|
246
|
+
|
247
|
+
env << 'MALLOC_CONF="dirty_decay_ms:1000,narenas:2,background_thread:true"'
|
248
|
+
end
|
249
|
+
|
250
|
+
env
|
251
|
+
end
|
252
|
+
|
190
253
|
def binfile_fixups
|
191
254
|
# binfiles may have OS specific paths to ruby. Normalize them.
|
192
255
|
shebangs = Dir["bin/*"].map { |file| IO.read(file).lines.first }.join
|
@@ -126,18 +126,16 @@ COPY --from=build /rails /rails
|
|
126
126
|
COPY --from=client /rails/<%= api_client_dir %>/build /rails/public
|
127
127
|
<% end -%>
|
128
128
|
|
129
|
+
<% unless deploy_env.empty? -%>
|
129
130
|
# Deployment options
|
130
|
-
ENV
|
131
|
-
RAILS_SERVE_STATIC_FILES="true"<% if options.yjit %> \
|
132
|
-
RUBY_YJIT_ENABLE="1"<% end %><% if options.jemalloc and not options.fullstaq %> \
|
133
|
-
<% if (options.platform || Gem::Platform::local.cpu).include? 'arm' -%>
|
134
|
-
LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libjemalloc.so.2" \
|
135
|
-
<% else -%>
|
136
|
-
LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2" \
|
137
|
-
<% end -%>
|
138
|
-
MALLOC_CONF="dirty_decay_ms:1000,narenas:2,background_thread:true"<% end %>
|
131
|
+
ENV <%= deploy_env.join(" \\\n ") %>
|
139
132
|
|
133
|
+
<% end -%>
|
134
|
+
<% if options.prepare -%>
|
140
135
|
# Entrypoint prepares the database.
|
136
|
+
<% else -%>
|
137
|
+
# Entrypoint sets up the container.
|
138
|
+
<% end -%>
|
141
139
|
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
|
142
140
|
|
143
141
|
# Start the server by default, this can be overwritten at runtime
|
@@ -10,9 +10,14 @@ swapon /swapfile
|
|
10
10
|
echo 1 > /proc/sys/vm/overcommit_memory
|
11
11
|
|
12
12
|
<% end -%>
|
13
|
+
<% if options.prepare -%>
|
13
14
|
# If running the rails server then create or migrate existing database
|
14
15
|
if [ "${*}" == "./bin/rails server" ]; then
|
15
16
|
./bin/rails <%= dbprep_command %>
|
16
17
|
fi
|
17
18
|
|
19
|
+
<% elsif !options.swap -%>
|
20
|
+
# Add any container initialization steps here
|
21
|
+
|
22
|
+
<% end -%>
|
18
23
|
exec "${@}"
|
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: 0.
|
4
|
+
version: 0.5.1
|
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-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- lib/generators/templates/_npm_install.erb
|
45
45
|
- lib/generators/templates/docker-compose.yml.erb
|
46
46
|
- lib/generators/templates/docker-entrypoint.erb
|
47
|
+
- lib/generators/templates/dockerfile.yml.erb
|
47
48
|
- lib/generators/templates/dockerignore.erb
|
48
49
|
- lib/generators/templates/node-version.erb
|
49
50
|
homepage: https://github.com/rubys/dockerfile-rails
|