Improve Dockerfile when use some skip options

This commit is contained in:
Javier Aranda 2023-04-11 12:40:23 +02:00
parent c396d97535
commit 08cb03127e
No known key found for this signature in database
GPG Key ID: 6CB2CFC7D2282688
4 changed files with 53 additions and 13 deletions

@ -271,7 +271,7 @@ def web_server_gemfile_entry # :doc:
end
def asset_pipeline_gemfile_entry
return if options[:skip_asset_pipeline]
return if skip_asset_pipeline?
if options[:asset_pipeline] == "sprockets"
GemfileEntry.floats "sprockets-rails",
@ -335,7 +335,11 @@ def keeps? # :doc:
end
def sqlite3? # :doc:
!options[:skip_active_record] && options[:database] == "sqlite3"
!skip_active_record? && options[:database] == "sqlite3"
end
def skip_active_record? # :doc:
options[:skip_active_record]
end
def skip_active_storage? # :doc:
@ -354,12 +358,16 @@ def skip_action_text? # :doc:
options[:skip_action_text]
end
def skip_asset_pipeline? # :doc:
options[:skip_asset_pipeline]
end
def skip_sprockets?
options[:skip_asset_pipeline] || options[:asset_pipeline] != "sprockets"
skip_asset_pipeline? || options[:asset_pipeline] != "sprockets"
end
def skip_propshaft?
options[:skip_asset_pipeline] || options[:asset_pipeline] != "propshaft"
skip_asset_pipeline? || options[:asset_pipeline] != "propshaft"
end
@ -511,10 +519,10 @@ def dockerfile_binfile_fixups
def dockerfile_build_packages
# start with the essentials
packages = %w(build-essential git)
packages = %w(build-essential git pkg-config)
# add databases: sqlite3, postgres, mysql
packages += %w(pkg-config libpq-dev default-libmysqlclient-dev)
# add database support
packages << build_package_for_database unless skip_active_record?
# ActiveStorage preview support
packages << "libvips" unless skip_active_storage?
@ -543,17 +551,19 @@ def dockerfile_build_packages
end
end
packages.sort
packages.compact.sort
end
def dockerfile_deploy_packages
# start with databases: sqlite3, postgres, mysql
packages = %w(libsqlite3-0 postgresql-client default-mysql-client)
packages = []
# ActiveRecord databases
packages << deploy_package_for_database unless skip_active_record?
# ActiveStorage preview support
packages << "libvips" unless skip_active_storage?
packages.sort
packages.compact.sort
end
# CSS processors other than Tailwind and Sass require a node-based JavaScript environment. So overwrite the normal JS default
@ -727,6 +737,15 @@ def git_init_command
def edge_branch
self.class.edge_branch
end
def dockerfile_chown_directories
directories = %w(log tmp)
directories << "storage" unless skip_active_storage? && !sqlite3?
directories << "db" unless skip_active_record?
directories.sort
end
end
end
end

@ -38,6 +38,23 @@ def convert_database_option_for_jruby
end
end
def build_package_for_database(database = options[:database])
case database
when "mysql" then "default-libmysqlclient-dev"
when "postgresql" then "libpq-dev"
else nil
end
end
def deploy_package_for_database(database = options[:database])
case database
when "mysql" then "default-mysql-client"
when "postgresql" then "postgresql-client"
when "sqlite3" then "libsqlite3-0"
else nil
end
end
private
def mysql_socket
@mysql_socket ||= [

@ -58,7 +58,7 @@ RUN bundle exec bootsnap precompile app/ lib/
<%= "RUN " + dockerfile_binfile_fixups.join(" && \\\n ") %>
<% end -%>
<% unless options.api? -%>
<% unless options.api? || skip_asset_pipeline? -%>
# Precompiling assets for production without requiring secret RAILS_MASTER_KEY
RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
@ -67,18 +67,20 @@ RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
# Final stage for app image
FROM base
<% unless dockerfile_deploy_packages.empty? -%>
# Install packages needed for deployment
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y <%= dockerfile_deploy_packages.join(" ") %> && \
rm -rf /var/lib/apt/lists /var/cache/apt/archives
<% end -%>
# Copy built artifacts: gems, application
COPY --from=build /usr/local/bundle /usr/local/bundle
COPY --from=build /rails /rails
# Run and own only the runtime files as a non-root user for security
RUN useradd rails --home /rails --shell /bin/bash && \
chown -R rails:rails db log storage tmp
chown -R rails:rails <%= dockerfile_chown_directories.join(" ") %>
USER rails:rails
# Entrypoint prepares the database.

@ -1,8 +1,10 @@
#!/bin/bash -e
<% unless skip_active_record? -%>
# If running the rails server then create or migrate existing database
if [ "${*}" == "./bin/rails server" ]; then
./bin/rails db:prepare
fi
<% end -%>
exec "${@}"