1
0
Fork 0
mirror of https://github.com/docker-library/ruby.git synced 2022-11-09 11:41:34 -05:00

Add initial jq-based templating engine

This commit is contained in:
Tianon Gravi 2021-07-02 15:41:13 -07:00 committed by Joe Ferguson
parent 5fccac58c3
commit 761ae37f67
25 changed files with 602 additions and 508 deletions

2
.gitattributes vendored Normal file
View file

@ -0,0 +1,2 @@
/*/**/Dockerfile linguist-generated
/Dockerfile*.template linguist-language=Dockerfile

22
.github/workflows/verify-templating.yml vendored Normal file
View file

@ -0,0 +1,22 @@
name: Verify Templating
on:
pull_request:
push:
defaults:
run:
shell: 'bash -Eeuo pipefail -x {0}'
jobs:
apply-templates:
name: Check For Uncomitted Changes
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Apply Templates
run: ./apply-templates.sh
- name: Check Git Status
run: |
status="$(git status --short)"
[ -z "$status" ]

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.jq-template.awk

View file

@ -1,7 +1,21 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM alpine:3.12
RUN apk add --no-cache \
gmp-dev
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
# skip installing gem documentation
RUN set -eux; \
@ -18,9 +32,9 @@ ENV RUBY_DOWNLOAD_SHA256 8262e4663169c85787fdc9bfbd04d9eb86eb2a4b56d7f98373a8fca
# 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 -eux; \
\
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
@ -68,6 +82,9 @@ RUN set -eux; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
\
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan=yes ac_cv_func_isinf=yes; \
\
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
{ \
@ -79,8 +96,6 @@ RUN set -eux; \
\
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 \
@ -95,24 +110,19 @@ RUN set -eux; \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --no-network --virtual .ruby-rundeps \
$runDeps \
bzip2 \
ca-certificates \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
; \
apk add --no-network --virtual .ruby-rundeps $runDeps; \
apk del --no-network .ruby-builddeps; \
\
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! apk --no-network list --installed \
if \
apk --no-network list --installed \
| grep -v '^[.]ruby-rundeps' \
| grep -i ruby \
; \
; then \
exit 1; \
fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,7 +1,21 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM alpine:3.13
RUN apk add --no-cache \
gmp-dev
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
# skip installing gem documentation
RUN set -eux; \
@ -18,9 +32,9 @@ ENV RUBY_DOWNLOAD_SHA256 8262e4663169c85787fdc9bfbd04d9eb86eb2a4b56d7f98373a8fca
# 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 -eux; \
\
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
@ -68,6 +82,9 @@ RUN set -eux; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
\
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan=yes ac_cv_func_isinf=yes; \
\
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
{ \
@ -79,8 +96,6 @@ RUN set -eux; \
\
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 \
@ -95,24 +110,19 @@ RUN set -eux; \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --no-network --virtual .ruby-rundeps \
$runDeps \
bzip2 \
ca-certificates \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
; \
apk add --no-network --virtual .ruby-rundeps $runDeps; \
apk del --no-network .ruby-builddeps; \
\
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! apk --no-network list --installed \
if \
apk --no-network list --installed \
| grep -v '^[.]ruby-rundeps' \
| grep -i ruby \
; \
; then \
exit 1; \
fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

9
2.6/buster/Dockerfile generated
View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM buildpack-deps:buster
# skip installing gem documentation
@ -60,6 +66,7 @@ RUN set -eux; \
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 \
@ -70,7 +77,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM debian:buster-slim
RUN set -eux; \
@ -34,22 +40,23 @@ RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
autoconf \
bison \
dpkg-dev \
libgdbm-dev \
ruby \
autoconf \
gcc \
libbz2-dev \
libgdbm-compat-dev \
libgdbm-dev \
libglib2.0-dev \
libncurses-dev \
libreadline-dev \
libxml2-dev \
libxslt-dev \
make \
ruby \
wget \
xz-utils \
# https://packages.debian.org/sid/libgdbm-compat-dev (needed for "dbm" core module, but only in Buster+)
libgdbm-compat-dev \
; \
rm -rf /var/lib/apt/lists/*; \
\
@ -86,6 +93,7 @@ RUN set -eux; \
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 \
@ -96,7 +104,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM debian:stretch-slim
RUN set -eux; \
@ -34,19 +40,19 @@ RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
autoconf \
bison \
dpkg-dev \
libgdbm-dev \
ruby \
autoconf \
gcc \
libbz2-dev \
libgdbm-dev \
libglib2.0-dev \
libncurses-dev \
libreadline-dev \
libxml2-dev \
libxslt-dev \
make \
ruby \
wget \
xz-utils \
; \
@ -85,6 +91,7 @@ RUN set -eux; \
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 \
@ -95,7 +102,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM buildpack-deps:stretch
# skip installing gem documentation
@ -60,6 +66,7 @@ RUN set -eux; \
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 \
@ -70,7 +77,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,7 +1,21 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM alpine:3.12
RUN apk add --no-cache \
gmp-dev
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
# skip installing gem documentation
RUN set -eux; \
@ -18,9 +32,9 @@ ENV RUBY_DOWNLOAD_SHA256 2a80824e0ad6100826b69b9890bf55cfc4cf2b61a1e1330fccbcb30
# 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 -eux; \
\
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
@ -68,6 +82,9 @@ RUN set -eux; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
\
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan=yes ac_cv_func_isinf=yes; \
\
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
{ \
@ -79,8 +96,6 @@ RUN set -eux; \
\
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 \
@ -95,24 +110,19 @@ RUN set -eux; \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --no-network --virtual .ruby-rundeps \
$runDeps \
bzip2 \
ca-certificates \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
; \
apk add --no-network --virtual .ruby-rundeps $runDeps; \
apk del --no-network .ruby-builddeps; \
\
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! apk --no-network list --installed \
if \
apk --no-network list --installed \
| grep -v '^[.]ruby-rundeps' \
| grep -i ruby \
; \
; then \
exit 1; \
fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,7 +1,21 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM alpine:3.13
RUN apk add --no-cache \
gmp-dev
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
# skip installing gem documentation
RUN set -eux; \
@ -18,9 +32,9 @@ ENV RUBY_DOWNLOAD_SHA256 2a80824e0ad6100826b69b9890bf55cfc4cf2b61a1e1330fccbcb30
# 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 -eux; \
\
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
@ -68,6 +82,9 @@ RUN set -eux; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
\
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan=yes ac_cv_func_isinf=yes; \
\
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
{ \
@ -79,8 +96,6 @@ RUN set -eux; \
\
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 \
@ -95,24 +110,19 @@ RUN set -eux; \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --no-network --virtual .ruby-rundeps \
$runDeps \
bzip2 \
ca-certificates \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
; \
apk add --no-network --virtual .ruby-rundeps $runDeps; \
apk del --no-network .ruby-builddeps; \
\
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! apk --no-network list --installed \
if \
apk --no-network list --installed \
| grep -v '^[.]ruby-rundeps' \
| grep -i ruby \
; \
; then \
exit 1; \
fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

9
2.7/buster/Dockerfile generated
View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM buildpack-deps:buster
# skip installing gem documentation
@ -60,6 +66,7 @@ RUN set -eux; \
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 \
@ -70,7 +77,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM debian:buster-slim
RUN set -eux; \
@ -34,22 +40,23 @@ RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
autoconf \
bison \
dpkg-dev \
libgdbm-dev \
ruby \
autoconf \
gcc \
libbz2-dev \
libgdbm-compat-dev \
libgdbm-dev \
libglib2.0-dev \
libncurses-dev \
libreadline-dev \
libxml2-dev \
libxslt-dev \
make \
ruby \
wget \
xz-utils \
# https://packages.debian.org/sid/libgdbm-compat-dev (needed for "dbm" core module, but only in Buster+)
libgdbm-compat-dev \
; \
rm -rf /var/lib/apt/lists/*; \
\
@ -86,6 +93,7 @@ RUN set -eux; \
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 \
@ -96,7 +104,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,7 +1,21 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM alpine:3.12
RUN apk add --no-cache \
gmp-dev
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
# skip installing gem documentation
RUN set -eux; \
@ -18,9 +32,9 @@ ENV RUBY_DOWNLOAD_SHA256 570e7773100f625599575f363831166d91d49a1ab97d3ab6495af44
# 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 -eux; \
\
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
@ -68,6 +82,9 @@ RUN set -eux; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
\
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan=yes ac_cv_func_isinf=yes; \
\
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
{ \
@ -79,8 +96,6 @@ RUN set -eux; \
\
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 \
@ -95,24 +110,19 @@ RUN set -eux; \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --no-network --virtual .ruby-rundeps \
$runDeps \
bzip2 \
ca-certificates \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
; \
apk add --no-network --virtual .ruby-rundeps $runDeps; \
apk del --no-network .ruby-builddeps; \
\
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! apk --no-network list --installed \
if \
apk --no-network list --installed \
| grep -v '^[.]ruby-rundeps' \
| grep -i ruby \
; \
; then \
exit 1; \
fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,7 +1,21 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM alpine:3.13
RUN apk add --no-cache \
gmp-dev
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
# skip installing gem documentation
RUN set -eux; \
@ -18,9 +32,9 @@ ENV RUBY_DOWNLOAD_SHA256 570e7773100f625599575f363831166d91d49a1ab97d3ab6495af44
# 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 -eux; \
\
# readline-dev vs libedit-dev: https://bugs.ruby-lang.org/issues/11869 and https://github.com/docker-library/ruby/issues/75
apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
@ -68,6 +82,9 @@ RUN set -eux; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
\
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan=yes ac_cv_func_isinf=yes; \
\
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
{ \
@ -79,8 +96,6 @@ RUN set -eux; \
\
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 \
@ -95,24 +110,19 @@ RUN set -eux; \
| sort -u \
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
)"; \
apk add --no-network --virtual .ruby-rundeps \
$runDeps \
bzip2 \
ca-certificates \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
; \
apk add --no-network --virtual .ruby-rundeps $runDeps; \
apk del --no-network .ruby-builddeps; \
\
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! apk --no-network list --installed \
if \
apk --no-network list --installed \
| grep -v '^[.]ruby-rundeps' \
| grep -i ruby \
; \
; then \
exit 1; \
fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

9
3.0/buster/Dockerfile generated
View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM buildpack-deps:buster
# skip installing gem documentation
@ -60,6 +66,7 @@ RUN set -eux; \
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 \
@ -70,7 +77,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,3 +1,9 @@
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM debian:buster-slim
RUN set -eux; \
@ -34,22 +40,23 @@ RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
autoconf \
bison \
dpkg-dev \
libgdbm-dev \
ruby \
autoconf \
gcc \
libbz2-dev \
libgdbm-compat-dev \
libgdbm-dev \
libglib2.0-dev \
libncurses-dev \
libreadline-dev \
libxml2-dev \
libxslt-dev \
make \
ruby \
wget \
xz-utils \
# https://packages.debian.org/sid/libgdbm-compat-dev (needed for "dbm" core module, but only in Buster+)
libgdbm-compat-dev \
; \
rm -rf /var/lib/apt/lists/*; \
\
@ -86,6 +93,7 @@ RUN set -eux; \
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 \
@ -96,7 +104,7 @@ RUN set -eux; \
cd /; \
rm -r /usr/src/ruby; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
if dpkg -l | grep -i ruby; then exit 1; fi; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

View file

@ -1,92 +0,0 @@
FROM buildpack-deps:%%PLACEHOLDER%%
# skip installing gem documentation
RUN set -eux; \
mkdir -p /usr/local/etc; \
{ \
echo 'install: --no-document'; \
echo 'update: --no-document'; \
} >> /usr/local/etc/gemrc
ENV LANG C.UTF-8
ENV RUBY_MAJOR %%VERSION%%
ENV RUBY_VERSION %%FULL_VERSION%%
ENV RUBY_DOWNLOAD_SHA256 %%SHA256%%
ENV RUBYGEMS_VERSION %%RUBYGEMS%%
# 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
RUN set -eux; \
\
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
bison \
dpkg-dev \
libgdbm-dev \
ruby \
; \
rm -rf /var/lib/apt/lists/*; \
\
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; \
\
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)"; \
./configure \
--build="$gnuArch" \
--disable-install-doc \
--enable-shared \
; \
make -j "$(nproc)"; \
make install; \
\
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 \
| 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; \
\
cd /; \
rm -r /usr/src/ruby; \
# make sure bundled "rubygems" is older than RUBYGEMS_VERSION (https://github.com/docker-library/ruby/issues/246)
ruby -e 'exit(Gem::Version.create(ENV["RUBYGEMS_VERSION"]) > Gem::Version.create(Gem::VERSION))'; \
gem update --system "$RUBYGEMS_VERSION" && rm -r /root/.gem/; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \
gem --version; \
bundle --version
# don't create ".bundle" in all our apps
ENV GEM_HOME /usr/local/bundle
ENV BUNDLE_SILENCE_ROOT_WARNING=1 \
BUNDLE_APP_CONFIG="$GEM_HOME"
ENV PATH $GEM_HOME/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"
CMD [ "irb" ]

View file

@ -1,118 +0,0 @@
FROM debian:%%PLACEHOLDER%%
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/*
# skip installing gem documentation
RUN set -eux; \
mkdir -p /usr/local/etc; \
{ \
echo 'install: --no-document'; \
echo 'update: --no-document'; \
} >> /usr/local/etc/gemrc
ENV LANG C.UTF-8
ENV RUBY_MAJOR %%VERSION%%
ENV RUBY_VERSION %%FULL_VERSION%%
ENV RUBY_DOWNLOAD_SHA256 %%SHA256%%
ENV RUBYGEMS_VERSION %%RUBYGEMS%%
# 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
RUN set -eux; \
\
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
autoconf \
bison \
dpkg-dev \
gcc \
libbz2-dev \
libgdbm-compat-dev \
libgdbm-dev \
libglib2.0-dev \
libncurses-dev \
libreadline-dev \
libxml2-dev \
libxslt-dev \
make \
ruby \
wget \
xz-utils \
; \
rm -rf /var/lib/apt/lists/*; \
\
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; \
\
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)"; \
./configure \
--build="$gnuArch" \
--disable-install-doc \
--enable-shared \
; \
make -j "$(nproc)"; \
make install; \
\
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 \
| 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; \
\
cd /; \
rm -r /usr/src/ruby; \
# make sure bundled "rubygems" is older than RUBYGEMS_VERSION (https://github.com/docker-library/ruby/issues/246)
ruby -e 'exit(Gem::Version.create(ENV["RUBYGEMS_VERSION"]) > Gem::Version.create(Gem::VERSION))'; \
gem update --system "$RUBYGEMS_VERSION" && rm -r /root/.gem/; \
# verify we have no "ruby" packages installed
! dpkg -l | grep -i ruby; \
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \
gem --version; \
bundle --version
# don't create ".bundle" in all our apps
ENV GEM_HOME /usr/local/bundle
ENV BUNDLE_SILENCE_ROOT_WARNING=1 \
BUNDLE_APP_CONFIG="$GEM_HOME"
ENV PATH $GEM_HOME/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"
CMD [ "irb" ]

View file

@ -1,8 +1,46 @@
FROM alpine:%%PLACEHOLDER%%
{{
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 -}}
RUN apk add --no-cache \
gmp-dev
{{ if is_alpine then ( -}}
RUN set -eux; \
apk add --no-cache \
bzip2 \
ca-certificates \
gmp-dev \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
;
{{ ) 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 -}}
# skip installing gem documentation
RUN set -eux; \
mkdir -p /usr/local/etc; \
@ -12,16 +50,16 @@ RUN set -eux; \
} >> /usr/local/etc/gemrc
ENV LANG C.UTF-8
ENV RUBY_MAJOR %%VERSION%%
ENV RUBY_VERSION %%FULL_VERSION%%
ENV RUBY_DOWNLOAD_SHA256 %%SHA256%%
ENV RUBYGEMS_VERSION %%RUBYGEMS%%
ENV RUBY_MAJOR {{ env.version }}
ENV RUBY_VERSION {{ .version }}
ENV RUBY_DOWNLOAD_SHA256 {{ .sha256 }}
# 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 -eux; \
\
{{ 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
apk add --no-cache --virtual .ruby-builddeps \
autoconf \
bison \
@ -51,6 +89,34 @@ RUN set -eux; \
yaml-dev \
zlib-dev \
; \
{{ ) 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 \
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 -}}
\
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; \
@ -61,6 +127,7 @@ RUN set -eux; \
\
cd /usr/src/ruby; \
\
{{ if is_alpine then ( -}}
# 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)
@ -69,6 +136,10 @@ RUN set -eux; \
patch -p1 -i thread-stack-fix.patch; \
rm thread-stack-fix.patch; \
\
# the configure script does not detect isnan/isinf as macros
export ac_cv_func_isnan=yes ac_cv_func_isinf=yes; \
\
{{ ) else "" end -}}
# hack in "ENABLE_PATH_CHECK" disabling to suppress:
# warning: Insecure world writable dir
{ \
@ -80,8 +151,6 @@ RUN set -eux; \
\
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 \
@ -90,33 +159,44 @@ RUN set -eux; \
make -j "$(nproc)"; \
make install; \
\
{{ if is_alpine then ( -}}
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 --no-network --virtual .ruby-rundeps \
$runDeps \
bzip2 \
ca-certificates \
libffi-dev \
procps \
yaml-dev \
zlib-dev \
; \
apk add --no-network --virtual .ruby-rundeps $runDeps; \
apk del --no-network .ruby-builddeps; \
{{ ) 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 -}}
\
cd /; \
rm -r /usr/src/ruby; \
# make sure bundled "rubygems" is older than RUBYGEMS_VERSION (https://github.com/docker-library/ruby/issues/246)
ruby -e 'exit(Gem::Version.create(ENV["RUBYGEMS_VERSION"]) > Gem::Version.create(Gem::VERSION))'; \
gem update --system "$RUBYGEMS_VERSION" && rm -r /root/.gem/; \
# verify we have no "ruby" packages installed
! apk --no-network list --installed \
{{ 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 -}}
[ "$(command -v ruby)" = '/usr/local/bin/ruby' ]; \
# rough smoke test
ruby --version; \

51
apply-templates.sh Executable file
View file

@ -0,0 +1,51 @@
#!/usr/bin/env bash
set -Eeuo pipefail
[ -f versions.json ] # run "versions.sh" first
jqt='.jq-template.awk'
if [ -n "${BASHBREW_SCRIPTS:-}" ]; then
jqt="$BASHBREW_SCRIPTS/jq-template.awk"
elif [ "$BASH_SOURCE" -nt "$jqt" ]; then
# # https://github.com/docker-library/bashbrew/blob/master/scripts/jq-template.awk
wget -qO "$jqt" 'https://github.com/docker-library/bashbrew/raw/00e281f36edd19f52541a6ba2f215cc3c4645128/scripts/jq-template.awk'
fi
if [ "$#" -eq 0 ]; then
versions="$(jq -r 'keys | map(@sh) | join(" ")' versions.json)"
eval "set -- $versions"
fi
generated_warning() {
cat <<-EOH
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
EOH
}
for version; do
export version
rm -rf "$version/"
variants="$(jq -r '.[env.version].variants | map(@sh) | join(" ")' versions.json)"
eval "variants=( $variants )"
for variant in "${variants[@]}"; do
export variant
dir="$version/$variant"
mkdir -p "$dir"
echo "processing $dir ..."
{
generated_warning
gawk -f "$jqt" Dockerfile.template
} > "$dir/Dockerfile"
done
done

View file

@ -6,23 +6,16 @@ declare -A aliases=(
[2.7]='2'
)
defaultDebianSuite='buster'
declare -A debianSuites=(
#[2.7]='buster'
)
defaultAlpineVersion='3.13'
declare -A alpineVersion=(
#[2.3]='3.8'
)
self="$(basename "$BASH_SOURCE")"
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
versions=( */ )
versions=( "${versions[@]%/}" )
if [ "$#" -eq 0 ]; then
versions="$(jq -r 'keys | map(@sh) | join(" ")' versions.json)"
eval "set -- $versions"
fi
# sort version numbers with highest first
IFS=$'\n'; versions=( $(echo "${versions[*]}" | sort -rV) ); unset IFS
IFS=$'\n'; set -- $(sort -rV <<<"$*"); unset IFS
# get the most recent commit which modified any of "$@"
fileCommit() {
@ -34,15 +27,19 @@ dirCommit() {
local dir="$1"; shift
(
cd "$dir"
fileCommit \
Dockerfile \
$(git show HEAD:./Dockerfile | awk '
files="$(
git show HEAD:./Dockerfile | awk '
toupper($1) == "COPY" {
for (i = 2; i < NF; i++) {
if ($i ~ /^--from=/) {
next
}
print $i
}
}
')
'
)"
fileCommit Dockerfile $files
)
}
@ -77,25 +74,12 @@ join() {
echo "${out#$sep}"
}
for version in "${versions[@]}"; do
for v in \
{buster,stretch}{,/slim} \
alpine{3.13,3.12} \
; do
dir="$version/$v"
variant="$(basename "$v")"
for version; do
export version
variants="$(jq -r '.[env.version].variants | map(@sh) | join(" ")' versions.json)"
eval "variants=( $variants )"
if [ "$variant" = 'slim' ]; then
# convert "slim" into "slim-buster"
# https://github.com/docker-library/ruby/pull/142#issuecomment-320012893
variant="$variant-$(basename "$(dirname "$v")")"
fi
[ -f "$dir/Dockerfile" ] || continue
commit="$(dirCommit "$dir")"
fullVersion="$(git show "$commit":"$dir/Dockerfile" | awk '$1 == "ENV" && $2 == "RUBY_VERSION" { print $3; exit }')"
fullVersion="$(jq -r '.[env.version].version' versions.json)"
versionAliases=(
$fullVersion
@ -103,16 +87,39 @@ for version in "${versions[@]}"; do
${aliases[$version]:-}
)
defaultDebianVariant="$(jq -r '
.[env.version].variants
| map(select(
startswith("alpine")
or startswith("slim-")
| not
))
| .[0]
' versions.json)"
defaultAlpineVariant="$(jq -r '
.[env.version].variants
| map(select(
startswith("alpine")
))
| .[0]
' versions.json)"
for v in "${variants[@]}"; do
dir="$version/$v"
[ -f "$dir/Dockerfile" ] || continue
variant="$(basename "$v")"
commit="$(dirCommit "$dir")"
variantAliases=( "${versionAliases[@]/%/-$variant}" )
debianSuite="${debianSuites[$version]:-$defaultDebianSuite}"
case "$variant" in
"$debianSuite")
"$defaultDebianVariant")
variantAliases+=( "${versionAliases[@]}" )
;;
*-"$debianSuite")
variantAliases+=( "${versionAliases[@]/%/-${variant%-$debianSuite}}" )
*-"$defaultDebianVariant")
variantAliases+=( "${versionAliases[@]/%/-${variant%-$defaultDebianVariant}}" )
;;
"alpine${alpineVersion[$version]:-$defaultAlpineVersion}")
"$defaultAlpineVariant")
variantAliases+=( "${versionAliases[@]/%/-alpine}" )
;;
esac

101
update.sh
View file

@ -3,102 +3,5 @@ set -Eeuo pipefail
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
versions=( "$@" )
if [ ${#versions[@]} -eq 0 ]; then
versions=( */ )
fi
versions=( "${versions[@]%/}" )
releasesPage="$(curl -fsSL 'https://www.ruby-lang.org/en/downloads/releases/')"
newsPage="$(curl -fsSL 'https://www.ruby-lang.org/en/news/')" # occasionally, releases don't show up on the Releases page (see https://github.com/ruby/www.ruby-lang.org/blob/master/_data/releases.yml)
# TODO consider parsing https://github.com/ruby/www.ruby-lang.org/blob/master/_data/downloads.yml as well
for version in "${versions[@]}"; do
rcGrepV='-v'
rcVersion="${version%-rc}"
if [ "$rcVersion" != "$version" ]; then
rcGrepV=
fi
IFS=$'\n'; allVersions=( $(
curl -fsSL --compressed "https://cache.ruby-lang.org/pub/ruby/$rcVersion/" \
| grep -oE '["/]ruby-'"$rcVersion"'.[^"]+\.tar\.xz' \
| sed -r 's!^["/]ruby-([^"]+)[.]tar[.]xz!\1!' \
| grep $rcGrepV -E 'preview|rc' \
| sort -ruV
) ); unset IFS
fullVersion=
shaVal=
for tryVersion in "${allVersions[@]}"; do
if \
{
versionReleasePage="$(grep "<td>Ruby $tryVersion</td>" -A 2 <<<"$releasesPage" | awk -F '"' '$1 == "<td><a href=" { print $2; exit }')" \
&& [ "$versionReleasePage" ] \
&& shaVal="$(curl -fsSL "https://www.ruby-lang.org/$versionReleasePage" |tac|tac| grep "ruby-$tryVersion.tar.xz" -A 5 | awk '$1 == "SHA256:" { print $2; exit }')" \
&& [ "$shaVal" ]
} \
|| {
versionReleasePage="$(echo "$newsPage" | grep -oE '<a href="[^"]+">Ruby '"$tryVersion"' Released</a>' | cut -d'"' -f2)" \
&& [ "$versionReleasePage" ] \
&& shaVal="$(curl -fsSL "https://www.ruby-lang.org/$versionReleasePage" |tac|tac| grep "ruby-$tryVersion.tar.xz" -A 5 | awk '$1 == "SHA256:" { print $2; exit }')" \
&& [ "$shaVal" ]
} \
; then
fullVersion="$tryVersion"
break
fi
done
if [ -z "$fullVersion" ]; then
echo >&2 "warning: cannot determine sha for $version (tried all of ${allVersions[*]}); skipping"
continue
fi
echo "$version: $fullVersion; $shaVal"
for v in \
alpine{3.13,3.12} \
{stretch,buster}{/slim,} \
; do
dir="$version/$v"
variant="$(basename "$v")"
[ -d "$dir" ] || continue
case "$variant" in
slim|windowsservercore) template="$variant"; tag="$(basename "$(dirname "$dir")")" ;;
alpine*) template='alpine'; tag="${variant#alpine}" ;;
*) template='debian'; tag="$variant" ;;
esac
template="Dockerfile-${template}.template"
if [ "$variant" = 'slim' ]; then
tag+='-slim'
fi
sed -r \
-e 's!%%VERSION%%!'"$version"'!g' \
-e 's!%%FULL_VERSION%%!'"$fullVersion"'!g' \
-e 's!%%SHA256%%!'"$shaVal"'!g' \
-e 's/^(FROM (debian|buildpack-deps|alpine)):.*/\1:'"$tag"'/' \
"$template" > "$dir/Dockerfile"
case "$v" in
# https://packages.debian.org/sid/libgdbm-compat-dev (needed for "dbm" core module, but only in Buster+)
stretch/slim)
sed -i -e '/libgdbm-compat-dev/d' "$dir/Dockerfile"
;;
esac
# https://github.com/docker-library/ruby/issues/246
if [ "$rcVersion" = '2.5' ]; then
rubygems='3.0.3'
sed -ri \
-e 's!%%RUBYGEMS%%!'"$rubygems"'!g' \
"$dir/Dockerfile"
else
sed -ri -e '/RUBYGEMS_VERSION/d' "$dir/Dockerfile"
fi
done
done
./versions.sh "$@"
./apply-templates.sh "$@"

34
versions.json Normal file
View file

@ -0,0 +1,34 @@
{
"2.6": {
"sha256": "8262e4663169c85787fdc9bfbd04d9eb86eb2a4b56d7f98373a8fcaa18e593eb",
"variants": [
"buster",
"slim-buster",
"stretch",
"slim-stretch",
"alpine3.13",
"alpine3.12"
],
"version": "2.6.8"
},
"2.7": {
"sha256": "2a80824e0ad6100826b69b9890bf55cfc4cf2b61a1e1330fccbcb30c46cef8d7",
"variants": [
"buster",
"slim-buster",
"alpine3.13",
"alpine3.12"
],
"version": "2.7.4"
},
"3.0": {
"sha256": "570e7773100f625599575f363831166d91d49a1ab97d3ab6495af44774155c40",
"variants": [
"buster",
"slim-buster",
"alpine3.13",
"alpine3.12"
],
"version": "3.0.2"
}
}

85
versions.sh Executable file
View file

@ -0,0 +1,85 @@
#!/usr/bin/env bash
set -Eeuo pipefail
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
versions=( "$@" )
if [ ${#versions[@]} -eq 0 ]; then
versions=( */ )
json='{}'
else
json="$(< versions.json)"
fi
versions=( "${versions[@]%/}" )
releasesPage="$(curl -fsSL 'https://www.ruby-lang.org/en/downloads/releases/')"
newsPage="$(curl -fsSL 'https://www.ruby-lang.org/en/news/')" # occasionally, releases don't show up on the Releases page (see https://github.com/ruby/www.ruby-lang.org/blob/master/_data/releases.yml)
# TODO consider parsing https://github.com/ruby/www.ruby-lang.org/blob/master/_data/downloads.yml as well
for version in "${versions[@]}"; do
rcGrepV='-v'
rcVersion="${version%-rc}"
if [ "$rcVersion" != "$version" ]; then
rcGrepV=
fi
export version rcVersion
IFS=$'\n'; allVersions=( $(
curl -fsSL --compressed "https://cache.ruby-lang.org/pub/ruby/$rcVersion/" \
| grep -oE '["/]ruby-'"$rcVersion"'.[^"]+\.tar\.xz' \
| sed -r 's!^["/]ruby-([^"]+)[.]tar[.]xz!\1!' \
| grep $rcGrepV -E 'preview|rc' \
| sort -ruV
) ); unset IFS
fullVersion=
shaVal=
for tryVersion in "${allVersions[@]}"; do
if \
{
versionReleasePage="$(grep "<td>Ruby $tryVersion</td>" -A 2 <<<"$releasesPage" | awk -F '"' '$1 == "<td><a href=" { print $2; exit }')" \
&& [ "$versionReleasePage" ] \
&& shaVal="$(curl -fsSL "https://www.ruby-lang.org/$versionReleasePage" |tac|tac| grep "ruby-$tryVersion.tar.xz" -A 5 | awk '$1 == "SHA256:" { print $2; exit }')" \
&& [ "$shaVal" ]
} \
|| {
versionReleasePage="$(echo "$newsPage" | grep -oE '<a href="[^"]+">Ruby '"$tryVersion"' Released</a>' | cut -d'"' -f2)" \
&& [ "$versionReleasePage" ] \
&& shaVal="$(curl -fsSL "https://www.ruby-lang.org/$versionReleasePage" |tac|tac| grep "ruby-$tryVersion.tar.xz" -A 5 | awk '$1 == "SHA256:" { print $2; exit }')" \
&& [ "$shaVal" ]
} \
; then
fullVersion="$tryVersion"
break
fi
done
if [ -z "$fullVersion" ]; then
echo >&2 "error: cannot determine sha for $version (tried all of ${allVersions[*]})"
exit 1
fi
echo "$version: $fullVersion; $shaVal"
export fullVersion shaVal
json="$(jq <<<"$json" -c '
.[env.version] = {
version: env.fullVersion,
sha256: env.shaVal,
variants: [
(
"buster",
if env.rcVersion == "2.6" then
"stretch"
else empty end
| ., "slim-" + .), # https://github.com/docker-library/ruby/pull/142#issuecomment-320012893
(
"3.13",
"3.12"
| "alpine" + .)
],
}
')"
done
jq <<<"$json" -S . > versions.json