From abad497073efcd2537bb0a106c3515127bbccba4 Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Wed, 3 Feb 2016 12:11:16 -0800 Subject: [PATCH] Templatize our Dockerfiles --- 2.0/Dockerfile | 2 +- Dockerfile-alpine.template | 81 +++++++++++++++++++++++++++++++++++++ Dockerfile-onbuild.template | 13 ++++++ Dockerfile-slim.template | 72 +++++++++++++++++++++++++++++++++ Dockerfile.template | 44 ++++++++++++++++++++ update.sh | 27 ++++++------- 6 files changed, 224 insertions(+), 15 deletions(-) create mode 100644 Dockerfile-alpine.template create mode 100644 Dockerfile-onbuild.template create mode 100644 Dockerfile-slim.template create mode 100644 Dockerfile.template diff --git a/2.0/Dockerfile b/2.0/Dockerfile index 5aeb23d45..1a1efc1b9 100644 --- a/2.0/Dockerfile +++ b/2.0/Dockerfile @@ -6,7 +6,7 @@ ENV RUBY_DOWNLOAD_SHA256 8690bd6b4949c333b3919755c4e48885dbfed6fd055fe9ef89930bd ENV RUBYGEMS_VERSION 2.5.2 # skip installing gem documentation -RUN echo 'install: --no-document\nupdate: --no-document' > "$HOME/.gemrc" +RUN echo 'install: --no-document\nupdate: --no-document' >> "$HOME/.gemrc" # some of ruby's build scripts are written in ruby # we purge this later to make sure our final image uses what we just built diff --git a/Dockerfile-alpine.template b/Dockerfile-alpine.template new file mode 100644 index 000000000..a3f4762fc --- /dev/null +++ b/Dockerfile-alpine.template @@ -0,0 +1,81 @@ +FROM alpine:3.3 + +ENV RUBY_MAJOR %%VERSION%% +ENV RUBY_VERSION %%FULL_VERSION%% +ENV RUBY_DOWNLOAD_SHA256 %%SHA256%% +ENV RUBYGEMS_VERSION %%RUBYGEMS%% + +# skip installing gem documentation +RUN echo -e 'install: --no-document\nupdate: --no-document' >> "$HOME/.gemrc" + +RUN set -x \ + && apk add --no-cache --virtual .ruby-builddeps \ + autoconf \ + bison \ + bzip2 \ + bzip2-dev \ + ca-certificates \ + coreutils \ + curl \ + gcc \ + gdbm-dev \ + glib-dev \ + libc-dev \ + libedit-dev \ + libffi-dev \ + libxml2-dev \ + libxslt-dev \ + linux-headers \ + make \ + ncurses-dev \ + openssl-dev \ + procps \ + ruby \ + yaml-dev \ + zlib-dev \ + && curl -fSL -o ruby.tar.gz "http://cache.ruby-lang.org/pub/ruby/$RUBY_MAJOR/ruby-$RUBY_VERSION.tar.gz" \ + && echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.gz" | sha256sum -c - \ + && mkdir -p /usr/src \ + && tar -xzf ruby.tar.gz -C /usr/src \ + && mv "/usr/src/ruby-$RUBY_VERSION" /usr/src/ruby \ + && rm ruby.tar.gz \ + && cd /usr/src/ruby \ + && autoconf \ + # the configure script does not detect isnan/isinf as macros + && ac_cv_func_isnan=yes ac_cv_func_isinf=yes ./configure --disable-install-doc \ + && make -j"$(nproc)" \ + && make install \ + && gem update --system $RUBYGEMS_VERSION \ + && runDeps="$( \ + scanelf --needed --nobanner --recursive /usr/local \ + | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \ + | sort -u \ + | xargs -r apk info --installed \ + | sort -u \ + )" \ + && apk add --virtual .ruby-rundeps $runDeps \ + bzip2 \ + ca-certificates \ + curl \ + libffi-dev \ + openssl-dev \ + yaml-dev \ + procps \ + zlib-dev \ + && apk del .ruby-builddeps \ + && rm -r /usr/src/ruby + +# install things globally, for great justice +ENV GEM_HOME /usr/local/bundle +ENV PATH $GEM_HOME/bin:$PATH + +ENV BUNDLER_VERSION %%BUNDLER%% + +RUN gem install bundler --version "$BUNDLER_VERSION" \ + && bundle config --global path "$GEM_HOME" \ + && bundle config --global bin "$GEM_HOME/bin" + +# don't create ".bundle" in all our apps +ENV BUNDLE_APP_CONFIG $GEM_HOME + +CMD [ "irb" ] diff --git a/Dockerfile-onbuild.template b/Dockerfile-onbuild.template new file mode 100644 index 000000000..3664cae17 --- /dev/null +++ b/Dockerfile-onbuild.template @@ -0,0 +1,13 @@ +FROM ruby:%%VERSION%% + +# throw errors if Gemfile has been modified since Gemfile.lock +RUN bundle config --global frozen 1 + +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +ONBUILD COPY Gemfile /usr/src/app/ +ONBUILD COPY Gemfile.lock /usr/src/app/ +ONBUILD RUN bundle install + +ONBUILD COPY . /usr/src/app diff --git a/Dockerfile-slim.template b/Dockerfile-slim.template new file mode 100644 index 000000000..a69877b26 --- /dev/null +++ b/Dockerfile-slim.template @@ -0,0 +1,72 @@ +FROM debian:jessie + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bzip2 \ + ca-certificates \ + curl \ + libffi-dev \ + libgdbm3 \ + libssl-dev \ + libyaml-dev \ + procps \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +ENV RUBY_MAJOR %%VERSION%% +ENV RUBY_VERSION %%FULL_VERSION%% +ENV RUBY_DOWNLOAD_SHA256 %%SHA256%% +ENV RUBYGEMS_VERSION %%RUBYGEMS%% + +# skip installing gem documentation +RUN echo 'install: --no-document\nupdate: --no-document' >> "$HOME/.gemrc" + +# some of ruby's build scripts are written in ruby +# we purge this later to make sure our final image uses what we just built +RUN buildDeps=' \ + autoconf \ + bison \ + gcc \ + libbz2-dev \ + libgdbm-dev \ + libglib2.0-dev \ + libncurses-dev \ + libreadline-dev \ + libxml2-dev \ + libxslt-dev \ + make \ + ruby \ + ' \ + && set -x \ + && apt-get update \ + && apt-get install -y --no-install-recommends $buildDeps \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /usr/src/ruby \ + && curl -fSL -o ruby.tar.gz "http://cache.ruby-lang.org/pub/ruby/$RUBY_MAJOR/ruby-$RUBY_VERSION.tar.gz" \ + && echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.gz" | sha256sum -c - \ + && tar -xzf ruby.tar.gz -C /usr/src/ruby --strip-components=1 \ + && rm ruby.tar.gz \ + && cd /usr/src/ruby \ + && autoconf \ + && ./configure --disable-install-doc \ + && make -j"$(nproc)" \ + && make install \ + && gem update --system $RUBYGEMS_VERSION \ + && rm -r /usr/src/ruby \ + && apt-get purge -y --auto-remove $buildDeps + +# install things globally, for great justice +ENV GEM_HOME /usr/local/bundle +ENV PATH $GEM_HOME/bin:$PATH + +ENV BUNDLER_VERSION %%BUNDLER%% + +RUN gem install bundler --version "$BUNDLER_VERSION" \ + && bundle config --global path "$GEM_HOME" \ + && bundle config --global bin "$GEM_HOME/bin" \ + && bundle config --global silence_root_warning true + +# don't create ".bundle" in all our apps +ENV BUNDLE_APP_CONFIG $GEM_HOME + +CMD [ "irb" ] diff --git a/Dockerfile.template b/Dockerfile.template new file mode 100644 index 000000000..78b047465 --- /dev/null +++ b/Dockerfile.template @@ -0,0 +1,44 @@ +FROM buildpack-deps:jessie + +ENV RUBY_MAJOR %%VERSION%% +ENV RUBY_VERSION %%FULL_VERSION%% +ENV RUBY_DOWNLOAD_SHA256 %%SHA256%% +ENV RUBYGEMS_VERSION %%RUBYGEMS%% + +# skip installing gem documentation +RUN echo 'install: --no-document\nupdate: --no-document' >> "$HOME/.gemrc" + +# some of ruby's build scripts are written in ruby +# we purge this later to make sure our final image uses what we just built +RUN apt-get update \ + && apt-get install -y bison libgdbm-dev ruby \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /usr/src/ruby \ + && curl -fSL -o ruby.tar.gz "http://cache.ruby-lang.org/pub/ruby/$RUBY_MAJOR/ruby-$RUBY_VERSION.tar.gz" \ + && echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.gz" | sha256sum -c - \ + && tar -xzf ruby.tar.gz -C /usr/src/ruby --strip-components=1 \ + && rm ruby.tar.gz \ + && cd /usr/src/ruby \ + && autoconf \ + && ./configure --disable-install-doc \ + && make -j"$(nproc)" \ + && make install \ + && apt-get purge -y --auto-remove bison libgdbm-dev ruby \ + && gem update --system $RUBYGEMS_VERSION \ + && rm -r /usr/src/ruby + +# install things globally, for great justice +ENV GEM_HOME /usr/local/bundle +ENV PATH $GEM_HOME/bin:$PATH + +ENV BUNDLER_VERSION %%BUNDLER%% + +RUN gem install bundler --version "$BUNDLER_VERSION" \ + && bundle config --global path "$GEM_HOME" \ + && bundle config --global bin "$GEM_HOME/bin" \ + && bundle config --global silence_root_warning true + +# don't create ".bundle" in all our apps +ENV BUNDLE_APP_CONFIG $GEM_HOME + +CMD [ "irb" ] diff --git a/update.sh b/update.sh index 24f05a7ab..a47105eee 100755 --- a/update.sh +++ b/update.sh @@ -25,22 +25,21 @@ for version in "${versions[@]}"; do | sed -r 's!.*
sha256: ([^<]+).*/\1/")" - ( - set -x - sed -ri ' - s/^(ENV RUBY_MAJOR) .*/\1 '"$version"'/; - s/^(ENV RUBY_VERSION) .*/\1 '"$fullVersion"'/; - s/^(ENV RUBY_DOWNLOAD_SHA256) .*/\1 '"$shaVal"'/; - s/^(ENV BUNDLER_VERSION) .*/\1 '"$bundler"'/; - s/^(ENV RUBYGEMS_VERSION) .*/\1 '"$rubygems"'/; - ' "$version"{/,/*/}Dockerfile - sed -ri 's/^(FROM ruby):.*/\1:'"$version"'/' "$version/"*"/Dockerfile" - ) - for variant in alpine slim; do + + sedStr=" + s!%%VERSION%%!$version!g; + s!%%FULL_VERSION%%!$fullVersion!g; + s!%%SHA256%%!$shaVal!g; + s!%%RUBYGEMS%%!$rubygems!g; + s!%%BUNDLER%%!$bundler!g; + " + for variant in alpine slim onbuild ''; do [ -d "$version/$variant" ] || continue - travisEnv='\n - VERSION='"$version VARIANT=$variant$travisEnv" + sed -r "$sedStr" "Dockerfile${variant:+-$variant}.template" > "$version/$variant/Dockerfile" + if [ "$variant" != 'onbuild' ]; then + travisEnv='\n - VERSION='"$version VARIANT=$variant$travisEnv" + fi done - travisEnv='\n - VERSION='"$version VARIANT=$travisEnv" done travis="$(awk -v 'RS=\n\n' '$1 == "env:" { $0 = "env:'"$travisEnv"'" } { printf "%s%s", $0, RS }' .travis.yml)"