2021-07-02 18:41:13 -04:00
{ {
def is_alpine:
env.variant | startswith( "alpine" )
;
def is_slim:
env.variant | startswith( "slim-" )
-} }
{ { if is_alpine then ( -} }
FROM alpine:{{ env.variant | ltrimstr("alpine") }}
{ { ) elif is_slim then ( -} }
FROM debian:{{ env.variant | ltrimstr("slim-") }}-slim
{ { ) else ( -} }
FROM buildpack-deps:{{ env.variant }}
{ { ) end -} }
2016-02-03 15:11:16 -05:00
2021-07-02 18:41:13 -04:00
{ { if is_alpine then ( -} }
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
2019-03-04 11:02:36 -05:00
2021-07-02 18:41:13 -04:00
{ { ) elif is_slim then ( -} }
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
bzip2 \
ca-certificates \
libffi-dev \
libgmp-dev \
libssl-dev \
libyaml-dev \
procps \
zlib1g-dev \
; \
rm -rf /var/lib/apt/lists/*
{ { ) else "" end -} }
2016-02-03 16:01:37 -05:00
# skip installing gem documentation
2019-06-25 15:12:14 -04:00
RUN set -eux; \
mkdir -p /usr/local/etc; \
{ \
2019-07-11 18:11:09 -04:00
echo 'install: --no-document' ; \
2016-02-03 16:01:37 -05:00
echo 'update: --no-document' ; \
} >> /usr/local/etc/gemrc
2020-06-13 00:37:45 -04:00
ENV LANG C.UTF-8
2021-07-02 18:41:13 -04:00
ENV RUBY_MAJOR { { env.version } }
ENV RUBY_VERSION { { .version } }
ENV RUBY_DOWNLOAD_SHA256 { { .sha256 } }
2016-02-03 15:11:16 -05:00
2016-02-03 16:01:37 -05:00
# some of ruby's build scripts are written in ruby
2016-09-20 13:14:46 -04:00
# we purge system ruby later to make sure our final image uses what we just built
2019-06-25 15:12:14 -04:00
RUN set -eux; \
2016-09-20 13:14:46 -04:00
\
2021-07-02 18:41:13 -04:00
{ { if is_alpine then ( -} }
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
2019-06-25 15:12:14 -04:00
apk add --no-cache --virtual .ruby-builddeps \
2016-02-03 15:11:16 -05:00
autoconf \
bison \
bzip2 \
bzip2-dev \
ca-certificates \
coreutils \
2017-05-08 22:53:33 -04:00
dpkg-dev dpkg \
2021-06-16 17:04:12 -04:00
g++ \
2016-02-03 15:11:16 -05:00
gcc \
gdbm-dev \
glib-dev \
libc-dev \
libffi-dev \
libxml2-dev \
libxslt-dev \
linux-headers \
make \
ncurses-dev \
2019-01-30 17:48:46 -05:00
openssl \
openssl-dev \
2020-06-10 17:23:05 -04:00
patch \
2016-02-03 15:11:16 -05:00
procps \
2016-03-29 17:53:18 -04:00
readline-dev \
2016-02-03 15:11:16 -05:00
ruby \
2016-09-20 13:14:46 -04:00
tar \
2017-08-08 12:33:44 -04:00
xz \
2016-02-03 15:11:16 -05:00
yaml-dev \
zlib-dev \
2019-06-25 15:12:14 -04:00
; \
2021-07-02 18:41:13 -04:00
{ { ) else ( -} }
savedAptMark = " $( apt-mark showmanual) " ; \
apt-get update; \
apt-get install -y --no-install-recommends \
bison \
dpkg-dev \
libgdbm-dev \
ruby \
{ { if is_slim then ( -} }
autoconf \
2021-06-16 17:04:12 -04:00
g++ \
2021-07-02 18:41:13 -04:00
gcc \
libbz2-dev \
libglib2.0-dev \
libncurses-dev \
libreadline-dev \
libxml2-dev \
libxslt-dev \
make \
wget \
xz-utils \
{ { if env.variant | endswith( "stretch" ) then "" else ( -} }
# https://packages.debian.org/sid/libgdbm-compat-dev (needed for "dbm" core module, but only in Buster+)
libgdbm-compat-dev \
{ { ) end -} }
{ { ) else "" end -} }
; \
rm -rf /var/lib/apt/lists/*; \
{ { ) end -} }
2016-09-20 13:14:46 -04:00
\
2019-06-25 15:12:14 -04:00
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 --check --strict; \
2016-09-20 13:14:46 -04:00
\
2019-06-25 15:12:14 -04:00
mkdir -p /usr/src/ruby; \
tar -xJf ruby.tar.xz -C /usr/src/ruby --strip-components= 1; \
rm ruby.tar.xz; \
2016-09-20 13:14:46 -04:00
\
2019-06-25 15:12:14 -04:00
cd /usr/src/ruby; \
2016-09-20 13:14:46 -04:00
\
2021-07-02 18:41:13 -04:00
{ { if is_alpine then ( -} }
2018-09-20 18:58:57 -04:00
# https://github.com/docker-library/ruby/issues/196
# https://bugs.ruby-lang.org/issues/14387#note-13 (patch source)
# https://bugs.ruby-lang.org/issues/14387#note-16 ("Therefore ncopa's patch looks good for me in general." -- only breaks glibc which doesn't matter here)
2019-06-25 15:12:14 -04:00
wget -O 'thread-stack-fix.patch' 'https://bugs.ruby-lang.org/attachments/download/7081/0001-thread_pthread.c-make-get_main_stack-portable-on-lin.patch' ; \
echo '3ab628a51d92fdf0d2b5835e93564857aea73e0c1de00313864a94a6255cb645 *thread-stack-fix.patch' | sha256sum --check --strict; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
2018-09-20 18:58:57 -04:00
\
2021-06-16 17:04:12 -04:00
{ {
{
"2.6" : {
url: "https://github.com/ruby/ruby/pull/3773" ,
commit: "fcc88da5eb162043adcba552646677d2ab5adf55" ,
2021-08-16 14:31:57 -04:00
sha256: "95565a8a8f0eddd39d76fe8af63fc34b6429c956c8f8fe0aa17282d37adced64" ,
2021-06-16 17:04:12 -04:00
} ,
} [ env.version] | if . and env.variant != "alpine3.13" then (
-} }
# https://bugs.ruby-lang.org/issues/17723 (building with autoconf 2.70+ fails)
# {{ .url }}
wget -O 'autoconf-2.70.patch' 'https://github.com/ruby/ruby/commit/{{ .commit }}.patch' ; \
echo '{{ .sha256 }} *autoconf-2.70.patch' | sha256sum --check --strict; \
patch -p1 -i autoconf-2.70.patch; \
rm autoconf-2.70.patch; \
\
{ { ) else "" end -} }
2021-07-02 18:41:13 -04:00
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan = yes ac_cv_func_isinf = yes; \
\
{ { ) else "" end -} }
2016-09-20 13:14:46 -04:00
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
2019-06-25 15:12:14 -04:00
{ \
2016-09-20 13:14:46 -04:00
echo '#define ENABLE_PATH_CHECK 0' ; \
echo; \
cat file.c; \
2019-06-25 15:12:14 -04:00
} > file.c.new; \
mv file.c.new file.c; \
2016-09-20 13:14:46 -04:00
\
2019-06-25 15:12:14 -04:00
autoconf; \
gnuArch = " $( dpkg-architecture --query DEB_BUILD_GNU_TYPE) " ; \
./configure \
2017-05-08 22:53:33 -04:00
--build= " $gnuArch " \
--disable-install-doc \
--enable-shared \
2019-06-25 15:12:14 -04:00
; \
make -j " $( nproc) " ; \
make install; \
2016-09-20 13:14:46 -04:00
\
2021-07-02 18:41:13 -04:00
{ { if is_alpine then ( -} }
2019-06-25 15:12:14 -04:00
runDeps = " $( \
2017-09-22 16:23:58 -04:00
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
| tr ',' '\n' \
2016-02-03 15:11:16 -05:00
| sort -u \
2017-09-22 16:23:58 -04:00
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
2019-06-25 15:12:14 -04:00
) " ; \
2021-07-02 18:41:13 -04:00
apk add --no-network --virtual .ruby-rundeps $runDeps ; \
2019-06-25 15:12:14 -04:00
apk del --no-network .ruby-builddeps; \
2021-07-02 18:41:13 -04:00
{ { ) else ( -} }
apt-mark auto '.*' > /dev/null; \
apt-mark manual $savedAptMark > /dev/null; \
find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec ldd '{}' ';' \
| awk '/=>/ { print $(NF-1) }' \
| sort -u \
| grep -vE '^/usr/local/lib/' \
| xargs -r dpkg-query --search \
| cut -d: -f1 \
| sort -u \
| xargs -r apt-mark manual \
; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant= false; \
{ { ) end -} }
2019-06-25 15:12:14 -04:00
\
cd /; \
rm -r /usr/src/ruby; \
2019-06-25 19:03:12 -04:00
# verify we have no "ruby" packages installed
2021-07-02 18:41:13 -04:00
{ { if is_alpine then ( -} }
if \
apk --no-network list --installed \
| grep -v '^[.]ruby-rundeps' \
| grep -i ruby \
; then \
exit 1; \
fi ; \
{ { ) else ( -} }
if dpkg -l | grep -i ruby; then exit 1; fi ; \
{ { ) end -} }
2019-06-25 19:03:12 -04:00
[ " $( command -v ruby) " = '/usr/local/bin/ruby' ] ; \
2018-12-31 19:59:56 -05:00
# rough smoke test
2019-06-25 15:12:14 -04:00
ruby --version; \
gem --version; \
bundle --version
2016-02-03 16:01:37 -05:00
2020-01-03 10:49:48 -05:00
# don't create ".bundle" in all our apps
2016-02-03 16:01:37 -05:00
ENV GEM_HOME /usr/local/bundle
2020-01-03 10:49:48 -05:00
ENV BUNDLE_SILENCE_ROOT_WARNING = 1 \
2016-02-04 17:55:28 -05:00
BUNDLE_APP_CONFIG = " $GEM_HOME "
2020-01-03 10:49:48 -05:00
ENV PATH $GEM_HOME /bin:$PATH
2018-05-21 15:34:41 -04:00
# adjust permissions of a few directories for running "gem install" as an arbitrary user
RUN mkdir -p " $GEM_HOME " && chmod 777 " $GEM_HOME "
2016-02-03 15:11:16 -05:00
CMD [ "irb" ]