dockerfile-rails 0.0.1 → 0.0.2
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:
|
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
|