Skip to content

Commit da70bf6

Browse files
Implement jq templating
1 parent b8a7264 commit da70bf6

14 files changed

+479
-84
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Verify Templating
2+
3+
on:
4+
pull_request:
5+
push:
6+
7+
defaults:
8+
run:
9+
shell: 'bash -Eeuo pipefail -x {0}'
10+
11+
jobs:
12+
apply-templates:
13+
name: Check For Uncomitted Changes
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v3
17+
- name: Apply Templates
18+
run: ./apply-templates.sh
19+
- name: Check Git Status
20+
run: |
21+
status="$(git status --short)"
22+
[ -z "$status" ]

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.jq-template.awk

1.6/alpine3.18/Dockerfile

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#
2+
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
3+
#
4+
# PLEASE DO NOT EDIT IT DIRECTLY.
5+
#
6+
7+
FROM alpine:3.18
8+
9+
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
10+
RUN addgroup -g 11211 memcache && adduser -D -u 11211 -G memcache memcache
11+
12+
# ensure SASL's "libplain.so" is installed as per https://github.com/memcached/memcached/wiki/SASLHowto
13+
RUN apk add --no-cache libsasl
14+
15+
ENV MEMCACHED_VERSION 1.6.22
16+
ENV MEMCACHED_DOWNLOAD_URL https://memcached.org/files/memcached-1.6.22.tar.gz
17+
ENV MEMCACHED_SHA1 7a691f390d59616dbebfc9e2e4942d499c39a338
18+
19+
RUN set -x \
20+
\
21+
&& apk add --no-cache --virtual .build-deps \
22+
ca-certificates \
23+
coreutils \
24+
cyrus-sasl-dev \
25+
gcc \
26+
libc-dev \
27+
libevent-dev \
28+
linux-headers \
29+
make \
30+
openssl \
31+
openssl-dev \
32+
perl \
33+
perl-io-socket-ssl \
34+
perl-utils \
35+
\
36+
&& wget -O memcached.tar.gz "$MEMCACHED_DOWNLOAD_URL" \
37+
&& echo "$MEMCACHED_SHA1 memcached.tar.gz" | sha1sum -c - \
38+
&& mkdir -p /usr/src/memcached \
39+
&& tar -xzf memcached.tar.gz -C /usr/src/memcached --strip-components=1 \
40+
&& rm memcached.tar.gz \
41+
\
42+
&& cd /usr/src/memcached \
43+
\
44+
&& ./configure \
45+
--build="$gnuArch" \
46+
--enable-extstore \
47+
--enable-sasl \
48+
--enable-sasl-pwdb \
49+
--enable-tls \
50+
&& nproc="$(nproc)" \
51+
&& make -j "$nproc" \
52+
\
53+
&& make test PARALLEL="$nproc" \
54+
\
55+
&& make install \
56+
\
57+
&& cd / && rm -rf /usr/src/memcached \
58+
\
59+
&& runDeps="$( \
60+
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
61+
| tr ',' '\n' \
62+
| sort -u \
63+
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
64+
)" \
65+
&& apk add --no-network --virtual .memcached-rundeps $runDeps \
66+
&& apk del --no-network .build-deps \
67+
\
68+
&& memcached -V
69+
70+
COPY docker-entrypoint.sh /usr/local/bin/
71+
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
72+
ENTRYPOINT ["docker-entrypoint.sh"]
73+
74+
USER memcache
75+
EXPOSE 11211
76+
CMD ["memcached"]
File renamed without changes.

1.6/bookworm/Dockerfile

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#
2+
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
3+
#
4+
# PLEASE DO NOT EDIT IT DIRECTLY.
5+
#
6+
7+
FROM debian:bookworm-slim
8+
9+
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
10+
RUN groupadd --system --gid 11211 memcache && useradd --system --gid memcache --uid 11211 memcache
11+
12+
# ensure SASL's "libplain.so" is installed as per https://github.com/memcached/memcached/wiki/SASLHowto
13+
RUN set -eux; \
14+
apt-get update; \
15+
apt-get install -y --no-install-recommends \
16+
libsasl2-modules \
17+
; \
18+
rm -rf /var/lib/apt/lists/*
19+
20+
ENV MEMCACHED_VERSION 1.6.22
21+
ENV MEMCACHED_DOWNLOAD_URL https://memcached.org/files/memcached-1.6.22.tar.gz
22+
ENV MEMCACHED_SHA1 7a691f390d59616dbebfc9e2e4942d499c39a338
23+
24+
RUN set -x \
25+
\
26+
&& savedAptMark="$(apt-mark showmanual)" \
27+
&& apt-get update \
28+
&& apt-get install -y --no-install-recommends \
29+
ca-certificates \
30+
dpkg-dev \
31+
gcc \
32+
libc6-dev \
33+
libevent-dev \
34+
libio-socket-ssl-perl \
35+
libsasl2-dev \
36+
libssl-dev \
37+
make \
38+
perl \
39+
wget \
40+
&& rm -rf /var/lib/apt/lists/* \
41+
\
42+
&& wget -O memcached.tar.gz "$MEMCACHED_DOWNLOAD_URL" \
43+
&& echo "$MEMCACHED_SHA1 memcached.tar.gz" | sha1sum -c - \
44+
&& mkdir -p /usr/src/memcached \
45+
&& tar -xzf memcached.tar.gz -C /usr/src/memcached --strip-components=1 \
46+
&& rm memcached.tar.gz \
47+
\
48+
&& cd /usr/src/memcached \
49+
\
50+
&& gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \
51+
&& enableExtstore="$( \
52+
# https://github.com/docker-library/memcached/pull/38
53+
case "$gnuArch" in \
54+
# https://github.com/memcached/memcached/issues/381 "--enable-extstore on s390x (IBM System Z mainframe architecture) fails tests"
55+
s390x-*) ;; \
56+
*) echo '--enable-extstore' ;; \
57+
esac \
58+
)" \
59+
&& ./configure \
60+
--build="$gnuArch" \
61+
--enable-sasl \
62+
--enable-sasl-pwdb \
63+
--enable-tls \
64+
$enableExtstore \
65+
&& nproc="$(nproc)" \
66+
&& make -j "$nproc" \
67+
\
68+
# see https://github.com/docker-library/memcached/pull/54#issuecomment-562797748 and https://bugs.debian.org/927461 for why we have to munge openssl.cnf
69+
&& sed -i.bak 's/SECLEVEL=2/SECLEVEL=1/g' /etc/ssl/openssl.cnf \
70+
&& make test PARALLEL="$nproc" \
71+
&& mv /etc/ssl/openssl.cnf.bak /etc/ssl/openssl.cnf \
72+
\
73+
&& make install \
74+
\
75+
&& cd / && rm -rf /usr/src/memcached \
76+
\
77+
&& apt-mark auto '.*' > /dev/null \
78+
&& apt-mark manual $savedAptMark > /dev/null \
79+
&& find /usr/local -type f -executable -exec ldd '{}' ';' \
80+
| awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); print so }' \
81+
| sort -u \
82+
| xargs -r dpkg-query --search \
83+
| cut -d: -f1 \
84+
| sort -u \
85+
| xargs -r apt-mark manual \
86+
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
87+
\
88+
&& memcached -V
89+
90+
COPY docker-entrypoint.sh /usr/local/bin/
91+
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
92+
ENTRYPOINT ["docker-entrypoint.sh"]
93+
94+
USER memcache
95+
EXPOSE 11211
96+
CMD ["memcached"]
File renamed without changes.

alpine/Dockerfile renamed to Dockerfile-alpine.template

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
FROM alpine:3.18
1+
FROM alpine:{{ env.variant | ltrimstr("alpine") }}
22

33
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
44
RUN addgroup -g 11211 memcache && adduser -D -u 11211 -G memcache memcache
55

66
# ensure SASL's "libplain.so" is installed as per https://github.com/memcached/memcached/wiki/SASLHowto
77
RUN apk add --no-cache libsasl
88

9-
ENV MEMCACHED_VERSION 1.6.22
10-
ENV MEMCACHED_SHA1 7a691f390d59616dbebfc9e2e4942d499c39a338
9+
ENV MEMCACHED_VERSION {{ .version }}
10+
ENV MEMCACHED_DOWNLOAD_URL {{ .downloadUrl }}
11+
ENV MEMCACHED_SHA1 {{ .sha1 }}
1112

1213
RUN set -x \
1314
\
@@ -26,7 +27,7 @@ RUN set -x \
2627
perl-io-socket-ssl \
2728
perl-utils \
2829
\
29-
&& wget -O memcached.tar.gz "https://memcached.org/files/memcached-$MEMCACHED_VERSION.tar.gz" \
30+
&& wget -O memcached.tar.gz "$MEMCACHED_DOWNLOAD_URL" \
3031
&& echo "$MEMCACHED_SHA1 memcached.tar.gz" | sha1sum -c - \
3132
&& mkdir -p /usr/src/memcached \
3233
&& tar -xzf memcached.tar.gz -C /usr/src/memcached --strip-components=1 \

debian/Dockerfile renamed to Dockerfile-debian.template

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM debian:bookworm-slim
1+
FROM debian:{{ env.variant }}-slim
22

33
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
44
RUN groupadd --system --gid 11211 memcache && useradd --system --gid memcache --uid 11211 memcache
@@ -11,8 +11,9 @@ RUN set -eux; \
1111
; \
1212
rm -rf /var/lib/apt/lists/*
1313

14-
ENV MEMCACHED_VERSION 1.6.22
15-
ENV MEMCACHED_SHA1 7a691f390d59616dbebfc9e2e4942d499c39a338
14+
ENV MEMCACHED_VERSION {{ .version }}
15+
ENV MEMCACHED_DOWNLOAD_URL {{ .downloadUrl }}
16+
ENV MEMCACHED_SHA1 {{ .sha1 }}
1617

1718
RUN set -x \
1819
\
@@ -32,7 +33,7 @@ RUN set -x \
3233
wget \
3334
&& rm -rf /var/lib/apt/lists/* \
3435
\
35-
&& wget -O memcached.tar.gz "https://memcached.org/files/memcached-$MEMCACHED_VERSION.tar.gz" \
36+
&& wget -O memcached.tar.gz "$MEMCACHED_DOWNLOAD_URL" \
3637
&& echo "$MEMCACHED_SHA1 memcached.tar.gz" | sha1sum -c - \
3738
&& mkdir -p /usr/src/memcached \
3839
&& tar -xzf memcached.tar.gz -C /usr/src/memcached --strip-components=1 \

apply-templates.sh

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env bash
2+
set -Eeuo pipefail
3+
4+
[ -f versions.json ] # run "versions.sh" first
5+
6+
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
7+
8+
jqt='.jq-template.awk'
9+
if [ -n "${BASHBREW_SCRIPTS:-}" ]; then
10+
jqt="$BASHBREW_SCRIPTS/jq-template.awk"
11+
elif [ "$BASH_SOURCE" -nt "$jqt" ]; then
12+
# https://github.com/docker-library/bashbrew/blob/master/scripts/jq-template.awk
13+
wget -qO "$jqt" 'https://github.com/docker-library/bashbrew/raw/9f6a35772ac863a0241f147c820354e4008edf38/scripts/jq-template.awk'
14+
fi
15+
16+
if [ "$#" -eq 0 ]; then
17+
versions="$(jq -r 'keys | map(@sh) | join(" ")' versions.json)"
18+
eval "set -- $versions"
19+
fi
20+
21+
generated_warning() {
22+
cat <<-EOH
23+
#
24+
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
25+
#
26+
# PLEASE DO NOT EDIT IT DIRECTLY.
27+
#
28+
29+
EOH
30+
}
31+
32+
for version; do
33+
export version
34+
35+
if [ -d "$version" ]; then
36+
rm -rf "$version"
37+
fi
38+
39+
if jq -e '.[env.version] | not' versions.json > /dev/null; then
40+
echo "skipping $version ..."
41+
continue
42+
fi
43+
44+
variants="$(jq -r '.[env.version].variants | map(@sh) | join(" ")' versions.json)"
45+
eval "variants=( $variants )"
46+
47+
for variant in "${variants[@]}"; do
48+
export variant
49+
50+
echo "processing $version/$variant ..."
51+
52+
dir="$version${variant:+/$variant}"
53+
54+
mkdir -p "$dir"
55+
56+
cp -f docker-entrypoint.sh "$dir/"
57+
58+
case "$variant" in
59+
alpine*)
60+
template='Dockerfile-alpine.template'
61+
sed -i -e 's/gosu/su-exec/g' "$dir/docker-entrypoint.sh"
62+
;;
63+
*)
64+
template='Dockerfile-debian.template'
65+
;;
66+
esac
67+
68+
{
69+
generated_warning
70+
gawk -f "$jqt" "$template"
71+
} > "$dir/Dockerfile"
72+
done
73+
done

docker-entrypoint.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# first arg is `-f` or `--some-option`
5+
if [ "${1#-}" != "$1" ]; then
6+
set -- memcached "$@"
7+
fi
8+
9+
exec "$@"

0 commit comments

Comments
 (0)