dockerfile-rails 0.0.1 → 0.0.2
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e00977164abc39c9b3b66c636834cda09f32f939045db5a5f496b51a455ee4f
|
4
|
+
data.tar.gz: bc3305fa419473f18eace29a65a9461fbd90c423106ff3cf1c5c42d0ed3b58ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d92c231f9d0484dcc196837aab9a3f3c3b6158202d5c8d942a61231ec9d5ec3fa0af8cf54a8daffea5d6f1103241aa5bb88a79cb9ea0a29974a08b579f7b2356
|
7
|
+
data.tar.gz: 1e65aec6411ddac4d9785f087f16c2b8645e0895701fe6da58d93369d45d2aa8b71c4cb48c777e64737cf805a08ca4fc4da66a44d0ab007fa36f2351065ffc95
|
data/README.md
CHANGED
@@ -1,3 +1,28 @@
|
|
1
1
|
## Purpose
|
2
2
|
|
3
|
-
Provide Rails generators to produce Dockerfiles and related files.
|
3
|
+
Provide Rails generators to produce Dockerfiles and related files.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
```
|
8
|
+
bundle add dockerfile-rails
|
9
|
+
bin/rails generate dockerfile
|
10
|
+
```
|
11
|
+
|
12
|
+
General options:
|
13
|
+
|
14
|
+
* `--force` - overwrite existing files
|
15
|
+
* `--ci` - include test gems in bundle
|
16
|
+
* `--cache` - use build caching to speed up builds
|
17
|
+
* `--parallel` - use multi-stage builds to install gems and node modules in parallel
|
18
|
+
|
19
|
+
Dependencies:
|
20
|
+
|
21
|
+
Generally the dockerfile generator will be able to determine what dependencies you
|
22
|
+
are actually using. But should you be using DATABASE_URL, for example, at runtime
|
23
|
+
additional support may be needed:
|
24
|
+
|
25
|
+
* `--mysql` - add mysql libraries
|
26
|
+
* `--posgresql` - add posgresql libraries
|
27
|
+
* `--redis` - add redis libraries
|
28
|
+
* `--sqlite3` - add sqlite3 libraries
|
@@ -62,14 +62,6 @@ module DockerfileRails
|
|
62
62
|
end
|
63
63
|
|
64
64
|
@redis = @redis_cable || @redis_cache || @sidekiq
|
65
|
-
|
66
|
-
### api-only ###
|
67
|
-
|
68
|
-
@apionly = Rails.application.config.api_only
|
69
|
-
|
70
|
-
### db:prepare ###
|
71
|
-
|
72
|
-
@dbprep = (Rails::VERSION::MAJOR >= 6) ? 'db:prepare' : 'db:migrate'
|
73
65
|
end
|
74
66
|
end
|
75
67
|
end
|
@@ -1,6 +1,27 @@
|
|
1
1
|
class DockerfileGenerator < Rails::Generators::Base
|
2
2
|
include DockerfileRails::Scanner
|
3
3
|
|
4
|
+
class_option :ci, type: :boolean, default: false,
|
5
|
+
desc: 'include test gems in bundle'
|
6
|
+
|
7
|
+
class_option :cache, type: :boolean, default: false,
|
8
|
+
desc: 'use build cache to speed up installs'
|
9
|
+
|
10
|
+
class_option :parallel, type: :boolean, default: false,
|
11
|
+
desc: 'use build stages to install gems and node modules in parallel'
|
12
|
+
|
13
|
+
class_option :redit, type: :boolean, default: false,
|
14
|
+
desc: 'include redis libraries'
|
15
|
+
|
16
|
+
class_option :sqlite3, aliases: '--sqlite', type: :boolean, default: false,
|
17
|
+
desc: 'include sqlite3 libraries'
|
18
|
+
|
19
|
+
class_option :postgresql, aliases: '--postgres', type: :boolean, default: false,
|
20
|
+
desc: 'include postgresql libraries'
|
21
|
+
|
22
|
+
class_option :mysql, type: :boolean, default: false,
|
23
|
+
desc: 'include mysql libraries'
|
24
|
+
|
4
25
|
def generate_app
|
5
26
|
source_paths.push File.expand_path('./templates', __dir__)
|
6
27
|
|
@@ -18,7 +39,12 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
18
39
|
private
|
19
40
|
|
20
41
|
def using_node?
|
21
|
-
|
42
|
+
return @using_node if @using_node != nil
|
43
|
+
@using_node = File.exist? 'package.json'
|
44
|
+
end
|
45
|
+
|
46
|
+
def parallel?
|
47
|
+
using_node? && options.parallel
|
22
48
|
end
|
23
49
|
|
24
50
|
def keeps?
|
@@ -31,17 +57,19 @@ private
|
|
31
57
|
packages = %w(build-essential)
|
32
58
|
|
33
59
|
# add databases: sqlite3, postgres, mysql
|
34
|
-
packages
|
60
|
+
packages << 'pkg-config' if options.sqlite3? or @sqlite3
|
61
|
+
packages << 'libpq-dev' if options.postgresql? or @postgresql
|
62
|
+
packages << 'default-libmysqlclient-dev' if options.mysql or @mysql
|
35
63
|
|
36
64
|
# add redis in case Action Cable, caching, or sidekiq are added later
|
37
|
-
packages << "redis"
|
65
|
+
packages << "redis" if options.redis? or @redis
|
38
66
|
|
39
67
|
# ActiveStorage preview support
|
40
68
|
packages << "libvips" if @gemfile.include? 'ruby-vips'
|
41
69
|
|
42
70
|
# node support, including support for building native modules
|
43
71
|
if using_node?
|
44
|
-
packages += %w(curl node-gyp
|
72
|
+
packages += %w(curl node-gyp pkg-config)
|
45
73
|
|
46
74
|
# module build process depends on Python, and debian changed
|
47
75
|
# how python is installed with the bullseye release. Below
|
@@ -63,15 +91,19 @@ private
|
|
63
91
|
end
|
64
92
|
end
|
65
93
|
|
66
|
-
packages.sort
|
94
|
+
packages.sort.uniq
|
67
95
|
end
|
68
96
|
|
69
97
|
def deploy_packages
|
98
|
+
packages = []
|
99
|
+
|
70
100
|
# start with databases: sqlite3, postgres, mysql
|
71
|
-
packages
|
101
|
+
packages << 'libsqlite3-0' if options.sqlite3? or @sqlite3
|
102
|
+
packages << 'postgresql-client' if options.postgresql? or @postgresql
|
103
|
+
packages << 'default-mysql-client' if options.mysql or @mysql
|
72
104
|
|
73
105
|
# add redis in case Action Cable, caching, or sidekiq are added later
|
74
|
-
packages << "redis"
|
106
|
+
packages << "redis" if options.redis? or @redis
|
75
107
|
|
76
108
|
# ActiveStorage preview support
|
77
109
|
packages << "libvips" if @gemfile.include? 'ruby-vips'
|
@@ -127,4 +159,12 @@ private
|
|
127
159
|
def api_only?
|
128
160
|
Rails.application.config.api_only
|
129
161
|
end
|
162
|
+
|
163
|
+
def dbprep_command
|
164
|
+
if Rails::VERSION::MAJOR >= 6
|
165
|
+
'db:prepare'
|
166
|
+
else
|
167
|
+
'db:migrate'
|
168
|
+
end
|
169
|
+
end
|
130
170
|
end
|
@@ -10,16 +10,31 @@ WORKDIR /rails
|
|
10
10
|
# Set production environment
|
11
11
|
ENV RAILS_ENV="production" \
|
12
12
|
BUNDLE_PATH="vendor/bundle" \
|
13
|
-
BUNDLE_WITHOUT="development:test"
|
13
|
+
BUNDLE_WITHOUT="<%= options.ci? ? 'test' : 'development:test' %>"
|
14
14
|
|
15
|
+
ARG BUNDLER_VERSION=<%= Bundler::VERSION %>
|
16
|
+
RUN gem update --system --no-document && \
|
17
|
+
gem install -N bundler -v ${BUNDLER_VERSION}
|
15
18
|
|
16
|
-
|
17
|
-
|
19
|
+
|
20
|
+
# Throw-away build stage<%= parallel? ? 's' : '' %> to reduce size of final image
|
21
|
+
FROM base as <%= parallel? ? 'pre' : '' %>build
|
18
22
|
|
19
23
|
# Install packages need to build gems<%= using_node? ? " and node modules" : "" %>
|
24
|
+
<% if options.cache? %>
|
25
|
+
RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \
|
26
|
+
--mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \
|
27
|
+
apt-get update -qq && \
|
28
|
+
<% else -%>
|
20
29
|
RUN apt-get update -qq && \
|
30
|
+
<% end -%>
|
21
31
|
apt-get install -y <%= build_packages.join(" ") %>
|
22
32
|
|
33
|
+
<% if parallel? -%>
|
34
|
+
|
35
|
+
FROM prebuild as node
|
36
|
+
|
37
|
+
<% end -%>
|
23
38
|
<% if using_node? -%>
|
24
39
|
# Install JavaScript dependencies
|
25
40
|
ARG NODE_VERSION=<%= node_version %>
|
@@ -28,15 +43,47 @@ ENV VOLTA_HOME="/usr/local"
|
|
28
43
|
RUN curl https://get.volta.sh | bash && \
|
29
44
|
volta install node@$NODE_VERSION yarn@$YARN_VERSION
|
30
45
|
|
46
|
+
<% end -%>
|
47
|
+
<% if parallel? -%>
|
48
|
+
# Install node modules
|
49
|
+
COPY package.json yarn.lock ./
|
50
|
+
<% if options.cache? -%>
|
51
|
+
RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \
|
52
|
+
YARN_CACHE_FOLDER=/root/.yarn yarn install
|
53
|
+
<% else -%>
|
54
|
+
RUN yarn install
|
55
|
+
<% end -%>
|
56
|
+
|
57
|
+
|
58
|
+
FROM prebuild as build
|
59
|
+
|
31
60
|
<% end -%>
|
32
61
|
# Install application gems
|
33
62
|
COPY Gemfile Gemfile.lock ./
|
34
|
-
|
63
|
+
<% if options.cache? -%>
|
64
|
+
RUN --mount=type=cache,id=bld-gem-cache,sharing=locked,target=/srv/vendor \
|
65
|
+
bundle config set app_config .bundle && \
|
66
|
+
bundle config set path /srv/vendor && \
|
67
|
+
bundle _${BUNDLER_VERSION}_ install && \
|
68
|
+
bundle clean && \
|
69
|
+
mkdir -p vendor && \
|
70
|
+
bundle config set path vendor && \
|
71
|
+
cp -ar /srv/vendor .
|
72
|
+
<% else -%>
|
73
|
+
RUN bundle _${BUNDLER_VERSION}_ install
|
74
|
+
<% end -%>
|
35
75
|
|
36
|
-
<% if
|
76
|
+
<% if parallel? -%>
|
77
|
+
asdf
|
78
|
+
<% elsif using_node? -%>
|
37
79
|
# Install node modules
|
38
80
|
COPY package.json yarn.lock ./
|
81
|
+
<% if options.cache? -%>
|
82
|
+
RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \
|
83
|
+
YARN_CACHE_FOLDER=/root/.yarn yarn install
|
84
|
+
<% else -%>
|
39
85
|
RUN yarn install
|
86
|
+
<% end -%>
|
40
87
|
|
41
88
|
<% end -%>
|
42
89
|
# Copy application code
|
@@ -54,19 +101,31 @@ RUN bundle exec bootsnap precompile --gemfile app/ lib/
|
|
54
101
|
<% end -%>
|
55
102
|
<% unless api_only? -%>
|
56
103
|
# Precompiling assets for production without requiring secret RAILS_MASTER_KEY
|
57
|
-
RUN
|
104
|
+
RUN SECRET_KEY_BASE<%= Rails::VERSION::MAJOR<7 || Rails::VERSION::STRING.start_with?('7.0') ? '=DUMMY' : '_DUMMY=1' %> ./bin/rails assets:precompile
|
58
105
|
|
59
106
|
<% end -%>
|
60
107
|
|
61
108
|
# Final stage for app image
|
62
109
|
FROM base
|
110
|
+
<% unless deploy_packages.empty? -%>
|
63
111
|
|
64
112
|
# Install packages need for deployment
|
113
|
+
<% if options.cache? -%>
|
114
|
+
RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \
|
115
|
+
--mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \
|
116
|
+
apt-get update -qq && \
|
117
|
+
apt-get install --no-install-recommends -y <%= deploy_packages.join(" ") %>
|
118
|
+
<% else -%>
|
65
119
|
RUN apt-get update -qq && \
|
66
120
|
apt-get install --no-install-recommends -y <%= deploy_packages.join(" ") %> && \
|
67
121
|
rm -rf /var/lib/apt/lists /var/cache/apt/archives
|
122
|
+
<% end -%>
|
123
|
+
<% end -%>
|
68
124
|
|
69
125
|
# Copy built application from second stage
|
126
|
+
<% if options.ci? -%>
|
127
|
+
COPY --from=build /usr/local/bundle /usr/local/bundle
|
128
|
+
<% end -%>
|
70
129
|
COPY --from=build /rails /rails
|
71
130
|
|
72
131
|
# Deployment options
|