dockerfile-rails 0.4.9 → 0.5.0

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: 92c7394bd97da528362105514f095458b56872645ce0c3082c748c7bee22c54f
4
- data.tar.gz: e7a158e41126aa6321e5b4461951b6323f7fa950f8eef8eb366ee436454c0057
3
+ metadata.gz: 906eaaf2f4166356a6cece9b347dd58a29324a0e7a3d0f557cfea85054c34816
4
+ data.tar.gz: 0c071eb1fd4da339676916705498c18fb2d5e08e0115b8f47745def8229390e3
5
5
  SHA512:
6
- metadata.gz: 35619e605b9ed5176157c841efb21f4cfec9029c6383732d440bd9a440144719c8cc62e43974124148d5dbc1fb2705bd0160d4581f6829aa8ccdeb0040b665bb
7
- data.tar.gz: 94b595caa9b67e1d814b863f535eae373dca80a5b14d410122a0b0199fdb46955ddb6d7609f3ce58945e9419047da6128864a751f8af36dbb2d8230bfd87f1d8
6
+ metadata.gz: 66b27141d048276513a4384b6dd88fae87f929d2128a9e6a19187cac6a1d75f751d5e261ccd4f94424ae7ae53ca0713141db34163d04cb997a719731a6e39dde
7
+ data.tar.gz: 7e927389954e205c3cc89e6de75506d85265ac394a749f0b394d9b5263b4de719a5dc935d8ff493f1c1cfdc30854b70f7f5b77f6c48599095a7132f0f050a0cd
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## Overview
2
2
 
3
- Provides Rails generators 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:
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.
@@ -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.
@@ -4,51 +4,86 @@ require_relative '../dockerfile-rails/scanner.rb'
4
4
  class DockerfileGenerator < Rails::Generators::Base
5
5
  include DockerfileRails::Scanner
6
6
 
7
- class_option :ci, type: :boolean, default: false,
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
+ 'prepare' => true,
18
+ 'redis' => false,
19
+ 'swap' => nil,
20
+ 'yjit' => false,
21
+ )
22
+
23
+ # load defaults from config file
24
+ if File.exist? 'config/dockerfile.yml'
25
+ options = YAML.safe_load_file('config/dockerfile.yml', symbolize_names: true)[:options]
26
+ if options
27
+ OPTION_DEFAULTS.to_h.each do |option, value|
28
+ OPTION_DEFAULTS[option] = options[option] if options.include? option
29
+ end
30
+ end
31
+ end
32
+
33
+ class_option :ci, type: :boolean, default: OPTION_DEFAULTS.ci,
8
34
  desc: 'include test gems in bundle'
9
35
 
10
- class_option 'bin-cd', type: :boolean, default: false,
36
+ class_option 'bin-cd', type: :boolean, default: OPTION_DEFAULTS['bin-cd'],
11
37
  desc: 'modify binstubs to set working directory'
12
38
 
13
- class_option :cache, type: :boolean, default: false,
39
+ class_option :cache, type: :boolean, default: OPTION_DEFAULTS.cache,
14
40
  desc: 'use build cache to speed up installs'
15
41
 
16
- class_option :parallel, type: :boolean, default: false,
42
+ class_option :prepare, type: :boolean, default: OPTION_DEFAULTS.prepare,
43
+ desc: 'include db:prepare step'
44
+
45
+ class_option :parallel, type: :boolean, default: OPTION_DEFAULTS.parallel,
17
46
  desc: 'use build stages to install gems and node modules in parallel'
18
47
 
19
- class_option :swap, type: :string, default: nil,
48
+ class_option :swap, type: :string, default: OPTION_DEFAULTS.swap,
20
49
  desc: 'allocate swapspace'
21
50
 
22
- class_option :compose, type: :boolean, default: false,
51
+ class_option :compose, type: :boolean, default: OPTION_DEFAULTS.compose,
23
52
  desc: 'generate a docker-compose.yml file'
24
53
 
25
- class_option :redis, type: :boolean, default: false,
54
+ class_option :redis, type: :boolean, default: OPTION_DEFAULTS.redis,
26
55
  desc: 'include redis libraries'
27
56
 
28
- class_option :sqlite3, aliases: '--sqlite', type: :boolean, default: false,
57
+ class_option :sqlite3, aliases: '--sqlite', type: :boolean, default: OPTION_DEFAULTS.sqlite3,
29
58
  desc: 'include sqlite3 libraries'
30
59
 
31
- class_option :postgresql, aliases: '--postgres', type: :boolean, default: false,
60
+ class_option :postgresql, aliases: '--postgres', type: :boolean, default: OPTION_DEFAULTS.postgresql,
32
61
  desc: 'include postgresql libraries'
33
62
 
34
- class_option :mysql, type: :boolean, default: false,
63
+ class_option :mysql, type: :boolean, default: OPTION_DEFAULTS.mysql,
35
64
  desc: 'include mysql libraries'
36
65
 
37
- class_option :platform, type: :string, default: nil,
66
+ class_option :platform, type: :string, default: OPTION_DEFAULTS.platform,
38
67
  desc: 'image platform (example: linux/arm64)'
39
68
 
40
- class_option :jemalloc, type: :boolean, default: false,
69
+ class_option :jemalloc, type: :boolean, default: OPTION_DEFAULTS.jemalloc,
41
70
  desc: 'use jemalloc alternative malloc implementation'
42
71
 
43
- class_option :fullstaq, type: :boolean, default: false,
72
+ class_option :fullstaq, type: :boolean, default: OPTION_DEFAULTS.fullstaq,
44
73
  descr: 'use Fullstaq Ruby image from Quay.io'
45
74
 
46
- class_option :yjit, type: :boolean, default: false,
75
+ class_option :yjit, type: :boolean, default: OPTION_DEFAULTS.yjit,
47
76
  desc: 'enable YJIT optimizing compiler'
48
77
 
49
78
  def generate_app
50
79
  source_paths.push File.expand_path('./templates', __dir__)
51
80
 
81
+ # gather up options for config file
82
+ @dockerfile_config = OPTION_DEFAULTS.dup.to_h.stringify_keys
83
+ options.to_h.each do |option, value|
84
+ @dockerfile_config[option] = value if @dockerfile_config.include? option
85
+ end
86
+
52
87
  scan_rails_app
53
88
 
54
89
  template 'Dockerfile.erb', 'Dockerfile'
@@ -60,6 +95,8 @@ class DockerfileGenerator < Rails::Generators::Base
60
95
  chmod "bin/docker-entrypoint", 0755 & ~File.umask, verbose: false
61
96
 
62
97
  template 'docker-compose.yml.erb', 'docker-compose.yml' if options.compose
98
+
99
+ template 'dockerfile.yml.erb', 'config/dockerfile.yml'
63
100
  end
64
101
 
65
102
  private
@@ -137,7 +137,11 @@ ENV RAILS_LOG_TO_STDOUT="1" \
137
137
  <% end -%>
138
138
  MALLOC_CONF="dirty_decay_ms:1000,narenas:2,background_thread:true"<% end %>
139
139
 
140
+ <% if options.prepare -%>
140
141
  # Entrypoint prepares the database.
142
+ <% else -%>
143
+ # Entrypoint sets up the container.
144
+ <% end -%>
141
145
  ENTRYPOINT ["/rails/bin/docker-entrypoint"]
142
146
 
143
147
  # 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 "${@}"
@@ -0,0 +1,3 @@
1
+ # generated by dockerfile-rails
2
+
3
+ <%= YAML.dump('options' => @dockerfile_config) %>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockerfile-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.9
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Ruby
@@ -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