Skip to content

Instantly share code, notes, and snippets.

@volkanunsal
Last active August 30, 2018 21:10
Show Gist options
  • Save volkanunsal/2410960894e0df4ecc66d707fa022746 to your computer and use it in GitHub Desktop.
Save volkanunsal/2410960894e0df4ecc66d707fa022746 to your computer and use it in GitHub Desktop.
Moving to Heroku container stack with Geospatial libraries
#!/bin/bash
configure_gems() {
bundle config build.nokogiri --use-system-libraries
bundle config build.rgeo --with-opts-dir=/usr --with-geos-config=/usr/bin/geos-config
}
bundle_install() {
configure_gems
bundle install --jobs=4 --retry=3 $1
}
if [[ "$1" = "install_gems_production" ]]; then
bundle_install "--without test:development --deployment"
fi
FROM volkanunsal/ruby
FROM volkanunsal/node as node
FROM volkanunsal/ruby:latest
COPY --from=node /usr/include/node /usr/include/node
COPY --from=node /usr/bin/node /usr/bin/node
COPY --from=node /usr/local/share/yarn /usr/local/share/yarn
COPY --from=node /usr/lib/node_modules /usr/lib/node_modules
RUN ln -s /usr/local/share/yarn/bin/yarn /usr/bin/yarn \
&& ln -s ../lib/node_modules/npm/bin/npm-cli.js /usr/bin/npm
FROM volkanunsal/ruby:2.3.7-node
RUN echo '>> Installing runtime deps...' \
&& apk add --no-cache \
bash \
postgresql-dev \
postgresql-client \
geos@testing-edge \
geos-dev@testing-edge \
gdal@testing-edge \
gdal-dev@testing-edge \
proj4@testing-edge \
proj4-dev@testing-edge \
libxml2-dev \
libxslt-dev \
tzdata \
git \
curl \
&& echo '>> Installing Ruby build deps...' \
&& apk add --no-cache --virtual .ruby-builddeps \
build-base \
cmake \
&& mkdir /app
FROM alpine:3.8
# skip installing gem documentation
RUN mkdir -p /usr/local/etc \
&& { \
echo 'install: --no-document'; \
echo 'update: --no-document'; \
} >> /usr/local/etc/gemrc \
&& echo "@testing-edge http://dl-3.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
ENV RUBY_MAJOR 2.3
ENV RUBY_VERSION 2.3.7
ENV RUBY_DOWNLOAD_SHA256 c61f8f2b9d3ffff5567e186421fa191f0d5e7c2b189b426bb84498825d548edb
ENV RUBYGEMS_VERSION 2.7.7
ENV BUNDLER_VERSION 1.16.3
ENV RUBY_CONFIGURE_OPTS=--with-jemalloc
# Install jemalloc
RUN apk add --no-cache jemalloc-dev@testing-edge
# some of ruby's build scripts are written in ruby
# we purge system ruby later to make sure our final image uses what we just built
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
RUN set -ex \
\
&& apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
bzip2 \
bzip2-dev \
ca-certificates \
coreutils \
dpkg-dev dpkg \
gcc \
gdbm-dev \
glib-dev \
libc-dev \
libffi-dev \
libressl \
libressl-dev \
libxml2-dev \
libxslt-dev \
linux-headers \
make \
ncurses-dev \
procps \
readline-dev \
ruby \
tar \
xz \
yaml-dev \
zlib-dev \
\
&& wget -O ruby.tar.xz "https://cache.ruby-lang.org/pub/ruby/${RUBY_MAJOR%-rc}/ruby-$RUBY_VERSION.tar.xz" \
&& echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.xz" | sha256sum -c - \
\
&& mkdir -p /usr/src/ruby \
&& tar -xJf ruby.tar.xz -C /usr/src/ruby --strip-components=1 \
&& rm ruby.tar.xz \
\
&& cd /usr/src/ruby \
\
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
&& { \
echo '#define ENABLE_PATH_CHECK 0'; \
echo; \
cat file.c; \
} > file.c.new \
&& mv file.c.new file.c \
\
&& autoconf \
&& gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \
# the configure script does not detect isnan/isinf as macros
&& export ac_cv_func_isnan=yes ac_cv_func_isinf=yes \
&& ./configure \
--build="$gnuArch" \
--disable-install-doc \
--enable-shared \
&& make -j "$(nproc)" \
&& make install \
\
&& runDeps="$( \
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
| tr ',' '\n' \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)" \
&& apk add --virtual .ruby-rundeps $runDeps \
bzip2 \
ca-certificates \
libffi-dev \
libressl-dev \
procps \
yaml-dev \
zlib-dev \
&& apk del .ruby-builddeps \
&& cd / \
&& rm -r /usr/src/ruby \
\
&& gem update --system "$RUBYGEMS_VERSION" \
&& gem install bundler --version "$BUNDLER_VERSION" --force \
&& rm -r /root/.gem/
# install things globally, for great justice
# and don't create ".bundle" in all our apps
ENV GEM_HOME /usr/local/bundle
ENV BUNDLE_PATH="$GEM_HOME" \
BUNDLE_SILENCE_ROOT_WARNING=1 \
BUNDLE_APP_CONFIG="$GEM_HOME"
# path recommendation: https://github.com/bundler/bundler/pull/6469#issuecomment-383235438
ENV PATH $GEM_HOME/bin:$BUNDLE_PATH/gems/bin:$PATH
# adjust permissions of a few directories for running "gem install" as an arbitrary user
RUN mkdir -p "$GEM_HOME" && chmod 777 "$GEM_HOME"
# (BUNDLE_PATH = GEM_HOME, no need to mkdir/chown both)
CMD [ "irb" ]
FROM volkanunsal/ruby:2.3.7-node-geos
WORKDIR /app
COPY ./ /app
ENV NODE_ENV 'production'
RUN echo '>> Installing Node packages...' \
&& yarn --ignore-optional
RUN echo ">> Bundling Ruby gems to ${BUNDLE_PATH}..." \
&& script/ci install_gems_production \
&& apk del .ruby-builddeps
ENV RAILS_ENV="production"
RUN DATABASE_URL=postgis://postgres@db/citiesense_test script/ci precompile
RUN rm -rf node_modules
CMD /app/script/start-puma
build:
docker:
web: ./Dockerfile.web
release:
image: web
command:
- /app/script/release-tasks.sh
run:
web: /app/script/start-puma
sidekiq:
command:
- /app/script/start-background-worker
image: web
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment