From a21594db43942037f43c1c0c216f00733f735a2a Mon Sep 17 00:00:00 2001 From: David O' Rojo Date: Wed, 11 Sep 2019 18:38:20 -0500 Subject: [PATCH] Use Alpine Linux to built a smaller Docker image for Fab Manager --- .dockerignore | 17 +++++++++-- Dockerfile | 80 ++++++++++++++++++++++++++------------------------- 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/.dockerignore b/.dockerignore index 2d17e8d5a..bbc584d9f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,12 +5,16 @@ vendor/cache config/database.yml config/application.yml -# Ignore the default SQLite database. +# Ignore database files. db/*.sqlite3 db/*.sqlite3-journal +postgresql +elasticsearch +redis # Ignore all logfiles and tempfiles. log +*.log tmp public/uploads @@ -24,10 +28,17 @@ invoices .DS_Store +# Development files .vagrant Vagrantfile - +provision .git* - Dockerfile docker-compose* + +# Docs +*.md +doc + +# Modules +node_modules diff --git a/Dockerfile b/Dockerfile index 5ce849fdb..3a15f3f78 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,40 +1,52 @@ -FROM ruby:2.3 +FROM ruby:2.3.8-alpine MAINTAINER peng@sleede.com -# First we need to be able to fetch from https repositories -RUN apt-get update && \ - apt-get install -y apt-transport-https \ - ca-certificates apt-utils - - -# Add sources for external tools to APT -RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ - curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ - echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list && \ - echo "deb https://deb.nodesource.com/node_10.x jessie main" > /etc/apt/sources.list.d/nodesource.list && \ - echo "deb-src https://deb.nodesource.com/node_10.x jessie main" >> /etc/apt/sources.list.d/nodesource.list - -# Install apt based dependencies required to run Rails as -# well as RubyGems. As the Ruby image itself is based on a -# Debian image, we use apt-get to install those. -RUN apt-get update && \ - apt-get install -y \ +# Install upgrade system packages +RUN apk update && apk upgrade && \ +# Install runtime apk dependencies + apk add --update curl \ nodejs \ + yarn \ + imagemagick \ supervisor \ - yarn + tzdata \ + libc-dev \ + ruby-dev \ + zlib-dev \ + xz-dev \ + postgresql-dev \ + libxml2-dev \ + libxslt-dev \ + libidn-dev && \ +# Install buildtime apk dependencies + apk add --update --no-cache --virtual .build-deps alpine-sdk \ + build-base \ + linux-headers \ + git \ + patch -# throw errors if Gemfile has been modified since Gemfile.lock +# Throw error if Gemfile has been modified since Gemfile.lock RUN bundle config --global frozen 1 -# Run Bundle in a cache efficient way +# Install gems in a cache efficient way WORKDIR /tmp COPY Gemfile /tmp/ COPY Gemfile.lock /tmp/ -RUN bundle install --binstubs +RUN bundle install --binstubs --without development test doc +# Install Javascript packages +WORKDIR /usr/src/app +COPY package.json /usr/src/app/package.json +COPY yarn.lock /usr/src/app/yarn.lock +RUN yarn install -# Clean up APT when done. -#RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +# Clean up build deps, cached packages and temp files +RUN apk del .build-deps && \ + yarn cache clean && \ + rm -rf /tmp/* \ + /var/tmp/* \ + /var/cache/apk/* \ + /usr/lib/ruby/gems/*/cache/* # Web app RUN mkdir -p /usr/src/app && \ @@ -48,15 +60,7 @@ RUN mkdir -p /usr/src/app && \ mkdir -p /usr/src/app/tmp/sockets && \ mkdir -p /usr/src/app/tmp/pids -WORKDIR /usr/src/app - COPY docker/database.yml /usr/src/app/config/database.yml -COPY package.json /usr/src/app/package.json -COPY yarn.lock /usr/src/app/yarn.lock - -# Run Yarn -RUN yarn install - COPY . /usr/src/app # Volumes @@ -68,12 +72,10 @@ VOLUME /usr/src/app/public/assets VOLUME /usr/src/app/accounting VOLUME /var/log/supervisor -# Expose port 3000 to the Docker host, so we can access it -# from the outside. +# Expose port 3000 to the Docker host, so we can access it from the outside EXPOSE 3000 -# The main command to run when the container starts. Also -# tell the Rails dev server to bind to all interfaces by -# default. +# The main command to run when the container starts. Also tell the Rails server +# to bind to all interfaces by default. COPY docker/supervisor.conf /etc/supervisor/conf.d/fablab.conf -CMD ["/usr/bin/supervisord"] +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/fablab.conf"]